@appilots/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +96 -0
- package/dist/cli/index.js +4178 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.mts +891 -0
- package/dist/index.d.ts +891 -0
- package/dist/index.js +3109 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +3070 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ast/parse.ts","../src/ast/jsx/attributes.ts","../src/ast/jsx/classify.ts","../src/ast/functions/collect.ts","../src/ast/functions/analyze-async.ts","../src/ast/navigation/calls.ts","../src/extractors/appilots/jsdoc.ts","../src/analyzers/ScreenAnalyzer.ts","../src/analyzers/NavigationAnalyzer.ts","../src/analyzers/ComponentAnalyzer.ts","../src/analyzers/FormAnalyzer.ts","../src/pipeline/enrichment.ts","../src/generators/MCPGenerator.ts","../src/config/index.ts","../src/pipeline/metadata-lint.ts","../src/services/api-client.ts"],"names":["t","traverse","t2","t3","t4","path","handler","DESTRUCTIVE_VERB","basename","fs","glob","t5","parser2","t6","readFileSync","parser3","t7","path3","filePath"],"mappings":";;;;;;;;;;;;AAGO,IAAM,sBAAA,GAAyC;AAAA,EACpD,KAAA;AAAA,EACA,YAAA;AAAA,EACA,CAAC,YAAA,EAAc,EAAE,sBAAA,EAAwB,MAAM,CAAA;AAAA,EAC/C,iBAAA;AAAA,EACA,CAAC,kBAAA,EAAoB,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,EAC5C,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,wBAAA;AAAA,EACA,qBAAA;AAAA,EACA,CAAC,gBAAA,EAAkB,EAAE,UAAA,EAAY,QAAQ;AAC3C,CAAA;AAEO,SAAS,WAAA,CAAY,MAAA,EAAgB,aAAA,GAAgC,EAAC,EAAW;AACtF,EAAA,OAAO,MAAM,MAAA,EAAQ;AAAA,IACnB,UAAA,EAAY,QAAA;AAAA,IACZ,OAAA,EAAS,CAAC,GAAG,sBAAA,EAAwB,GAAG,aAAa;AAAA,GACtD,CAAA;AACH;ACnBO,SAAS,gBAAA,CACd,SACA,IAAA,EAC4B;AAC5B,EAAA,OAAO,QAAQ,UAAA,CAAW,IAAA;AAAA,IACxB,CAAC,IAAA,KACGA,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,IAAOA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS;AAAA,GACjF;AACF;AAEO,SAAS,aAAA,CACd,SACA,IAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA;AAC3C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,OAAO,OAAO,MAAA;AACjC,EAAA,IAAMA,2BAAgB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAK,KAAA,CAAM,KAAA;AACrD,EAAA,IAAMA,UAAA,CAAA,wBAAA,CAAyB,KAAK,KAAK,CAAA,IAAOA,2BAAgB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AACtF,IAAA,OAAO,IAAA,CAAK,MAAM,UAAA,CAAW,KAAA;AAAA,EAC/B;AACA,EAAA,OAAO,MAAA;AACT;AAmBO,SAAS,2BAAA,CACd,SACA,IAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA;AAC3C,EAAA,IAAI,CAAC,MAAM,KAAA,IAAS,CAAGA,oCAAyB,IAAA,CAAK,KAAK,GAAG,OAAO,MAAA;AACpE,EAAA,OAASA,UAAA,CAAA,YAAA,CAAa,KAAK,KAAA,CAAM,UAAU,IAAI,IAAA,CAAK,KAAA,CAAM,WAAW,IAAA,GAAO,MAAA;AAC9E;AAoBO,SAAS,eAAA,CAAgB,SAA8B,IAAA,EAAuB;AACnF,EAAA,OAAO,OAAA,CAAQ,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAC,CAAA;AAChD;;;ACrDA,IAAM,eAAA,uBAAsB,GAAA,CAAI,CAAC,QAAQ,YAAA,EAAc,cAAA,EAAgB,sBAAsB,CAAC,CAAA;AAC9F,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,OAAA,EAAS,UAAU,CAAC,CAAA;AACnE,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,kBAAA,EAAoB,WAAA,EAAa,QAAQ,CAAC,CAAA;AAC7E,IAAM,eAAA,uBAAsB,GAAA,CAAI,CAAC,YAAY,aAAA,EAAe,iBAAA,EAAmB,WAAW,CAAC,CAAA;AAC3F,IAAM,mCAAmB,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,aAAa,CAAC,CAAA;AAElD,SAAS,oBAAA,CACd,MACA,OAAA,EACuB;AACvB,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,MAAA;AACtC,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,OAAA;AACvC,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,IAAI,iCAAA,CAAkC,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,QAAA;AACzD,EAAA,IAAI,2BAAA,CAA4B,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,QAAA;AACnD,EAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,OAAA;AACvC,EAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,QAAA;AAExC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,OAAA,EAAS,SAAS,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,OAAA,EAAS,OAAO,CAAA;AACjD,IAAA,MAAM,aAAa,eAAA,CAAgB,OAAA,EAAS,SAAS,CAAA,IAAK,eAAA,CAAgB,SAAS,UAAU,CAAA;AAC7F,IAAA,MAAM,WAAA,GACJ,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA,IACnC,eAAA,CAAgB,OAAA,EAAS,eAAe,CAAA,IACxC,eAAA,CAAgB,OAAA,EAAS,cAAc,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,OAAA,EAAS,SAAS,CAAA;AAErD,IAAA,IAAI,UAAA,KAAe,QAAA,IAAY,WAAA,CAAA,EAAc,OAAO,QAAA;AACpD,IAAA,IAAI,UAAA,IAAc,aAAa,OAAO,QAAA;AACtC,IAAA,IAAI,WAAA,KAAgB,gBAAgB,OAAA,EAAS,OAAO,KAAK,eAAA,CAAgB,OAAA,EAAS,aAAa,CAAA,CAAA,EAAI;AACjG,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,YAAY,OAAO,QAAA;AACvB,IAAA,IAAI,cAAc,OAAA,EAAS,SAAS,KAAK,2BAAA,CAA4B,OAAA,EAAS,SAAS,CAAA,EAAG;AACxF,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,MAAA;AACtC,EAAA,OAAO,QAAA;AACT;ACxDO,SAAS,iBAAiB,GAAA,EAAsC;AACrE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAwB;AAE7C,EAAAC,SAAA,CAAS,GAAA,EAAK;AAAA,IACZ,mBAAA,EAAqB,CAAC,QAAA,KAAa;AACjC,MAAA,IAAI,QAAA,CAAS,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AAAA,IAC/E,CAAA;AAAA,IACA,kBAAA,EAAoB,CAAC,QAAA,KAAa;AAChC,MAAA,IAAI,CAAGC,UAAA,CAAA,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG;AACvC,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,IAAA;AAC3B,MAAA,IAAMA,UAAA,CAAA,yBAAA,CAA0B,IAAI,CAAA,IAAOA,UAAA,CAAA,oBAAA,CAAqB,IAAI,CAAA,EAAG;AACrE,QAAA,QAAA,CAAS,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAA,CAAG,MAAM,IAAI,CAAA;AAAA,MAC1C;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,OAAO,QAAA;AACT;ACLA,IAAM,gBAAA,GACJ,sFAAA;AAEK,SAAS,wBACd,IAAA,EACA,EAAA,EACA,UACA,IAAA,mBAAO,IAAI,KAAY,EACL;AAClB,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClB,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB,EAAE,eAAA,EAAiB,MAAA,EAAO;AAAA,MAC5C,WAAA,EAAa,KAAA;AAAA,MACb,0BAAA,EAA4B;AAAA,KAC9B;AAAA,EACF;AACA,EAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAEb,EAAA,IAAI,QAAA,GAAW,GAAG,KAAA,KAAU,IAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,0BAAA,GAA6B,KAAA;AACjC,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AAC5C,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAY;AAE7C,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA2B;AAC9C,IAAA,IAAMC,UAAA,CAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA,IAAOA,wBAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC7E,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA;AACpC,MAAA,IAAI,WAAW,MAAA,IAAU,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,WAAW,OAAA,GAAU,IAAA;AAC/E,MAAA,IACIA,wBAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,IACjC,KAAK,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,YAAA,IAC5B,CAAC,UAAA,EAAY,MAAA,EAAQ,SAAS,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAC/C;AACA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACjC,QAAA,IAAMA,UAAA,CAAA,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC/B,UAAA,YAAA,GAAe,QAAA,CAAS,KAAA;AACxB,UAAA,aAAA,GAAgB,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,QAC/D;AAAA,MACF;AACA,MAAA,IACIA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,IACjC,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,YAAA,IAC5B,MAAA,KAAW,QAAA,EACX;AACA,QAAA,aAAA,GAAgB,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,uCAAA,EAAwC;AAAA,MACzF;AACA,MAAA,IAAMA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,IAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,OAAA,IAAW,MAAA,KAAW,OAAA,EAAS;AACnG,QAAA,0BAAA,GAA6B,IAAA;AAAA,MAC/B;AACA,MAAA,IACIA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,IACjC,gCAAA,CAAiC,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAC7D;AACA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACjC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAClC,QAAA,MAAM,IAAA,GAASA,UAAA,CAAA,eAAA,CAAgB,SAAS,CAAA,GACpC,SAAA,CAAU,QACRA,UAAA,CAAA,eAAA,CAAgB,QAAQ,CAAA,GACxB,QAAA,CAAS,KAAA,GACT,MAAA;AACN,QAAA,MAAM,MAAA,GAA2B,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,IAAA,EAAK;AACpE,QAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,MAAM,CAAA,IAAQA,UAAA,CAAA,eAAA,CAAgB,QAAQ,CAAA,IAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAI;AACzG,UAAA,aAAA,GAAgB,MAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,aAAA,GAAgB,aAAA,IAAiB,MAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAMA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,EAAG;AAC/B,MAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,IAAA;AAC/B,MAAA,IAAI,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA,EAAG;AAChC,QAAA,cAAA,GAAiB,IAAA;AACjB,QAAA,MAAM,SAAA,GAAY,kBAAkB,UAAU,CAAA;AAC9C,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACjC,QAAA,IAAI,SAAA,IAAeA,UAAA,CAAA,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC7C,UAAA,IAAI,gDAAA,CAAiD,IAAA,CAAK,SAAS,CAAA,EAAG;AACpE,YAAA,oBAAA,CAAqB,IAAI,SAAS,CAAA;AAAA,UACpC;AACA,UAAA,IAAI,SAAS,KAAA,KAAU,IAAA,IAAQ,CAAC,gDAAA,CAAiD,IAAA,CAAK,SAAS,CAAA,EAAG;AAChG,YAAA,UAAA,GAAa,UAAA,IAAc,SAAA;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,UAAU,CAAA,EAAG,WAAA,GAAc,IAAA;AAErD,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACtC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,UAAA,EAAY,MAAA,EAAQ,UAAU,IAAI,CAAA;AAC7E,QAAA,QAAA,GAAW,QAAA,IAAY,UAAA,CAAW,gBAAA,CAAiB,cAAA,KAAmB,IAAA;AACtE,QAAA,0BAAA,KAA+B,UAAA,CAAW,0BAAA;AAC1C,QAAA,WAAA,KAAgB,UAAA,CAAW,WAAA;AAC3B,QAAA,YAAA,GAAe,gBAAgB,UAAA,CAAW,YAAA;AAC1C,QAAA,aAAA,GAAgB,iBAAiB,UAAA,CAAW,aAAA;AAC5C,QAAA,aAAA,GAAgB,iBAAiB,UAAA,CAAW,aAAA;AAC5C,QAAA,UAAA,GAAa,cAAc,UAAA,CAAW,UAAA;AACtC,QAAA,KAAA,MAAW,OAAA,IAAW,UAAA,CAAW,oBAAA,IAAwB,EAAC,EAAG;AAC3D,UAAA,oBAAA,CAAqB,IAAI,OAAO,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAiB;AACpC,IAAA,IAAMA,UAAA,CAAA,iBAAA,CAAkB,IAAI,CAAA,EAAG,QAAA,GAAW,IAAA;AAC1C,IAAA,IAAMA,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG,WAAA,CAAY,IAAI,CAAA;AAC9C,IAAA,IAAMA,UAAA,CAAA,kBAAA,CAAmB,IAAI,CAAA,IAAOA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,IAAK,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5G,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,GAAG,IAAA,EAAM;AACX,IAAAF,SAAAA,CAAS,GAAG,IAAA,EAAa;AAAA,MACvB,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,CAAC,QAAA,KAAkB,WAAA,CAAY,SAAS,IAAI;AAAA,KAC7C,CAAA;AAAA,EACV;AAEA,EAAA,MAAM,eAAA,GAA6D,YAAA,GAC/D,YAAA,GACA,aAAA,EAAe,SAAS,QAAA,GACtB,YAAA,GACA,cAAA,IAAkB,aAAA,EAAe,SAAS,OAAA,IAAW,UAAA,GACnD,iBAAA,GACA,QAAA,IAAY,UACV,OAAA,GACA,MAAA;AAEV,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB;AAAA,MAChB,cAAA,EAAgB,YAAY,OAAA,IAAW,MAAA;AAAA,MACvC,eAAA;AAAA,MACA,GAAI,oBAAA,CAAqB,IAAA,GAAO,CAAA,GAC5B,EAAE,oBAAA,EAAsB,KAAA,CAAM,IAAA,CAAK,oBAAoB,CAAA,CAAE,IAAA,EAAK,KAC9D;AAAC,KACP;AAAA,IACA,WAAA;AAAA,IACA,0BAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,oBAAA,EAAsB,KAAA,CAAM,IAAA,CAAK,oBAAoB,EAAE,IAAA;AAAK,GAC9D;AACF;AAEA,SAAS,kBAAkB,UAAA,EAAwC;AACjE,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAClD;ACjKO,SAAS,uBAAuB,GAAA,EAAwC;AAC7E,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAAA,UAAS,GAAA,EAAY;AAAA,IACnB,OAAA,EAAS,CAAGG,UAAA,CAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACtB,cAAA,EAAgB,CAAC,QAAA,KAAkB;AACjC,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,MAAA,IACE,CAAGA,8BAAmB,IAAA,CAAK,MAAM,KACjC,CAAGA,UAAA,CAAA,YAAA,CAAa,KAAK,MAAA,CAAO,MAAM,KAClC,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,KAAS,YAAA,IAC5B,CAAGA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EACpC;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA;AACpC,MAAA,IAAI,CAAC,CAAC,UAAA,EAAY,MAAA,EAAQ,WAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AACjE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACjC,MAAA,MAAM,YAAA,GAAiBA,UAAA,CAAA,eAAA,CAAgB,QAAQ,CAAA,GAAI,SAAS,KAAA,GAAQ,MAAA;AACpE,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,MAAA;AAAA,QACA,GAAI,YAAA,GAAe,EAAE,YAAA,KAAiB,EAAC;AAAA,QACvC,MAAA,EAAQ,uBAAA,CAAwB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC;AAAA,OAClD,CAAA;AAAA,IACH;AAAA,GACM,CAAA;AACR,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,wBAAwB,GAAA,EAAwD;AAC9F,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,IAAI,CAAC,GAAA,IAAO,CAAGA,UAAA,CAAA,kBAAA,CAAmB,GAAG,GAAG,OAAO,MAAA;AAC/C,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,UAAA,EAAY;AACjC,IAAA,IAAI,CAAGA,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC/B,IAAA,MAAM,GAAA,GAAQA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAG,IAC/B,IAAA,CAAK,GAAA,CAAI,IAAA,GACPA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,GACxB,IAAA,CAAK,IAAI,KAAA,GACT,MAAA;AACN,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IACIA,UAAA,CAAA,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAC7BA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,IAC9BA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAClC;AACA,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,IACrE,CAAA,MAAA,IAAaA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG;AACrC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,IAC3B,CAAA,MAAA,IAAaA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AACxC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;AC3DO,SAAS,4BACd,MAAA,EACwC;AACxC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,YAAY,GAAG,OAAO,MAAA;AAE3C,EAAA,MAAM,SAAqC,EAAC;AAC5C,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,MAAM,MAAA,GAAS,mCAAA;AACf,EAAA,IAAI,CAAA;AACJ,EAAA,OAAQ,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAI;AAChC,IAAA,MAAM,OAAA,GAAA,CAAW,EAAE,CAAC,CAAA,IAAK,IAAI,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,IAAA,EAAK;AAC3D,IAAA,MAAM,MAAA,GAAS,oBAAoB,OAAO,CAAA;AAC1C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAC5B,MAAA,OAAA,GAAU,IAAA;AACV,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA,EAAG;AAClC,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAEA,EAAA,MAAM,SAAA,GAAY,sCAAA;AAClB,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAC1C,EAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,CAAC,CAAA,EAAG;AACnC,IAAA,MAAM,MAAM,YAAA,CAAa,CAAC,EACvB,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CACvB,KAAA,CAAM,QAAQ,CAAA,CACd,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,MAAA,CAAO,cAAA,GAAiB,GAAA;AACxB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,OAAO,UAAU,MAAA,GAAS,MAAA;AAC5B;AAEO,SAAS,+BACd,MAAA,EAC+B;AAC/B,EAAA,IAAI,CAAC,yBAAA,CAA0B,IAAA,CAAK,MAAM,GAAG,OAAO,MAAA;AAEpD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,MAAM,EAAA,GAAK,mCAAA;AACX,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,CAAA;AACJ,EAAA,OAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,MAAM,CAAA,EAAI;AAC5B,IAAA,MAAM,IAAA,GAAA,CAAQ,EAAE,CAAC,CAAA,IAAK,IAAI,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,CAAE,IAAA,EAAK;AACxD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,QAAA,GAAW,IAAA;AACX,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,EAAG;AAC1E,MAAA,GAAA,CAAI,IAAI,EAAE,CAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG,OAAO,WAAW,GAAA,GAAM,MAAA;AAC5C,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,oBAAoB,IAAA,EAAiD;AAC5E,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAChC,MAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,QAAA,OAAO,0BAA0B,GAA8B,CAAA;AAAA,MACjE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC1C,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,CAAA,IAAK,CAAA,KAAM,MAAA,EAAW;AAC3B,IAAA,MAAM,GAAA,GAAM,EAAE,IAAA,EAAK;AACnB,IAAA,MAAM,QAAQ,CAAA,CAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,EAAQ,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA;AAAA,SAAA,IACxB,KAAA,KAAU,OAAA,EAAS,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,SAClC,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EAClB;AACA,EAAA,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA,CAAE,SAAS,CAAA,GAAI,yBAAA,CAA0B,GAAG,CAAA,GAAI,IAAA;AACxE;AAEA,SAAS,0BACP,GAAA,EAC4B;AAC5B,EAAA,MAAM,MAAkC,EAAC;AACzC,EAAA,IACE,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,KAC1B,GAAA,CAAI,WAAA,KAAgB,MAAA,IAAU,GAAA,CAAI,WAAA,KAAgB,OAAA,IAAW,GAAA,CAAI,WAAA,KAAgB,MAAA,CAAA,EAClF;AACA,IAAA,GAAA,CAAI,cAAc,GAAA,CAAI,WAAA;AAAA,EACxB;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,oBAAA,KAAyB,SAAA,EAAW;AACjD,IAAA,GAAA,CAAI,uBAAuB,GAAA,CAAI,oBAAA;AAAA,EACjC;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,KAAA,KAAU,SAAA,EAAW;AAClC,IAAA,GAAA,CAAI,QAAQ,GAAA,CAAI,KAAA;AAAA,EAClB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,EAAG;AACrC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,CAAC,CAAC,CAAA;AACtF,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,cAAA,GAAiB,GAAA;AAAA,EAC3C;AACA,EAAA,OAAO,GAAA;AACT;;;ACxEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,MAAA;AAAA,EACA,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,OAAA,KAAY,MAAA;AAAA;AAAA,EAElC,aAAA;AAAA;AAAA,EAEA,cAAA;AAAA;AAAA,EAED,kBAAA,GAAqB,CAAA;AAAA,EAE5B,WAAA,CACE,QACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,SAAS,aAAA,IAAiB,KAAA;AAC/C,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,cAAA,IAAkB;AAAA,MAC/C,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAA,GAAuC;AAC3C,IAAA,MAAM,EAAE,OAAA,GAAU,CAAC,yBAAyB,CAAA,EAAG,UAAU,CAAC,iBAAiB,CAAA,EAAE,GAAI,IAAA,CAAK,MAAA;AAEtF,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,6CAA6C,OAAO,CAAA;AAChE,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uDAAA,CAAA,EAAsD,IAAA,CAAK,cAAc,CAAA;AAAA,MACvF;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,EAAS;AAAA,MAChC,GAAA,EAAK,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,KAAA,CAAM,MAAM,CAAA,MAAA,CAAQ,CAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,kBAAA,GAAyC,IAAA;AAC7C,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB;AAAA,QAC9C,GAAA,EAAK,KAAK,MAAA,CAAO,OAAA;AAAA,QACjB,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,kBAAA,GAAqB,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAMC,cAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAC,CAAC,CAAC,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAE1B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,WAAWA,cAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,SAAS,IAAI,CAAA;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAClD,QAAA,IAAI,CAAC,UAAA,EAAY;AAIjB,QAAA,IAAI,KAAK,aAAA,EAAe;AACtB,UAAA,MAAM,iBAAA,GAAqB,WAAmB,mBAAA,KAAwB,IAAA;AACtE,UAAA,MAAM,cAAA,GAAiB,kBAAA,EAAoB,GAAA,CAAI,QAAQ,CAAA,IAAK,KAAA;AAE5D,UAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,cAAA,EAAgB;AACzC,YAAA,IAAA,CAAK,kBAAA,EAAA;AACL,YAAA,IAAI,KAAK,OAAA,EAAS;AAChB,cAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2CAAA,EAAyC,IAAI,CAAA,CAAE,CAAA;AAAA,YAC7D;AACA,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AACvB,QAAA,IAAI,KAAK,OAAA,EAAS;AAChB,UAAA,OAAA,CAAQ,IAAI,CAAA,kCAAA,EAAgC,UAAA,CAAW,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,QACzE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,KAAK,OAAA,EAAS;AAChB,UAAA,OAAA,CAAQ,IAAA,CAAK,oCAAoC,IAAI,CAAA,CAAA,CAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,QAC1G;AAAA,MAEF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,aAAA,EAAe;AACtC,MAAA,OAAA,CAAQ,IAAI,CAAA,8BAAA,EAAiC,OAAA,CAAQ,MAAM,CAAA,WAAA,EAAc,IAAA,CAAK,kBAAkB,CAAA,aAAA,CAAe,CAAA;AAAA,IACjH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,YAAY,QAAA,EAAoD;AACpE,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AAClD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAI5C,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,MAAA,EAAQ,IAAA,CAAK,OAAO,aAAoB,CAAA;AAGhE,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,6BAAA,CAA8B,GAAG,CAAA;AAGjE,IAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,wBAAA,CAAyB,GAAG,CAAA;AAG/D,IAAsB,IAAA,CAAK,2BAAA,CAA4B,GAAG;AAG1D,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,wBAAA,CAAyB,GAAG,CAAA;AAI3D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,kBAAA,EAAoB,KAAA,IAAS,EAAC,EAAG,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAGrF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAA;AAG7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,EAAK,kBAAkB,CAAA;AAK3D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AAM/C,IAAA,MAAM,oBAAA,GAAuB,4BAA4B,MAAM,CAAA;AAM/D,IAAA,MAAM,eAAA,GAAkB,+BAA+B,MAAM,CAAA;AAC7D,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,oBAAoB,GAAA,IAAO,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AAC7D,UAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,oBAAoB,IAAA,IAAQ,IAAA;AAAA,MAClC,QAAA;AAAA,MACA,OAAO,kBAAA,EAAoB,KAAA;AAAA,MAC3B,aAAa,kBAAA,EAAoB,WAAA;AAAA,MACjC,UAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,iBAAA;AAAA,MACA,GAAI,WAAA,CAAY,MAAA,GAAS,IAAI,EAAE,WAAA,KAAgB,EAAC;AAAA,MAChD,GAAI,kBAAA,EAAoB,gBAAA,IAAoB,kBAAA,CAAmB,gBAAA,CAAiB,MAAA,GAAS,CAAA,GACrF,EAAE,gBAAA,EAAkB,kBAAA,CAAmB,gBAAA,EAAiB,GACxD,EAAC;AAAA,MACL,GAAI,oBAAA,GACA;AAAA,QACE,WAAA,EAAa,oBAAA;AAAA,QACb,GAAI,oBAAA,CAAqB,KAAA,GAAQ,EAAE,KAAA,EAAO,IAAA,KAAS;AAAC,UAEtD;AAAC,KACP;AAGA,IAAC,WAAmB,mBAAA,GAAsB,qBAAA;AAE1C,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,GAAA,EAA+B;AAC9D,IAAA,IAAI,KAAA,GAAQ,KAAA;AAEZ,IAAAJ,UAAS,GAAA,EAAK;AAAA,MACZ,cAAA,EAAgB,CAAC,QAAA,KAAa;AAC5B,QAAA,IAAI,KAAA,EAAO;AACX,QAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAE7B,QAAA,IACc,wBAAa,MAAM,CAAA,IAAK,MAAA,CAAO,IAAA,KAAS,oBACxC,UAAA,CAAA,kBAAA,CAAmB,MAAM,CAAA,IACxB,UAAA,CAAA,YAAA,CAAa,OAAO,QAAQ,CAAA,IACvC,MAAA,CAAO,QAAA,CAAS,SAAS,gBAAA,EAC3B;AACA,UAAA,KAAA,GAAQ,IAAA;AACR,UAAA,QAAA,CAAS,IAAA,EAAK;AAAA,QAChB;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,8BACN,GAAA,EACqD;AACrD,IAAA,IAAI,QAAA,GAAgE,IAAA;AAEpE,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,cAAA,EAAgB,CAAC,QAAA,KAAa;AAC5B,QAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAG7B,QAAA,IACc,wBAAa,MAAM,CAAA,IAAK,MAAA,CAAO,IAAA,KAAS,oBACxC,UAAA,CAAA,kBAAA,CAAmB,MAAM,CAAA,IACxB,UAAA,CAAA,YAAA,CAAa,OAAO,QAAQ,CAAA,IACvC,MAAA,CAAO,QAAA,CAAS,SAAS,gBAAA,EAC3B;AAEA,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACrC,UAAA,IAAe,UAAA,CAAA,kBAAA,CAAmB,GAAG,CAAA,EAAG;AACtC,YAAA,QAAA,GAAW,IAAA,CAAK,0BAA0B,GAAG,CAAA;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,0BACN,OAAA,EAC8C;AAC9C,IAAA,MAAM,MAAA,GAAuD;AAAA,MAC3D,IAAA,EAAM,EAAA;AAAA,MACN,SAAS,EAAC;AAAA,MACV,OAAO,EAAC;AAAA,MACR,mBAAmB,EAAC;AAAA,MACpB,YAAY;AAAC,KACf;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,MAAA,IAAI,CAAY,UAAA,CAAA,gBAAA,CAAiB,IAAI,KAAK,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,EAAG;AAC1E,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAiB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAChE,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,IAAe,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACrC,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,QAAA,IAAI,GAAA,KAAQ,MAAA,IAAqB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACvD,UAAA,MAAA,CAAO,OAAO,KAAA,CAAM,KAAA;AAAA,QACtB,CAAA,MAAA,IAAW,GAAA,KAAQ,OAAA,IAAsB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC/D,UAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AAAA,QACvB,CAAA,MAAA,IAAW,GAAA,KAAQ,aAAA,IAA4B,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACrE,UAAA,MAAA,CAAO,cAAc,KAAA,CAAM,KAAA;AAAA,QAC7B,CAAA,MAAA,IAAW,GAAA,KAAQ,SAAA,IAAwB,UAAA,CAAA,iBAAA,CAAkB,KAAK,CAAA,EAAG;AACnE,UAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,QAC/C,CAAA,MAAA,IAAW,GAAA,KAAQ,QAAA,IAAuB,UAAA,CAAA,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAElE,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC1C,UAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,YAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,cACb;AAAA,gBACE,EAAA,EAAI,SAAA;AAAA,gBACJ;AAAA;AACF,aACF;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAW,GAAA,KAAQ,kBAAA,IAAiC,UAAA,CAAA,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAG5E,UAAA,MAAM,UAAoB,EAAC;AAC3B,UAAA,KAAA,MAAW,OAAA,IAAW,MAAM,QAAA,EAAU;AACpC,YAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,OAAO,CAAA,EAAG;AACvC,cAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAK;AACnC,cAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,YAC9C;AAAA,UACF;AACA,UAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,YAAA,MAAA,CAAO,gBAAA,GAAmB,OAAA;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,GAAA,EAAqD;AAC7E,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAI,QAAA,EAAU;AAClC,MAAA,IAAe,UAAA,CAAA,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC1C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAC7C,QAAA,IAAI,OAAO,EAAA,EAAI;AACb,UAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,GAAA,EAAoD;AAC5E,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,EAAA,EAAI,EAAA;AAAA,MACJ,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,UAAA,EAAY;AACjC,MAAA,IAAI,CAAY,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAExC,MAAA,MAAM,MAAiB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAChE,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,MAAA,IAAI,GAAA,KAAQ,IAAA,IAAmB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACrD,QAAA,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA;AAAA,MACpB,CAAA,MAAA,IAAW,GAAA,KAAQ,OAAA,IAAsB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC/D,QAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AAAA,MACvB,CAAA,MAAA,IAAW,GAAA,KAAQ,MAAA,IAAqB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC9D,QAAA,MAAA,CAAO,IAAA,GAAQ,MAAM,KAAA,IAAiB,QAAA;AAAA,MACxC,CAAA,MAAA,IAAW,GAAA,KAAQ,cAAA,IAA6B,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACtE,QAAA,MAAA,CAAO,eAAe,KAAA,CAAM,KAAA;AAAA,MAC9B,CAAA,MAAA,IAAW,GAAA,KAAQ,aAAA,IAA4B,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACrE,QAAA,MAAA,CAAO,cAAc,KAAA,CAAM,KAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,GAAA,KAAQ,SAAA,IAAwB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACjE,QAAA,MAAA,CAAO,UAAU,KAAA,CAAM,KAAA;AAAA,MACzB,CAAA,MAAA,IAAW,GAAA,KAAQ,sBAAA,IAAqC,UAAA,CAAA,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC/E,QAAA,MAAA,CAAO,uBAAuB,KAAA,CAAM,KAAA;AAAA,MACtC,CAAA,MAAA,IAAW,GAAA,KAAQ,aAAA,IAA4B,UAAA,CAAA,gBAAA,CAAiB,KAAK,CAAA,EAAG;AACtE,QAAA,MAAA,CAAO,cAAc,KAAA,CAAM,KAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,GAAA,KAAQ,QAAA,IAAuB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AAChE,QAAA,MAAA,CAAO,SAAS,KAAA,CAAM,KAAA;AAAA,MACxB,CAAA,MAAA,IAAW,GAAA,KAAQ,WAAA,IAA0B,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACnE,QAAA,MAAA,CAAO,YAAY,KAAA,CAAM,KAAA;AAAA,MAC3B,CAAA,MAAA,IAAW,GAAA,KAAQ,4BAAA,IAA2C,UAAA,CAAA,gBAAA,CAAiB,KAAK,CAAA,EAAG;AACrF,QAAA,MAAA,CAAO,6BAA6B,KAAA,CAAM,KAAA;AAAA,MAC5C,CAAA,MAAA,IAAW,GAAA,KAAQ,kBAAA,IAAiC,UAAA,CAAA,kBAAA,CAAmB,KAAK,CAAA,EAAG;AAC7E,QAAA,MAAA,CAAO,gBAAA,GAAmB,IAAA,CAAK,2BAAA,CAA4B,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,4BAA4B,GAAA,EAA0D;AAC5F,IAAA,MAAM,MAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,UAAA,EAAY;AACjC,MAAA,IAAI,CAAY,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACxC,MAAA,MAAM,MAAiB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAChE,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,MAAA,IAAI,GAAA,KAAQ,gBAAA,IAA+B,UAAA,CAAA,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAClE,QAAA,GAAA,CAAI,iBAAiB,KAAA,CAAM,KAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,GAAA,KAAQ,iBAAA,IAAgC,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACzE,QAAA,GAAA,CAAI,kBAAkB,KAAA,CAAM,KAAA;AAAA,MAC9B,CAAA,MAAA,IAAW,GAAA,KAAQ,sBAAA,IAAqC,UAAA,CAAA,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAChF,QAAA,GAAA,CAAI,oBAAA,GAAuB,KAAA,CAAM,QAAA,CAC9B,MAAA,CAAO,CAAC,EAAA,KAAkD,UAAA,CAAA,eAAA,CAAgB,EAAE,CAAC,CAAA,CAC7E,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,KAAK,CAAA;AAAA,MACzB;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,GAAA,EAAwD;AAC/E,IAAA,MAAM,SAAgC,EAAC;AAEvC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAI,QAAA,EAAU;AAClC,MAAA,IAAe,UAAA,CAAA,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC1C,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAC3C,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,GAAA,EAAuD;AAC9E,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,EAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AAEA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,UAAA,EAAY;AACjC,MAAA,IAAI,CAAY,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAExC,MAAA,MAAM,MAAiB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAChE,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,MAAA,IAAI,GAAA,KAAQ,IAAA,IAAmB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACrD,QAAA,KAAA,CAAM,OAAO,KAAA,CAAM,KAAA;AAAA,MACrB,CAAA,MAAA,IAAW,GAAA,KAAQ,OAAA,IAAsB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC/D,QAAA,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA;AAAA,MACtB,CAAA,MAAA,IAAW,GAAA,KAAQ,MAAA,IAAqB,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC9D,QAAA,KAAA,CAAM,IAAA,GAAQ,MAAM,KAAA,IAAiB,MAAA;AAAA,MACvC,CAAA,MAAA,IAAW,GAAA,KAAQ,UAAA,IAAyB,UAAA,CAAA,gBAAA,CAAiB,KAAK,CAAA,EAAG;AACnE,QAAA,KAAA,CAAM,WAAW,KAAA,CAAM,KAAA;AAAA,MACzB,CAAA,MAAA,IAAW,GAAA,KAAQ,aAAA,IAA4B,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG;AACrE,QAAA,KAAA,CAAM,cAAc,KAAA,CAAM,KAAA;AAAA,MAC5B,CAAA,MAAA,IAAW,GAAA,KAAQ,cAAA,IAA6B,UAAA,CAAA,YAAA,CAAa,KAAK,CAAA,EAAG;AACnE,QAAA,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAAA,MACrD,CAAA,MAAA,IAAW,GAAA,KAAQ,SAAA,IAAwB,UAAA,CAAA,iBAAA,CAAkB,KAAK,CAAA,EAAG;AACnE,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,GAAA,EAAqE;AAC7F,IAAA,MAAM,UAA8C,EAAC;AAErD,IAAA,KAAA,MAAW,OAAA,IAAW,IAAI,QAAA,EAAU;AAClC,MAAA,IAAe,UAAA,CAAA,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC1C,QAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,QAAA,IAAI,KAAA,GAAQ,EAAA;AAEZ,QAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,UAAA,IAAI,CAAY,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAExC,UAAA,MAAM,MAAiB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAChE,UAAA,IAAI,CAAC,GAAA,EAAK;AAEV,UAAA,IAAI,GAAA,KAAQ,OAAA,IAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7D,YAAA,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,UACrB,WAAW,GAAA,KAAQ,OAAA,IAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AACpE,YAAA,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,UACrB;AAAA,QACF;AAEA,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,UAAA,CAAW,SAA2B,SAAA,EAA+C;AAC3F,IAAA,MAAM,GAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACnD,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,MAAM;AAAA,KACzB,CAAE,CAAA;AAEF,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,QAAA,GACJ,GAAA,CAAI,IAAA,CAAK,CAAC,SAAA,KAAc,SAAA,CAAU,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA,IAChD,IAAA,CAAK,wBAAA,CAAyB,KAAK,IAAI,CAAA;AACzC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,GAAA,CAAI,KAAK,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG,cAAc,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,YAAY,GAAG,CAAA;AACvG,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,mBAAA,CAAoB,QAAA,CAAS,QAAQ,KAAK,CAAA;AACrE,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,IAAA,CAAK,kBAAA,CAAmB,eAAe,KAAK,CAAA;AAAA,QAC9C,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QAC5B;AAAA,MACF;AACA,MAAA,QAAA,CAAS,eAAe,QAAA,CAAS,YAAA,IAAgB,IAAA,CAAK,iBAAA,CAAkB,KAAK,YAAY,CAAA;AACzF,MAAA,QAAA,CAAS,eAAA,GAAkB,IAAA,CAAK,eAAA,GAC5B,EAAE,GAAG,IAAA,CAAK,eAAA,EAAiB,GAAI,QAAA,CAAS,eAAA,IAAmB,EAAC,KAC5D,QAAA,CAAS,eAAA;AAAA,IACf;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CACN,QACA,QAAA,EACiC;AACjC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU;AAC5B,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,CAAS,IAAA,IAAQ,MAAM,IAAA,KAAS,QAAA,CAAS,MAAM,OAAO,IAAA;AACxE,MAAA,IAAI,KAAA,CAAM,gBAAgB,QAAA,CAAS,YAAA,IAAgB,MAAM,YAAA,KAAiB,QAAA,CAAS,cAAc,OAAO,IAAA;AACxG,MAAA,IAAI,KAAA,CAAM,OAAA,EAAS,EAAA,IAAM,QAAA,CAAS,OAAA,EAAS,EAAA,IAAM,KAAA,CAAM,OAAA,CAAQ,EAAA,KAAO,QAAA,CAAS,OAAA,CAAQ,EAAA,EAAI,OAAO,IAAA;AAClG,MAAA,IAAI,KAAA,CAAM,eAAe,QAAA,CAAS,WAAA,IAAe,MAAM,WAAA,KAAgB,QAAA,CAAS,aAAa,OAAO,IAAA;AACpG,MAAA,IACE,KAAA,CAAM,OAAA,EAAS,kBAAA,IACf,QAAA,CAAS,OAAA,EAAS,kBAAA,IAClB,KAAA,CAAM,OAAA,CAAQ,kBAAA,KAAuB,QAAA,CAAS,OAAA,CAAQ,kBAAA,EACtD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,kBAAkB,YAAA,EAAsD;AAC9E,IAAA,OAAO,YAAA,IAAgB,YAAA,KAAiB,WAAA,GAAc,YAAA,GAAe,MAAA;AAAA,EACvE;AAAA,EAEQ,kBAAA,CAAmB,QAA6B,MAAA,EAAmC;AACzF,IAAA,IAAI,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,IAAI,CAAA,EAAG;AAC3F,MAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,IACvB;AACA,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA;AACtC,IAAA,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA;AAClD,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,EAAS;AACpC,MAAA,MAAA,CAAO,UAAU,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAA,EAAS,OAAO,OAAO,CAAA;AAAA,IACnE;AACA,IAAA,MAAA,CAAO,eAAA,GAAkB,MAAA,CAAO,eAAA,IAAmB,MAAA,CAAO,eAAA;AAC1D,IAAA,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA;AACpD,IAAA,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA;AACpD,IAAA,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,SAAS,MAAA,EAAQ;AACpD,MAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,wBAAA,CACN,OACA,QAAA,EAC4B;AAC5B,IAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEzC,IAAA,IAAI,IAAA;AACJ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,MAAA;AAAA,QAAO,CAAC,KAAA,KACtC,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,QAAQ,KAAK;AAAA,OAC7C,CAAE,MAAA;AACF,MAAA,IAAI,UAAU,CAAA,KAAM,CAAC,IAAA,IAAQ,OAAA,GAAU,KAAK,OAAA,CAAA,EAAU;AACpD,QAAA,IAAA,GAAO,EAAE,MAAM,OAAA,EAAQ;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,EAAM,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAA4B,GAAA,EAA8B;AAChE,IAAA,IAAI,aAAA,GAAgB,EAAA;AAEpB,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,wBAAA,EAA0B,CAAC,QAAA,KAAa;AACtC,QAAA,MAAM,WAAA,GAAc,SAAS,IAAA,CAAK,WAAA;AAElC,QAAA,IAAe,UAAA,CAAA,qBAAA,CAAsB,WAAW,CAAA,IAAK,WAAA,CAAY,IAAI,IAAA,EAAM;AACzE,UAAA,aAAA,GAAgB,YAAY,EAAA,CAAG,IAAA;AAAA,QACjC,CAAA,MAAA,IAAsB,UAAA,CAAA,yBAAA,CAA0B,WAAW,CAAA,EAAG;AAE5D,UAAA,aAAA,GAAgB,WAAA;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,kBAAA,EAAoB,CAAC,QAAA,KAAa;AAChC,QAAA,IACa,UAAA,CAAA,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,EAAE,MAC5B,UAAA,CAAA,yBAAA,CAA0B,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,IAC3C,UAAA,CAAA,oBAAA,CAAqB,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAAA,EACpD;AAEA,UAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,UAAA,IACa,UAAA,CAAA,qBAAA,CAAsB,MAAM,CAAA,IACvC,MAAA,CAAO,YAAY,IAAA,EACnB;AACA,YAAA,aAAA,GAAgB,QAAA,CAAS,KAAK,EAAA,CAAG,IAAA;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,GAAA,EAAgC;AAC/D,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,cAAA,EAAgB,CAAC,QAAA,KAAa;AAC5B,QAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,MAAA;AAG7B,QAAA,IACa,8BAAmB,MAAM,CAAA,IACzB,wBAAa,MAAA,CAAO,MAAM,KACrC,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,YAAA,IACZ,wBAAa,MAAA,CAAO,QAAQ,KACvC,MAAA,CAAO,QAAA,CAAS,SAAS,UAAA,EACzB;AACA,UAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACrC,UAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,GAAG,CAAA,EAAG;AACnC,YAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,EAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,GAAA,EAAwC;AAC3D,IAAA,MAAM,QAA0B,EAAC;AACjC,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAiC;AAEpD,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC/B,QAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAEzB,QAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5C,UAAA,MAAM,aAAA,GAAgB,QAAQ,IAAA,CAAK,IAAA;AAInC,UAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,aAAA,EAAe,OAAO,CAAA;AACxD,UAAA,IAAI,CAAC,SAAS,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AACxD,YAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,4BAAA,CAA6B,OAAO,CAAA;AACvD,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA,EAAI,SAAA;AAAA,QACJ,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ;AAAA,OACnC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAA6B,OAAA,EAA4D;AAC/F,IAAA,MAAM,KAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,EAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,MAAM,gBAA2B,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,KAAK,IAAA,GAAO,EAAA;AACrF,IAAA,MAAM,IAAA,GAAO,aAAA,GAAgB,oBAAA,CAAqB,aAAA,EAAe,OAAO,CAAA,GAAI,QAAA;AAC5E,IAAA,KAAA,CAAM,kBAAkB,aAAA,IAAiB,MAAA;AAEzC,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,MAAA,IAAI,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,EAAG;AAEtC,MAAA,MAAM,WAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAC1E,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1C,UAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,YAAA,KAAA,CAAM,WAAA,GAAc,KAAK,KAAA,CAAM,KAAA;AAAA,UACjC,CAAA,MAAA,IAAW,aAAa,YAAA,EAAc;AACpC,YAAA,KAAA,CAAM,IAAA,GAAO,KAAK,KAAA,CAAM,KAAA;AACxB,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS;AAAA,cAC/C,EAAA,EAAI,KAAK,KAAA,CAAM,KAAA;AAAA,cACf,UAAA,EAAY,KAAK,KAAA,CAAM,KAAA;AAAA,cACvB,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAEhC,YAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,cAAA,KAAA,CAAM,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,yBAAyB,EAAE,CAAA;AAAA,YACnE;AACA,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS;AAAA,cAC/C,EAAA,EAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,cAC7B,MAAA,EAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,cACnB,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,YAAA,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,UAC3B,CAAA,MAAA,IAAW,aAAa,oBAAA,EAAsB;AAC5C,YAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAC3C,YAAA,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS;AAAA,cAC/C,GAAI,KAAA,CAAM,OAAA,EAAS,EAAA,GAAK,EAAC,GAAI,EAAE,EAAA,EAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,cAC1E,kBAAA,EAAoB,KAAK,KAAA,CAAM,KAAA;AAAA,cAC/B,MAAA,EAAQ,KAAA,CAAM,OAAA,EAAS,MAAA,IAAU;AAAA,aAClC,CAAA;AAAA,UACH,CAAA,MAAA,IAAW,aAAa,cAAA,EAAgB;AACtC,YAAA,IAAI,IAAA,CAAK,MAAM,KAAA,KAAU,eAAA,IAAmB,KAAK,KAAA,CAAM,KAAA,KAAU,OAAA,EAAS,KAAA,CAAM,IAAA,GAAO,OAAA;AACvF,YAAA,IAAI,IAAA,CAAK,KAAA,CAAM,KAAA,KAAU,WAAA,QAAmB,IAAA,GAAO,OAAA;AACnD,YAAA,IAAI,IAAA,CAAK,MAAM,KAAA,KAAU,SAAA,IAAa,KAAK,KAAA,CAAM,KAAA,KAAU,YAAA,EAAc,KAAA,CAAM,IAAA,GAAO,QAAA;AAAA,UACxF;AAAA,QACF,CAAA,MAAA,IAAsB,UAAA,CAAA,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA,EAAG;AAE1D,UAAA,IAAI,aAAa,OAAA,IAAsB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAE1E,YAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,cAAA,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA;AAAA,YACrC;AACA,YAAA,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA;AAAA,UAC7C,WAAW,QAAA,KAAa,SAAA,IAAwB,wBAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AACnF,YAAA,IAAI,CAAC,KAAA,CAAM,IAAA,QAAY,IAAA,GAAO,IAAA,CAAK,MAAM,UAAA,CAAW,IAAA;AACpD,YAAA,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA;AAAA,UAC7C,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,YAAA,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,UACrE,WAAW,QAAA,KAAa,UAAA,IAAyB,4BAAiB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AACxF,YAAA,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,KAAA;AAAA,UACzC;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,UAAA,EAAY;AAClC,QAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,KAAA,CAAM,IAAA,GAAO,QAAA;AACpC,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,KAAA,CAAM,IAAA,GAAO,QAAA;AACpC,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,KAAA,CAAM,IAAA,GAAO,MAAA;AAClC,IAAA,IAAI,CAAC,KAAA,CAAM,IAAA,IAAQ,KAAK,uBAAA,CAAwB,KAAA,CAAM,IAAI,CAAA,EAAG;AAC3D,MAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,EAAS,kBAAA,IAAsB,KAAA,CAAM,SAAS,KAAA,CAAM,WAAA;AACxE,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,IAAA,EAAM;AAChC,MAAA,KAAA,CAAM,OAAA,GAAU,EAAE,EAAA,EAAI,KAAA,CAAM,MAAM,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,IAC3E,CAAA,MAAA,IAAW,MAAM,OAAA,IAAW,CAAC,MAAM,OAAA,CAAQ,EAAA,IAAM,MAAM,IAAA,EAAM;AAC3D,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS;AAAA,QAC/C,IAAI,KAAA,CAAM,IAAA;AAAA,QACV,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,IAAU;AAAA,OACjC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,wBAAwB,IAAA,EAAuB;AACrD,IAAA,OAAO,qDAAA,CAAsD,KAAK,IAAI,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,GAAA,EAA6C;AACrE,IAAA,MAAM,aAAoC,EAAC;AAC3C,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC/B,QAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAEzB,QAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5C,UAAA,MAAM,aAAA,GAAgB,QAAQ,IAAA,CAAK,IAAA;AAEnC,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,EAAG;AAC7B,UAAA,IAAA,CAAK,IAAI,aAAa,CAAA;AAEtB,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,aAAa,CAAA;AAClD,UAAA,MAAM,SAAA,GAAiC;AAAA,YACrC,IAAA,EAAM,aAAA;AAAA,YACN;AAAA,WACF;AAGA,UAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,YAAA,IAAI,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,EAAG;AAEtC,YAAA,MAAM,WAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAC1E,YAAA,IAAI,CAAC,QAAA,EAAU;AAEf,YAAA,IAAI,IAAA,CAAK,KAAA,IAAoB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AACxD,cAAA,IAAI,aAAa,QAAA,EAAU;AACzB,gBAAA,SAAA,CAAU,MAAA,GAAS,KAAK,KAAA,CAAM,KAAA;AAAA,cAChC,CAAA,MAAA,IAAW,aAAa,oBAAA,EAAsB;AAC5C,gBAAA,SAAA,CAAU,kBAAA,GAAqB,KAAK,KAAA,CAAM,KAAA;AAAA,cAC5C;AAAA,YACF;AAAA,UACF;AAEA,UAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,QAC3B;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,IAAA,EAA2C;AACpE,IAAA,MAAM,IAAA,GAAO,qBAAqB,IAAI,CAAA;AACtC,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,QAAA,IAAY,SAAS,MAAA,EAAQ;AAC7D,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CACN,KACA,kBAAA,EACoB;AAEpB,IAAA,MAAM,UAAU,CAAC,GAAI,kBAAA,EAAoB,OAAA,IAAW,EAAG,CAAA;AACvD,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAClD,IAAA,MAAM,eAAe,IAAI,GAAA;AAAA,MACvB,QACG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CACrB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,cAAA,CAAe,EAAE,KAAM,CAAA,EAAG,CAAC,CAAU;AAAA,KAC3D;AAGA,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC/B,QAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AAEzB,QAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5C,UAAA,MAAM,aAAA,GAAgB,QAAQ,IAAA,CAAK,IAAA;AAEnC,UAAA,IAAI,oBAAA,CAAqB,aAAA,EAAe,OAAO,CAAA,KAAM,QAAA,EAAU;AAC7D,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,uBAAA,CAAwB,OAAO,CAAA;AACnD,YAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,KAAA,GAC3B,YAAA,CAAa,GAAA,CAAI,KAAK,cAAA,CAAe,MAAA,CAAO,KAAK,CAAC,CAAA,GAClD,MAAA;AACJ,YAAA,IAAI,eAAA,EAAiB;AACnB,cAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiB,MAAM,CAAA;AAChD,cAAA;AAAA,YACF;AACA,YAAA,IAAI,OAAO,EAAA,IAAM,CAAC,UAAU,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG;AAC1C,cAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,cAAA,SAAA,CAAU,GAAA,CAAI,OAAO,EAAE,CAAA;AACvB,cAAA,IAAI,MAAA,CAAO,OAAO,YAAA,CAAa,GAAA,CAAI,KAAK,cAAA,CAAe,MAAA,CAAO,KAAK,CAAA,EAAG,MAAM,CAAA;AAAA,YAC9E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,yBAAA,CAA0B,KAAK,OAAO,CAAA;AAE3C,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,eAAe,KAAA,EAAuB;AAC5C,IAAA,OAAO,KAAA,CACJ,SAAA,CAAU,KAAK,CAAA,CACf,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,WAAA,EAAY,CACZ,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAAA,EAC7B;AAAA,EAEQ,mBAAA,CAAoB,QAA0B,MAAA,EAAgC;AACpF,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,IAAA,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA;AACpD,IAAA,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA;AAClD,IAAA,MAAA,CAAO,0BAAA,GACL,MAAA,CAAO,0BAAA,IAA8B,MAAA,CAAO,0BAAA,IAA8B,MAAA;AAC5E,IAAA,MAAA,CAAO,oBAAA,GACL,MAAA,CAAO,oBAAA,IAAwB,MAAA,CAAO,oBAAA,IAAwB,MAAA;AAChE,IAAA,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,IAAe,MAAA;AACjE,IAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA;AACxC,IAAA,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,SAAA,IAAa,MAAA,CAAO,SAAA;AAC9C,IAAA,MAAA,CAAO,gBAAA,GAAmB,MAAA,CAAO,gBAAA,IAAoB,MAAA,CAAO,gBAAA;AAAA,EAC9D;AAAA,EAEQ,yBAAA,CAA0B,KAAsB,OAAA,EAAmC;AACzF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AAC9C,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,4BAAA,CAA6B,GAAG,CAAA;AAE5D,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,KAAA,EAAO;AACnC,QAAA,MAAMK,QAAAA,GAAU,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAC/C,QAAA,IAAIA,QAAAA,SAAgB,OAAA,GAAUA,QAAAA;AAAA,MAChC;AAEA,MAAA,MAAM,UAAU,MAAA,CAAO,OAAA,GAAU,WAAW,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAClE,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAA,CAAO,gBAAA,GAAmB;AAAA,QACxB,GAAI,MAAA,CAAO,gBAAA,IAAoB,EAAC;AAAA,QAChC,GAAG,OAAA,CAAQ;AAAA,OACb;AACA,MAAA,IAAI,OAAA,CAAQ,0BAAA,EAA4B,MAAA,CAAO,0BAAA,GAA6B,IAAA;AAC5E,MAAA,IAAI,QAAQ,YAAA,IAAgB,CAAC,OAAO,YAAA,EAAc,MAAA,CAAO,eAAe,OAAA,CAAQ,YAAA;AAChF,MAAA,IAAI,QAAQ,aAAA,IAAiB,CAAC,OAAO,aAAA,EAAe,MAAA,CAAO,gBAAgB,OAAA,CAAQ,aAAA;AACnF,MAAA,IAAI,QAAQ,aAAA,IAAiB,CAAC,OAAO,aAAA,EAAe,MAAA,CAAO,gBAAgB,OAAA,CAAQ,aAAA;AACnF,MAAA,IAAI,QAAQ,UAAA,IAAc,CAAC,OAAO,UAAA,EAAY,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA;AAC1E,MAAA,IACE,OAAA,CAAQ,WAAA,IACR,MAAA,CAAO,WAAA,KAAgB,IAAA,IACvB,MAAA,CAAO,oBAAA,KAAyB,IAAA,IAChC,MAAA,CAAO,MAAA,KAAW,aAAA,IAClB,MAAA,CAAO,cAAc,MAAA,EACrB;AACA,QAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AACrB,QAAA,MAAA,CAAO,MAAA,GAAS,OAAO,MAAA,IAAU,aAAA;AACjC,QAAA,MAAA,CAAO,SAAA,GAAY,OAAO,SAAA,IAAa,MAAA;AACvC,QAAA,MAAA,CAAO,oBAAA,GAAuB,OAAO,oBAAA,IAAwB,IAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,6BAA6B,GAAA,EAA2C;AAC9E,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,IAAAL,UAAS,GAAA,EAAK;AAAA,MACZ,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC/B,QAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AACzB,QAAA,IAAI,CAAY,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,QAAA,MAAM,aAAA,GAAgB,QAAQ,IAAA,CAAK,IAAA;AACnC,QAAA,IAAI,oBAAA,CAAqB,aAAA,EAAe,OAAO,CAAA,KAAM,QAAA,EAAU;AAE/D,QAAA,IAAI,KAAA;AACJ,QAAA,IAAI,OAAA;AACJ,QAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,UAAA,IAAI,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,EAAG;AACtC,UAAA,MAAM,WAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAC1E,UAAA,IAAI,CAAC,QAAA,IAAY,CAAC,IAAA,CAAK,KAAA,EAAO;AAC9B,UAAA,IAAA,CACG,QAAA,KAAa,WAAW,QAAA,KAAa,oBAAA,IAAwB,aAAa,OAAA,KAChE,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EACrC;AACA,YAAA,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,UACrB;AACA,UAAA,IACE,QAAA,KAAa,SAAA,IACF,UAAA,CAAA,wBAAA,CAAyB,IAAA,CAAK,KAAK,KACnC,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAC7C;AACA,YAAA,OAAA,GAAU,IAAA,CAAK,MAAM,UAAA,CAAW,IAAA;AAAA,UAClC;AAAA,QACF;AACA,QAAA,IAAI,KAAA,IAAS,OAAA,EAAS,GAAA,CAAI,GAAA,CAAI,OAAO,OAAO,CAAA;AAAA,MAC9C;AAAA,KACD,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,GAAA,EAQxB;AACD,IAAA,MAAM,QAAA,GAAW,iBAAiB,GAAG,CAAA;AAErC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAQb;AAEH,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,CAAA,IAAK,QAAA,EAAU;AACjC,MAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,IAAA,EAAM,EAAA,EAAI,QAAQ,CAAA;AACvD,MAAA,GAAA,CAAI,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,IACpB;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,uBACN,IAAA,EACA,EAAA,EACA,UACA,IAAA,mBAAO,IAAI,KAAY,EAMvB;AACA,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClB,MAAA,OAAO;AAAA,QACL,gBAAA,EAAkB,EAAE,eAAA,EAAiB,MAAA,EAAO;AAAA,QAC5C,WAAA,EAAa,KAAA;AAAA,QACb,0BAAA,EAA4B;AAAA,OAC9B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAEb,IAAA,IAAI,QAAA,GAAW,GAAG,KAAA,KAAU,IAAA;AAC5B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,IAAI,0BAAA,GAA6B,KAAA;AACjC,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,WAAA,GAAc,sDAAA,CAAuD,IAAA,CAAK,IAAI,CAAA;AAElF,IAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAA0B;AAC7C,MAAA,IAAe,UAAA,CAAA,iBAAA,CAAkB,IAAI,CAAA,EAAG,QAAA,GAAW,IAAA;AACnD,MAAA,IACa,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,IACrB,UAAA,CAAA,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,IAC9B,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAC5C;AACA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA;AACpC,QAAA,IAAI,WAAW,MAAA,IAAU,MAAA,KAAW,OAAA,IAAW,MAAA,KAAW,WAAW,OAAA,GAAU,IAAA;AAC/E,QAAA,IACa,wBAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,IAC1C,KAAK,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,YAAA,IAC5B,CAAC,UAAA,EAAY,MAAA,EAAQ,SAAS,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAC/C;AACA,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACjC,UAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,QAAQ,CAAA,EAAG,YAAA,GAAe,QAAA,CAAS,KAAA;AAAA,QACpE;AACA,QAAA,IACa,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,IAC1C,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,OAAA,IAC5B,MAAA,KAAW,OAAA,EACX;AACA,UAAA,0BAAA,GAA6B,IAAA;AAAA,QAC/B;AAAA,MACF;AACA,MAAA,IAAe,4BAAiB,IAAI,CAAA,IAAgB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7E,QAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,IAAA;AAC/B,QAAA,IAAI,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA,EAAG,cAAA,GAAiB,IAAA;AACnD,QAAA,IAAI,sDAAA,CAAuD,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3E,UAAA,WAAA,GAAc,IAAA;AAAA,QAChB;AACA,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACtC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,aAAa,IAAA,CAAK,sBAAA,CAAuB,UAAA,EAAY,MAAA,EAAQ,UAAU,IAAI,CAAA;AACjF,UAAA,QAAA,GAAW,QAAA,IAAY,UAAA,CAAW,gBAAA,CAAiB,cAAA,KAAmB,IAAA;AACtE,UAAA,0BAAA,KAA+B,UAAA,CAAW,0BAAA;AAC1C,UAAA,WAAA,KAAgB,UAAA,CAAW,WAAA;AAC3B,UAAA,YAAA,GAAe,gBAAgB,UAAA,CAAW,YAAA;AAAA,QAC5C;AAAA,MACF;AACA,MAAA,IACa,UAAA,CAAA,kBAAA,CAAmB,IAAI,CAAA,IACvB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,IACrC,sDAAA,CAAuD,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAC9E;AACA,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAAA,IACF,CAAA;AAEA,IAAA,IAAI,GAAG,IAAA,EAAM;AACX,MAAAA,SAAAA,CAAS,GAAG,IAAA,EAAa;AAAA,QACvB,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,CAAC,QAAA,KAAkB,WAAA,CAAY,SAAS,IAAI;AAAA,OAC7C,CAAA;AAAA,IACV;AAEA,IAAA,MAAM,kBAA6D,YAAA,GAC/D,YAAA,GACA,iBACE,iBAAA,GACA,QAAA,IAAY,UACV,OAAA,GACA,MAAA;AAER,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB;AAAA,QAChB,cAAA,EAAgB,YAAY,OAAA,IAAW,MAAA;AAAA,QACvC;AAAA,OACF;AAAA,MACA,WAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,oBAAA,CACN,OAAA,EACA,WAAA,EACA,QAAA,EACS;AACT,IAAA,MAAMM,iBAAAA,GACJ,sFAAA;AAGF,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,MAAA,IAAI,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,WAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAC1E,MAAA,IAAI,QAAA,KAAa,aAAA,IAAiB,QAAA,KAAa,kBAAA,EAAoB;AAGjE,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA;AAChC,QAAA,IAAe,UAAA,CAAA,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA,EAAG;AACnD,UAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,UAAA;AACxB,UAAA,IAAe,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA;AAAA,QACrD;AACA,QAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1C,UAAA,OAAO,IAAA,CAAK,MAAM,KAAA,KAAU,MAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,IAAeA,iBAAAA,CAAiB,IAAA,CAAK,WAAW,GAAG,OAAO,IAAA;AAC9D,IAAA,IAAI,QAAA,IAAYA,iBAAAA,CAAiB,IAAA,CAAK,QAAQ,GAAG,OAAO,IAAA;AAExD,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,OAAA,EAAyD;AACvF,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,EAAA,EAAI,EAAA;AAAA,MACJ,IAAA,EAAM;AAAA,KACR;AACA,IAAA,MAAM,gBAA2B,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,KAAK,IAAA,GAAO,MAAA;AACrF,IAAA,MAAA,CAAO,eAAA,GAAkB,aAAA;AACzB,IAAA,IAAI,WAAA;AAEJ,IAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,UAAA,EAAY;AACrC,MAAA,IAAI,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,EAAG;AAEtC,MAAA,MAAM,WAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,GAAO,IAAA;AAC1E,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1C,UAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,YAAA,MAAA,CAAO,EAAA,GAAK,KAAK,KAAA,CAAM,KAAA;AACvB,YAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAA,EAAS;AAAA,cACjD,EAAA,EAAI,KAAK,KAAA,CAAM,KAAA;AAAA,cACf,UAAA,EAAY,KAAK,KAAA,CAAM,KAAA;AAAA,cACvB,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,YAAA,MAAA,CAAO,EAAA,GAAK,KAAK,KAAA,CAAM,KAAA;AACvB,YAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAA,EAAS;AAAA,cACjD,EAAA,EAAI,KAAK,KAAA,CAAM,KAAA;AAAA,cACf,MAAA,EAAQ,KAAK,KAAA,CAAM,KAAA;AAAA,cACnB,MAAA,EAAQ;AAAA,aACT,CAAA;AAAA,UACH,WAAW,QAAA,KAAa,OAAA,IAAW,QAAA,KAAa,OAAA,IAAW,aAAa,oBAAA,EAAsB;AAC5F,YAAA,MAAA,CAAO,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAA;AAC1B,YAAA,IAAI,aAAa,oBAAA,EAAsB;AACrC,cAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAA,EAAS;AAAA,gBACjD,kBAAA,EAAoB,KAAK,KAAA,CAAM,KAAA;AAAA,gBAC/B,MAAA,EAAQ;AAAA,eACT,CAAA;AAAA,YACH;AACA,YAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,cAAA,MAAA,CAAO,EAAA,GAAK,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,YACnD;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAsB,UAAA,CAAA,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA,EAAG;AAC1D,UAAA,IAAI,aAAa,SAAA,IAAwB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAE5E,YAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA,CAAK,WAAA,EAAY;AACrD,YAAA,MAAA,CAAO,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA;AACvC,YAAA,IAAI,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClC,cAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AAAA,YAChB,CAAA,MAAA,IAAW,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3C,cAAA,MAAA,CAAO,IAAA,GAAO,YAAA;AAAA,YAChB;AAAA,UACF,CAAA,MAAA,IAAW,aAAa,SAAA,EAAW;AACjC,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,4BAAA,CAA6B,IAAA,CAAK,MAAM,UAAU,CAAA;AACtE,YAAA,IAAI,OAAO,OAAA,EAAS;AAClB,cAAA,WAAA,GAAc,MAAA,CAAO,QAAQ,WAAA,EAAY;AACzC,cAAA,MAAA,CAAO,UAAU,MAAA,CAAO,OAAA;AACxB,cAAA,IAAI,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,SAAU,IAAA,GAAO,QAAA;AAAA,YACpD;AACA,YAAA,IAAI,OAAO,YAAA,EAAc;AACvB,cAAA,MAAA,CAAO,IAAA,GAAO,YAAA;AACd,cAAA,MAAA,CAAO,eAAe,MAAA,CAAO,YAAA;AAAA,YAC/B;AAAA,UACF,WAAW,QAAA,KAAa,SAAA,IAAwB,wBAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AACnF,YAAA,MAAA,CAAO,gBAAA,GAAmB;AAAA,cACxB,GAAI,MAAA,CAAO,gBAAA,IAAoB,EAAC;AAAA,cAChC,cAAA,EAAgB,IAAA;AAAA,cAChB,oBAAA,EAAsB,CAAC,IAAA,CAAK,KAAA,CAAM,WAAW,IAAI;AAAA,aACnD;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,aAAA,EAAe;AACrC,QAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,EAAA,EAAI;AAChC,MAAA,MAAA,CAAO,OAAA,GAAU,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,KAAA,GAAQ,OAAA,GAAU,UAAA,EAAW;AAAA,IACrG;AAKA,IAAA,IAAI,KAAK,oBAAA,CAAqB,OAAA,EAAS,WAAA,EAAa,MAAA,CAAO,EAAE,CAAA,EAAG;AAC9D,MAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAAA,IACvB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,6BACN,IAAA,EACoD;AACpD,IAAA,IAAe,UAAA,CAAA,oBAAA,CAAqB,IAAI,CAAA,EAAG,OAAO,EAAC;AACnD,IAAA,MAAM,OAAA,GAAU,uBAAuB,IAAI,CAAA,CAAE,KAAK,CAAC,IAAA,KAAS,KAAK,YAAY,CAAA;AAC7E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,uBAAA,CAAwB,IAAI,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAAA,MAC7B,GAAI,SAAS,YAAA,GAAe,EAAE,cAAc,OAAA,CAAQ,YAAA,KAAiB;AAAC,KACxE;AAAA,EACF;AAAA,EAEQ,wBAAwB,IAAA,EAA2C;AACzE,IAAA,IAAe,UAAA,CAAA,YAAA,CAAa,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA;AAC/C,IAAA,IAAe,UAAA,CAAA,yBAAA,CAA0B,IAAI,CAAA,IAAgB,UAAA,CAAA,oBAAA,CAAqB,IAAI,CAAA,EAAG;AACvF,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA;AAAA,IAC/C;AACA,IAAA,IAAe,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACrC,MAAA,KAAA,MAAW,SAAA,IAAa,KAAK,IAAA,EAAM;AACjC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,uBAAA,CAAwB,SAAS,CAAA;AACtD,QAAA,IAAI,SAAS,OAAO,OAAA;AAAA,MACtB;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAe,UAAA,CAAA,qBAAA,CAAsB,IAAI,CAAA,EAAG;AAC1C,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,UAAU,CAAA;AAAA,IACrD;AACA,IAAA,IAAe,UAAA,CAAA,iBAAA,CAAkB,IAAI,CAAA,EAAG;AACtC,MAAA,OAAO,KAAK,QAAA,GAAW,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,QAAQ,CAAA,GAAI,MAAA;AAAA,IACvE;AACA,IAAA,IAAe,UAAA,CAAA,iBAAA,CAAkB,IAAI,CAAA,EAAG;AACtC,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,QAAQ,CAAA;AAAA,IACnD;AACA,IAAA,IAAe,UAAA,CAAA,iBAAA,CAAkB,IAAI,CAAA,EAAG;AACtC,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,QAAQ,CAAA;AAAA,IACnD;AACA,IAAA,IAAe,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACrC,MAAA,IAAe,wBAAa,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,KAAK,MAAA,CAAO,IAAA;AAC7D,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CACN,SACA,IAAA,EACmB;AACnB,IAAA,OAAO,EAAE,GAAI,OAAA,IAAW,EAAC,EAAI,GAAG,IAAA,EAAK;AAAA,EACvC;AAAA,EAEQ,oBAAoB,IAAA,EAAiF;AAC3G,IAAA,IAAe,UAAA,CAAA,YAAA,CAAa,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA;AAC/C,IAAA,IACa,UAAA,CAAA,kBAAA,CAAmB,IAAI,CAAA,IACvB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,IACxB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,EACrC;AACA,MAAA,OAAO,GAAG,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,IAAI,CAAA,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,KAAA,EAAuB;AAC7C,IAAA,OAAO,MACJ,WAAA,EAAY,CACZ,SAAA,CAAU,KAAK,EACf,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA,CAC9B,QAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,YAAY,EAAE,CAAA;AAAA,EAC3B;AAAA,EAEQ,mBAAmB,GAAA,EAA8C;AACvE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,0BAAA,CAA2B,GAAG,CAAA;AACzD,IAAA,MAAM,cAAsC,EAAC;AAE7C,IAAAN,UAAS,GAAA,EAAK;AAAA,MACZ,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC/B,QAAA,MAAM,UAAU,QAAA,CAAS,IAAA;AACzB,QAAA,IAAI,CAAY,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,QAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,CAAK,IAAA;AAC/B,QAAA,IAAI,CAAC,CAAC,UAAA,EAAY,aAAA,EAAe,mBAAmB,WAAW,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AACpF,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,uBAAA,CAAwB,OAAA,EAAS,MAAM,CAAA;AAC/D,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,uBAAA,CAAwB,OAAA,EAAS,YAAY,CAAA;AACrE,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC7C,QAAA,MAAM,QAAA,GAAW,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAC9D,QAAA,MAAM,SAAA,GAAY,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA,GAAI,MAAA;AAC/D,QAAA,MAAM,gBAAgB,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,QAAQ,IAAI,EAAC;AACrE,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY,YAAY,aAAa,CAAA;AACzE,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,aAAa,CAAA;AACvE,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,UAAU,CAAA;AAEzD,QAAA,MAAM,EAAA,GAAK,UAAA,IAAc,UAAA,IAAc,CAAA,EAAG,SAAA,CAAU,aAAa,CAAA,CAAA,EAAI,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,CAAA;AAC3F,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,EAAA;AAAA,UACA,SAAA;AAAA,UACA,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,UAC/B,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,UACnC,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,UAC/B,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe,EAAC;AAAA,UACnC,GAAI,aAAA,CAAc,MAAA,GAAS,IAAI,EAAE,aAAA,KAAkB,EAAC;AAAA,UACpD,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,UACjC,GAAI,YAAY,EAAE,UAAA,EAAY,CAAC,SAAS,CAAA,KAAM,EAAC;AAAA,UAC/C,GAAI,cAAA,CAAe,MAAA,GAAS,IAAI,EAAE,cAAA,KAAmB,EAAC;AAAA,UACtD,GAAI,WAAA,GAAc,EAAE,WAAA,KAAgB;AAAC,SACtC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEQ,2BAA2B,GAAA,EAAwD;AACzF,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAiC;AACjD,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,kBAAA,EAAoB,CAAC,QAAA,KAAa;AAChC,QAAA,IAAI,CAAY,UAAA,CAAA,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG;AAChD,QAAA,MAAM,IAAA,GAAO,SAAS,IAAA,CAAK,IAAA;AAC3B,QAAA,IACa,UAAA,CAAA,yBAAA,CAA0B,IAAI,CAAA,IAC9B,UAAA,CAAA,oBAAA,CAAqB,IAAI,CAAA,EACpC;AACA,UAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAA,CAAG,MAAM,IAAI,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,MACA,mBAAA,EAAqB,CAAC,QAAA,KAAa;AACjC,QAAA,IAAI,QAAA,CAAS,IAAA,CAAK,EAAA,EAAI,IAAA,EAAM,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AAAA,MAC1E;AAAA,KACD,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,uBAAA,CACN,SACA,QAAA,EACoB;AACpB,IAAA,MAAM,IAAA,GAAO,QAAQ,UAAA,CAAW,IAAA;AAAA,MAAK,CAAC,SAAA,KACzB,UAAA,CAAA,cAAA,CAAe,SAAS,CAAA,IACxB,UAAA,CAAA,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA,IACzC,SAAA,CAAU,IAAA,CAAK,IAAA,KAAS;AAAA,KAC1B;AACA,IAAA,IAAI,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,KAAK,CAAC,IAAA,CAAK,OAAO,OAAO,MAAA;AAC5D,IAAA,IACa,UAAA,CAAA,wBAAA,CAAyB,KAAK,KAAK,CAAA,IACnC,wBAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAC7C;AACA,MAAA,OAAO,IAAA,CAAK,MAAM,UAAA,CAAW,IAAA;AAAA,IAC/B;AACA,IAAA,IAAe,2BAAgB,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,KAAK,KAAA,CAAM,KAAA;AAC9D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,gBAAgB,OAAA,EAA2D;AACjF,IAAA,MAAM,IAAA,GAAO,QAAQ,UAAA,CAAW,IAAA;AAAA,MAAK,CAAC,SAAA,KACzB,UAAA,CAAA,cAAA,CAAe,SAAS,CAAA,IACxB,UAAA,CAAA,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA,IACzC,SAAA,CAAU,IAAA,CAAK,IAAA,KAAS;AAAA,KAC1B;AACA,IAAA,IACE,CAAY,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,IAC/B,CAAC,IAAA,CAAK,KAAA,IACN,CAAY,UAAA,CAAA,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA,EAC/C;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,UAAA;AACxB,IAAA,IAAI,CAAY,UAAA,CAAA,yBAAA,CAA0B,IAAI,CAAA,EAAG,OAAO,MAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAY,UAAA,CAAA,YAAA,CAAa,KAAK,CAAA,EAAG,OAAO,MAAA;AAC5C,IAAA,IACa,8BAAmB,IAAA,CAAK,IAAI,KAC5B,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAK,MAAM,CAAA,IACxC,KAAK,IAAA,CAAK,MAAA,CAAO,SAAS,KAAA,CAAM,IAAA,IACrB,wBAAa,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAC1C;AACA,MAAA,OAAO,IAAA,CAAK,KAAK,QAAA,CAAS,IAAA;AAAA,IAC5B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,EAAA,EAA0D;AACjF,IAAA,IAAI,MAAA;AACJ,IAAAA,SAAAA,CAAS,GAAG,IAAA,EAAa;AAAA,MACvB,OAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAgB,CAAC,QAAA,KAAkB;AACjC,QAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,QAAA,IACE,CAAY,UAAA,CAAA,kBAAA,CAAmB,IAAA,CAAK,MAAM,KAC1C,CAAY,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,IAC3C,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,KAAS,YAAA,IAC5B,CAAY,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,IAC7C,CAAC,CAAC,UAAA,EAAY,MAAA,EAAQ,SAAS,EAAE,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EACnE;AACA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AACjC,QAAA,IAAI,CAAY,UAAA,CAAA,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC3C,QAAA,MAAM,SAAS,IAAA,CAAK,uBAAA,CAAwB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAC7D,QAAA,MAAA,GAAS;AAAA,UACP,IAAA,EAAM,YAAA;AAAA,UACN,cAAc,QAAA,CAAS,KAAA;AAAA,UACvB,GAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,GAAI,EAAE,MAAA,EAAO,GAAI,EAAC;AAAA,UACnD,WAAA,EAAa,CAAA,qBAAA,EAAwB,QAAA,CAAS,KAAK,CAAA;AAAA,SACrD;AAAA,MACF;AAAA,KACM,CAAA;AACR,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,wBAAwB,GAAA,EAAiE;AAC/F,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,IAAI,CAAC,GAAA,IAAO,CAAY,UAAA,CAAA,kBAAA,CAAmB,GAAG,GAAG,OAAO,MAAA;AACxD,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,UAAA,EAAY;AACjC,MAAA,IAAI,CAAY,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACxC,MAAA,MAAM,GAAA,GAAiB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAG,IACxC,IAAA,CAAK,GAAA,CAAI,IAAA,GACE,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,CAAA,GACjC,IAAA,CAAK,IAAI,KAAA,GACT,MAAA;AACN,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IACa,UAAA,CAAA,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,IAC7B,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,IAC9B,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAC3C;AACA,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,MACrE,CAAA,MAAA,IAAsB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG;AAC9C,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA;AAAA,MAC3B,CAAA,MAAA,IAAsB,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AACjD,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,EAAA,EAAmC;AAC3D,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,IAAA,MAAM,SAAA,mBAAY,IAAI,GAAA,CAAY,CAAC,MAAM,CAAC,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA;AAC9B,IAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,UAAU,CAAA,EAAG;AAC1C,MAAA,KAAA,MAAW,IAAA,IAAQ,WAAW,UAAA,EAAY;AACxC,QAAA,IACa,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,IACrB,UAAA,CAAA,YAAA,CAAa,KAAK,GAAG,CAAA,IAChC,IAAA,CAAK,GAAA,CAAI,IAAA,KAAS,MAAA,IACP,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAClC;AACA,UAAA,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAsB,UAAA,CAAA,YAAA,CAAa,UAAU,CAAA,EAAG;AAC9C,MAAA,SAAA,CAAU,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,IAC/B;AAEA,IAAAA,SAAAA,CAAS,GAAG,IAAA,EAAa;AAAA,MACvB,OAAA,EAAS,IAAA;AAAA,MACT,gBAAA,EAAkB,CAAC,QAAA,KAAkB;AACnC,QAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,QAAA,IACa,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,IACnC,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,IACnB,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,EACrC;AACA,UAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,KACM,CAAA;AAER,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,EAAK;AAAA,EACjC;AAAA,EAEQ,aAAA,CACN,UAAA,EACA,UAAA,EACA,aAAA,EACoB;AACpB,IAAA,MAAM,SAAS,UAAA,IAAc,UAAA;AAC7B,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,IAAA,MAAM,QAAA,GAAW,MAAA,CACd,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,OAAA,CAAQ,mCAAA,EAAqC,EAAE,CAAA,CAC/C,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACpB,IAAA,MAAM,SAAA,GAAY,SAAS,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AACrE,IAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,OAAO,SAAA;AACjC,IAAA,IAAI,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CACN,UACA,aAAA,EACU;AACV,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,IAAI,QAAA,EAAU,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA;AAC9B,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,IAAI,+CAA+C,IAAA,CAAK,KAAK,CAAA,EAAG,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,IAC/E;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA,EAEQ,gBAAA,CAAiB,KAAsB,UAAA,EAAoD;AACjG,IAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,IAAA,IAAI,YAAA;AACJ,IAAAA,UAAS,GAAA,EAAK;AAAA,MACZ,cAAA,EAAgB,CAAC,QAAA,KAAa;AAC5B,QAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,QAAA,IAAI,CAAY,UAAA,CAAA,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA,EAAG;AACjD,QAAA,IAAI,CAAY,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AAC9F,QAAA,IAAI,CAAY,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,MAAM,KAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AAC5F,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAC3B,QAAA,IAAI,CAAY,UAAA,CAAA,yBAAA,CAA0B,EAAE,KAAK,CAAY,UAAA,CAAA,oBAAA,CAAqB,EAAE,CAAA,EAAG;AACvF,QAAAA,SAAAA,CAAS,GAAG,IAAA,EAAa;AAAA,UACvB,OAAA,EAAS,IAAA;AAAA,UACT,UAAA,EAAY,CAAC,SAAA,KAAmB;AAC9B,YAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,IAAA;AAC5B,YAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA,iBAAkB,YAAA,IAAgB,IAAA;AAAA,UACxE;AAAA,SACM,CAAA;AAAA,MACV;AAAA,KACD,CAAA;AACD,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,IAAA,EAAsC;AAChE,IAAA,IAAe,UAAA,CAAA,eAAA,CAAgB,IAAI,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AACA,IAAA,IAAe,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACrC,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AACA,IAAA,IAAe,UAAA,CAAA,gBAAA,CAAiB,IAAI,CAAA,EAAG;AACrC,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AACA,IAAA,IAAe,UAAA,CAAA,aAAA,CAAc,IAAI,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,QAAA,EAA0B;AAClD,IAAA,MAAMO,SAAAA,GAAWH,cAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AACvC,IAAA,OAAOG,SAAAA,CAAS,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAAA,EAC9C;AACF;ACplDO,IAAM,qBAAN,MAAyB;AAAA,EACtB,MAAA;AAAA;AAAA,EAEA,iBAAA;AAAA;AAAA,EAEA,iBAAA;AAAA,EAER,WAAA,CACE,QACA,OAAA,EACA;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAA,EAAS,iBAAA,IAAqB,EAAC;AACxD,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAA,EAAS,iBAAA,IAAqB,EAAC;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,OAAA,GAAoC;AACxC,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,mBAAA,EAAoB;AACvD,IAAA,MAAM,mBAAsC,EAAC;AAC7C,IAAA,MAAM,cAA4B,EAAC;AAGnC,IAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAG,QAAA,CAAS,UAAU,OAAO,CAAA;AACnD,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA;AACzD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAA;AAEpD,QAAA,gBAAA,CAAiB,IAAA,CAAK,GAAG,UAAU,CAAA;AACnC,QAAA,WAAA,CAAY,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,MAC3B,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,MACpD;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,wBAAA,CAAyB,kBAAkB,WAAW,CAAA;AAG3D,IAAA,OAAO,IAAA,CAAK,qBAAqB,gBAAgB,CAAA;AAAA,EACnD;AAAA;AAAA,EAGA,MAAc,mBAAA,GAAyC;AACrD,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,6BAAA;AAAA,MACA,wBAAA;AAAA,MACA,qBAAA;AAAA;AAAA,MAEA,GAAG,IAAA,CAAK;AAAA,KACV;AAEA,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,oBAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,GAAI,IAAA,CAAK,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA;AAAA,MAE5B,GAAG,IAAA,CAAK;AAAA,KACV;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAMC,IAAAA,CAAK,QAAA,EAAU;AAAA,MACjC,GAAA,EAAK,KAAK,MAAA,CAAO,OAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAASL,cAAAA,CAAK,KAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,EACjE;AAAA;AAAA,EAGQ,eAAA,CAAgB,SAAiB,QAAA,EAAqC;AAC5E,IAAA,MAAM,aAAgC,EAAC;AAEvC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAa,aAAM,OAAA,EAAS;AAAA,QAChC,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,KAAA;AAAA,UACA,YAAA;AAAA,UACA,GAAK,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB;AAAC;AACrC,OACD,CAAA;AAED,MAAA,MAAM,cAAA,uBAAmD,GAAA,EAAI;AAC7D,MAAA,MAAM,kBAAA,uBAAsD,GAAA,EAAI;AAEhE,MAAAJ,UAAS,GAAA,EAAK;AAAA;AAAA,QAEZ,cAAA,EAAgB,CAAC,QAAA,KAAa;AAC5B,UAAA,MAAM,EAAE,MAAK,GAAI,QAAA;AACjB,UAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,UAAA,IAAI,aAAA,GAAmD,IAAA;AAEvD,UAAA,IACIU,UAAA,CAAA,YAAA,CAAa,MAAM,CAAA,IACrB,MAAA,CAAO,SAAS,4BAAA,EAChB;AACA,YAAA,aAAA,GAAgB,OAAA;AAAA,UAClB,WACIA,UAAA,CAAA,YAAA,CAAa,MAAM,CAAA,IACrB,MAAA,CAAO,SAAS,sBAAA,EAChB;AACA,YAAA,aAAA,GAAgB,OAAA;AAAA,UAClB,WACIA,UAAA,CAAA,YAAA,CAAa,MAAM,CAAA,IACrB,MAAA,CAAO,SAAS,0BAAA,EAChB;AACA,YAAA,aAAA,GAAgB,KAAA;AAAA,UAClB,WACIA,UAAA,CAAA,YAAA,CAAa,MAAM,CAAA,IACrB,MAAA,CAAO,SAAS,oBAAA,EAChB;AACA,YAAA,aAAA,GAAgB,KAAA;AAAA,UAClB,WACIA,UAAA,CAAA,YAAA,CAAa,MAAM,CAAA,IACrB,MAAA,CAAO,SAAS,uBAAA,EAChB;AACA,YAAA,aAAA,GAAgB,QAAA;AAAA,UAClB;AAEA,UAAA,IAAI,aAAA,EAAe;AAEjB,YAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,YAAA,IACIA,gCAAqB,MAAM,CAAA,IAC3BA,UAAA,CAAA,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA,EACxB;AACA,cAAA,MAAM,OAAA,GAAU,OAAO,EAAA,CAAG,IAAA;AAC1B,cAAA,cAAA,CAAe,IAAI,OAAA,EAAS;AAAA,gBAC1B,IAAA,EAAM,OAAA;AAAA,gBACN,IAAA,EAAM,aAAA;AAAA,gBACN,SAAS;AAAC,eACX,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAA;AAAA;AAAA,QAGA,UAAA,EAAY,CAAC,QAAA,KAAa;AACxB,UAAA,MAAM,EAAE,MAAK,GAAI,QAAA;AACjB,UAAA,MAAM,iBAAiB,IAAA,CAAK,cAAA;AAE5B,UAAA,IACIA,UAAA,CAAA,qBAAA,CAAsB,eAAe,IAAI,CAAA,IACzCA,2BAAgB,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA,EAC5C;AACA,YAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,MAAA,CAAO,IAAA;AAC9C,YAAA,MAAM,YAAA,GAAiBA,2BAAgB,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,GAC/D,cAAA,CAAe,IAAA,CAAK,QAAA,CAAS,IAAA,GAC7B,IAAA;AAEJ,YAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,cAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA;AAC/C,cAAA,IAAI,SAAA,EAAW;AAEb,gBAAA,MAAM,gBAAA,GAAmB,eAAe,UAAA,CAAW,IAAA;AAAA,kBACjD,CAAC,IAAA,KACGA,UAAA,CAAA,cAAA,CAAe,IAAI,CAAA,IACnBA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,IAC3B,IAAA,CAAK,IAAA,CAAK,IAAA,KAAS;AAAA,iBACvB;AAEA,gBAAA,IACIA,0BAAe,gBAAgB,CAAA,IAC/BA,UAAA,CAAA,eAAA,CAAgB,gBAAA,CAAiB,KAAK,CAAA,EACxC;AACA,kBAAA,SAAA,CAAU,gBAAA,GAAmB,iBAAiB,KAAA,CAAM,KAAA;AAAA,gBACtD;AAGA,gBAAA,MAAM,UAAU,IAAA,CAAK,2BAAA;AAAA,kBACnB,IAAA;AAAA,kBACA,UAAA;AAAA,kBACA,SAAA,CAAU;AAAA,iBACZ;AACA,gBAAA,kBAAA,CAAmB,GAAA,CAAI,YAAY,OAAO,CAAA;AAAA,cAC5C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,OACD,CAAA;AAGD,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAC,SAAA,KAAc;AACpC,QAAA,MAAM,UAAU,kBAAA,CAAmB,GAAA,CAAI,SAAA,CAAU,IAAI,KAAK,EAAC;AAC3D,QAAA,SAAA,CAAU,OAAA,GAAU,OAAA;AACpB,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAC3B,CAAC,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,IAClE;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA,EAGQ,2BAAA,CACN,gBAAA,EACA,gBAAA,EACA,aAAA,EACgB;AAChB,IAAA,MAAM,UAA0B,EAAC;AAEjC,IAAA,IAAI,CAAC,gBAAA,CAAiB,QAAA,EAAU,OAAO,OAAA;AAEvC,IAAA,KAAA,MAAW,KAAA,IAAS,iBAAiB,QAAA,EAAU;AAC7C,MAAA,IACIA,wBAAa,KAAK,CAAA,IAClBA,iCAAsB,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA,EACjD;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,cAAA,CAAe,IAAA;AACxC,QAAA,IACIA,UAAA,CAAA,eAAA,CAAgB,UAAA,CAAW,MAAM,CAAA,IACnC,WAAW,MAAA,CAAO,IAAA,KAAS,gBAAA,IACzBA,UAAA,CAAA,eAAA,CAAgB,WAAW,QAAQ,CAAA,IACrC,UAAA,CAAW,QAAA,CAAS,SAAS,QAAA,EAC7B;AACA,UAAA,MAAM,aAAa,IAAA,CAAK,qBAAA;AAAA,YACtB,MAAM,cAAA,CAAe,UAAA;AAAA,YACrB;AAAA,WACF;AAEA,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,IAAA,EAAM,UAAA;AAAA,cACN,aAAA,EAAe,gBAAA;AAAA,cACf;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGQ,qBAAA,CACN,YACA,QAAA,EACe;AACf,IAAA,MAAM,OAAO,UAAA,CAAW,IAAA;AAAA,MACtB,CAAC,CAAA,KAAQA,UAAA,CAAA,cAAA,CAAe,CAAC,CAAA,IAAOA,UAAA,CAAA,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS;AAAA,KAC7E;AAEA,IAAA,IACIA,0BAAe,IAAI,CAAA,IACnBA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAC5B;AACA,MAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,IACpB;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,eAAA,CAAgB,SAAiB,QAAA,EAAgC;AACvE,IAAA,MAAM,QAAsB,EAAC;AAE7B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAa,aAAM,OAAA,EAAS;AAAA,QAChC,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS;AAAA,UACP,KAAA;AAAA,UACA,YAAA;AAAA,UACA,GAAK,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB;AAAC;AACrC,OACD,CAAA;AAED,MAAAV,UAAS,GAAA,EAAK;AAAA,QACZ,sBAAA,EAAwB,CAAC,QAAA,KAAa;AACpC,UAAA,MAAM,EAAE,MAAK,GAAI,QAAA;AACjB,UAAA,MAAM,QAAA,GAAW,KAAK,EAAA,CAAG,IAAA;AAKzB,UAAA,MAAM,SAAA,GAAY,8CAAA,CAA+C,IAAA,CAAK,QAAQ,CAAA;AAE9E,UAAA,IAAI,SAAA,IAAa,IAAA,CAAK,cAAA,EAAgB,IAAA,KAAS,eAAA,EAAiB;AAC9D,YAAA,MAAM,eAAe,IAAA,CAAK,uBAAA;AAAA,cACxB,IAAA,CAAK,cAAA;AAAA,cACL;AAAA,aACF;AAEA,YAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAC/C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,KAAA,CAAM,IAAA,CAAK;AAAA,gBACT,IAAA,EAAM,QAAA;AAAA,gBACN,MAAM,OAAA,CAAQ,IAAA;AAAA,gBACd;AAAA,eACD,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,IAC7D;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,uBAAA,CACN,aACA,QAAA,EACgC;AAChC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AAEnD,IAAA,KAAA,MAAW,MAAA,IAAU,YAAY,OAAA,EAAS;AACxC,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,qBAAA,IAAyB,MAAA,CAAO,GAAA,EAAK;AACvD,QAAA,MAAM,UACJ,MAAA,CAAO,GAAA,CAAI,SAAS,YAAA,GAAe,MAAA,CAAO,IAAI,IAAA,GAAO,IAAA;AAEvD,QAAA,IAAI,OAAA,IAAW,OAAO,cAAA,EAAgB;AACpC,UAAA,MAAM,SAAS,IAAA,CAAK,qBAAA;AAAA,YAClB,OAAO,cAAA,CAAe;AAAA,WACxB;AACA,UAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,MAAM,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA,EAGQ,sBAAsB,cAAA,EAAgE;AAC5F,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,IACE,cAAA,CAAe,IAAA,KAAS,oBAAA,IACxB,cAAA,CAAe,SAAS,eAAA,EACxB;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,cAAA,CAAe,SAAS,eAAA,EAAiB;AAC3C,MAAA,MAAM,WAAA,GAAc,cAAA;AACpB,MAAA,KAAA,MAAW,MAAA,IAAU,YAAY,OAAA,EAAS;AACxC,QAAA,IAAI,MAAA,CAAO,IAAA,KAAS,qBAAA,IAAyB,MAAA,CAAO,GAAA,EAAK;AACvD,UAAA,MAAM,UACJ,MAAA,CAAO,GAAA,CAAI,SAAS,YAAA,GAAe,MAAA,CAAO,IAAI,IAAA,GAAO,IAAA;AAEvD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,OAAA,GAAU,OAAO,cAAA,GACnB,IAAA,CAAK,aAAa,MAAA,CAAO,cAAA,CAAe,cAAc,CAAA,GACtD,SAAA;AACJ,YAAA,MAAM,QAAA,GAAW,CAAC,MAAA,CAAO,QAAA;AAEzB,YAAA,MAAA,CAAO,IAAA,CAAK;AAAA,cACV,IAAA,EAAM,OAAA;AAAA,cACN,IAAA,EAAM,OAAA;AAAA,cACN;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,aAAa,IAAA,EAA2C;AAC9D,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,iBAAA,EAAmB,OAAO,QAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,iBAAA,EAAmB,OAAO,QAAA;AAC5C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,kBAAA,EAAoB,OAAO,SAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,oBAAA,EAAsB,OAAO,WAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB,OAAO,MAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,MAAA,OAAQ,IAAA,CAAuB,KAAA,CAAM,GAAA,CAAI,CAACD,EAAAA,KAAM,IAAA,CAAK,YAAA,CAAaA,EAAC,CAAC,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AAAA,IAClF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,iBAAA,IAAsB,IAAA,CAA2B,QAAA,EAAU;AAC3E,MAAA,MAAM,OAAQ,IAAA,CAA2B,QAAA;AACzC,MAAA,OAAO,IAAA,CAAK,IAAA,KAAS,YAAA,GAAe,IAAA,CAAK,IAAA,GAAO,SAAA;AAAA,IAClD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA,EAGQ,kBACN,QAAA,EAC6C;AAC7C,IAAA,IAAI,SAAS,IAAA,CAAK,QAAQ,GAAG,OAAO,EAAE,MAAM,OAAA,EAAQ;AACpD,IAAA,IAAI,OAAO,IAAA,CAAK,QAAQ,GAAG,OAAO,EAAE,MAAM,KAAA,EAAM;AAChD,IAAA,IAAI,UAAU,IAAA,CAAK,QAAQ,GAAG,OAAO,EAAE,MAAM,QAAA,EAAS;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,wBAAA,CACN,YACA,KAAA,EACM;AACN,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAElC,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,CAACA,OAAMA,EAAAA,CAAE,IAAA,KAAS,UAAU,IAAI,CAAA;AAEhE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,KAAA,MAAW,MAAA,IAAU,UAAU,OAAA,EAAS;AACtC,UAAA,MAAM,YAAA,GAAe,YAAA,CAAa,YAAA,CAAa,GAAA,CAAI,OAAO,IAAI,CAAA;AAC9D,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,MAAA,CAAO,MAAA,GAAS,YAAA;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,qBACN,gBAAA,EACiB;AACjB,IAAA,MAAM,UAA0C,EAAC;AACjD,IAAA,MAAM,aAAoC,EAAC;AAC3C,IAAA,IAAI,aAAA,GAAgB,EAAA;AAGpB,IAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,MAAA,MAAM,cAAc,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAEvD,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,OAAA,EAAS,WAAA;AAAA,QACT,iBAAiB,SAAA,CAAU;AAAA,OAC5B,CAAA;AAID,MAAA,IACE,CAAC,aAAA,IACD,SAAA,CAAU,gBAAA,KACT,SAAA,CAAU,KAAK,QAAA,CAAS,MAAM,CAAA,IAC7B,WAAA,CAAY,KAAK,CAAC,CAAA,KAAM,MAAM,MAAA,IAAU,CAAA,KAAM,MAAM,CAAA,CAAA,EACtD;AACA,QAAA,aAAA,GAAgB,SAAA,CAAU,gBAAA;AAAA,MAC5B;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,MAAA,KAAA,MAAW,MAAA,IAAU,UAAU,OAAA,EAAS;AACtC,QAAA,MAAM,YAAY,MAAA,CAAO,IAAA;AAGzB,QAAA,MAAM,cAAwB,EAAC;AAC/B,QAAA,MAAM,gBAA0B,EAAC;AAGjC,QAAA,KAAA,MAAW,WAAA,IAAe,UAAU,OAAA,EAAS;AAC3C,UAAA,IAAI,WAAA,CAAY,IAAA,KAAS,MAAA,CAAO,IAAA,EAAM;AACpC,YAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAE5B,cAAA,WAAA,CAAY,IAAA,CAAK,YAAY,IAAI,CAAA;AACjC,cAAA,aAAA,CAAc,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,YACrC,CAAA,MAAO;AAEL,cAAA,WAAA,CAAY,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,YACnC;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,SAAS,CAAA,GAAI;AAAA,UACnB,YAAY,MAAA,CAAO,IAAA;AAAA,UACnB,eAAe,SAAA,CAAU,IAAA;AAAA,UACzB,iBAAiB,SAAA,CAAU,IAAA;AAAA,UAC3B,aAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAQ,MAAA,CAAO;AAAA,SACjB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,aAAA,IAAiB,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AACjD,MAAA,MAAM,cAAA,GAAiB,iBAAiB,CAAC,CAAA;AACzC,MAAA,MAAM,gBAAgB,gBAAA,CAAiB,IAAA;AAAA,QACrC,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,IAAM,cAAA,IAAkB,CAAA,CAAE,IAAA,KAAS,cAAA,CAAe;AAAA,OACjF;AACA,MAAA,IAAI,iBAAiB,aAAA,CAAc,OAAA,IAAW,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC9E,QAAA,MAAM,WAAA,GAAc,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA;AAC3C,QAAA,aAAA,GAAgB,aAAa,IAAA,IAAQ,EAAA;AAAA,MACvC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;ACphBO,IAAM,oBAAN,MAAwB;AAAA,EACrB,MAAA;AAAA,EAER,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,YAAY,QAAA,EAAkD;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC3C,MAAA,MAAM,GAAA,GAAaY,aAAM,IAAA,EAAM;AAAA,QAC7B,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS,CAAC,KAAA,EAAO,YAAA,EAAc,CAAC,cAAc,EAAE,sBAAA,EAAwB,IAAA,EAAM,CAAC;AAAA,OAChF,CAAA;AAED,MAAA,MAAM,aAAoC,EAAC;AAE3C,MAAAX,UAAS,GAAA,EAAK;AAAA,QACZ,UAAA,EAAY,CAACI,KAAAA,KAAS;AACpB,UAAA,MAAM,SAAA,GAAY,IAAA,CAAK,8BAAA,CAA+BA,KAAAA,CAAK,IAAI,CAAA;AAC/D,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,OACD,CAAA;AAED,MAAA,OAAO,UAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC1D,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,+BACN,OAAA,EAC4B;AAC5B,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,cAAc,CAAA;AAC9D,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,sBAAA,CAAuB,WAAW,CAAA;AACpD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,cAAc,CAAA;AACtD,IAAA,MAAM,EAAE,MAAA,EAAQ,kBAAA,KAAuB,IAAA,CAAK,yBAAA,CAA0B,QAAQ,cAAc,CAAA;AAC5F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA;AAEtD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,IAAA;AAAA,MACA,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,MAAA;AAAA,MAC/C,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,MAC3C,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,eAAe,cAAA,EAAoD;AACzE,IAAA,IAAMQ,UAAA,CAAA,eAAA,CAAgB,cAAA,CAAe,IAAI,CAAA,EAAG;AAC1C,MAAA,OAAO,eAAe,IAAA,CAAK,IAAA;AAAA,IAC7B;AACA,IAAA,IAAMA,UAAA,CAAA,qBAAA,CAAsB,cAAA,CAAe,IAAI,CAAA,EAAG;AAChD,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,UACF,cAAA,CAAe,IAAA;AACjB,MAAA,OAASA,UAAA,CAAA,qBAAA,CAAsB,OAAO,CAAA,EAAG;AACvC,QAAA,IAAMA,UAAA,CAAA,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACvC,UAAA,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,QACrC;AACA,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,MACpB;AACA,MAAA,IAAMA,UAAA,CAAA,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC9B,QAAA,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,MAC5B;AACA,MAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,uBACN,IAAA,EAC2D;AAC3D,IAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,EAAQ,YAAA,EAAc,gBAAgB,sBAAsB,CAAA;AACpF,IAAA,MAAM,eAAA,GAAkB,CAAC,WAAA,EAAa,OAAO,CAAA;AAC7C,IAAA,MAAM,gBAAA,GAAmB,CAAC,kBAAA,EAAoB,WAAA,EAAa,QAAQ,CAAA;AACnE,IAAA,MAAM,cAAA,GAAiB,CAAC,UAAA,EAAY,aAAa,CAAA;AACjD,IAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,EAAS,aAAa,CAAA;AAE/C,IAAA,IAAI,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,MAAA;AAC1C,IAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,OAAA;AAC3C,IAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,QAAA;AAC5C,IAAA,IAAI,cAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,MAAA;AAC1C,IAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,OAAA;AAE3C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,aAAa,cAAA,EAA6D;AAChF,IAAA,MAAM,QAAgC,EAAC;AAEvC,IAAA,KAAA,MAAW,IAAA,IAAQ,eAAe,UAAA,EAAY;AAC5C,MAAA,IAAMA,0BAAe,IAAI,CAAA,IAAOA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1D,QAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,IAAA;AAE3B,QAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AAEvB,UAAA,KAAA,CAAM,QAAQ,CAAA,GAAI,MAAA;AAAA,QACpB,CAAA,MAAA,IAAaA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AACxC,UAAA,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,QAC/B,CAAA,MAAA,IAAaA,oCAAyB,IAAA,CAAK,KAAK,KAAOA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAC7F,UAAA,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,KAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,0BAA0B,cAAA,EAGhC;AACA,IAAA,MAAM,SAA2D,EAAC;AAElE,IAAA,KAAA,MAAW,IAAA,IAAQ,eAAe,UAAA,EAAY;AAC5C,MAAA,IAAMA,0BAAe,IAAI,CAAA,IAAOA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1D,QAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,IAAA;AAE3B,QAAA,IAAA,CAAK,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,oBAAA,KAAyB,KAAK,KAAA,EAAO;AAC9E,UAAA,IAAMA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,EAAG;AACjC,YAAA,MAAA,CAAO,QAA+B,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,KAAA;AAAA,UACvD,CAAA,MAAA,IAAaA,oCAAyB,IAAA,CAAK,KAAK,KAAOA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAC7F,YAAA,MAAA,CAAO,QAA+B,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,KAAA;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CACN,QAAA,EACA,KAAA,GAAgB,CAAA,EAChB,WAAmB,CAAA,EACI;AACvB,IAAA,IAAI,KAAA,IAAS,QAAA,EAAU,OAAO,EAAC;AAE/B,IAAA,MAAM,YAAmC,EAAC;AAE1C,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAMA,UAAA,CAAA,YAAA,CAAa,KAAK,CAAA,EAAG;AACzB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,8BAAA,CAA+B,KAAK,CAAA;AAC3D,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,KAAK,SAAS,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AC9JO,IAAM,eAAN,MAAmB;AAAA,EAChB,MAAA;AAAA,EACA,cAAA,uBAAqE,GAAA,EAAI;AAAA,EACzE,gBAOH,EAAC;AAAA,EACE,gBAA6D,EAAC;AAAA,EAEtE,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,YAAY,QAAA,EAA6C;AAC7D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAOC,YAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC3C,MAAA,MAAM,GAAA,GAAaC,aAAM,IAAA,EAAM;AAAA,QAC7B,UAAA,EAAY,QAAA;AAAA,QACZ,OAAA,EAAS,CAAC,KAAA,EAAO,YAAA,EAAc,CAAC,cAAc,EAAE,sBAAA,EAAwB,IAAA,EAAM,CAAC;AAAA,OAChF,CAAA;AAED,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,MAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,MAAA,IAAA,CAAK,gBAAgB,EAAC;AAGtB,MAAAd,UAAS,GAAA,EAAK;AAAA,QACZ,cAAA,EAAgB,CAACI,KAAAA,KAAS;AACxB,UAAA,IAAA,CAAK,qBAAA,CAAsBA,MAAK,IAAI,CAAA;AAAA,QACtC;AAAA,OACD,CAAA;AAGD,MAAAJ,UAAS,GAAA,EAAK;AAAA,QACZ,UAAA,EAAY,CAACI,KAAAA,KAAS;AACpB,UAAA,IAAA,CAAK,mBAAA,CAAoBA,MAAK,IAAI,CAAA;AAAA,QACpC;AAAA,OACD,CAAA;AAGD,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,sBAAA,CAAuB,GAAG,CAAA;AAGvD,MAAA,OAAO,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU,eAAe,CAAA;AAAA,IAClD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACnE,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,sBAAsB,IAAA,EAA8B;AAC1D,IAAA,IACIW,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA,IAC1B,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,UAAA,IACrB,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EACxB;AAGA,MAAA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,OAAA,EAA6B;AACvD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,cAAc,CAAA;AAE9D,IAAA,IAAI,CAAC,WAAA,EAAa;AAGlB,IAAA,IAAI,WAAA,KAAgB,WAAA,IAAe,WAAA,KAAgB,OAAA,EAAS;AAC1D,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,OAAA,CAAQ,cAAc,CAAA;AAC9D,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,IACnC;AAGA,IAAA,IAAI,CAAC,kBAAA,EAAoB,WAAA,EAAa,QAAQ,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG;AACrE,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,cAAc,CAAA;AAChE,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,aAAA,CAAc,KAAK,UAAU,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBACN,cAAA,EAQA;AACA,IAAA,MAAM,IAAA,GAOF,EAAE,OAAA,EAAS,EAAA,EAAG;AAElB,IAAA,KAAA,MAAW,IAAA,IAAQ,eAAe,UAAA,EAAY;AAC5C,MAAA,IAAMA,0BAAe,IAAI,CAAA,IAAOA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1D,QAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,IAAA;AAC3B,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA;AAEvD,QAAA,QAAQ,QAAA;AAAU,UAChB,KAAK,OAAA;AACH,YAAA,IAAA,CAAK,KAAA,GAAQ,SAAA;AACb,YAAA;AAAA,UACF,KAAK,aAAA;AACH,YAAA,IAAA,CAAK,WAAA,GAAc,SAAA;AACnB,YAAA;AAAA,UACF,KAAK,cAAA;AACH,YAAA,IAAA,CAAK,YAAA,GAAe,SAAA;AACpB,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,YAAA;AAAA,UACF,KAAK,YAAA;AACH,YAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAClB,YAAA,IAAI,SAAA,OAAgB,OAAA,GAAU,SAAA;AAC9B,YAAA;AAAA,UACF,KAAK,OAAA;AAEH,YAAA,IAAI,IAAA,CAAK,KAAA,IAAWA,UAAA,CAAA,wBAAA,CAAyB,IAAA,CAAK,KAAK,KAAOA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AACjG,cAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA;AAAA,YACvC;AACA,YAAA;AAAA;AACJ,MACF;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,kBACN,cAAA,EAC6C;AAC7C,IAAA,MAAM,OAA6C,EAAC;AAEpD,IAAA,KAAA,MAAW,IAAA,IAAQ,eAAe,UAAA,EAAY;AAC5C,MAAA,IAAMA,0BAAe,IAAI,CAAA,IAAOA,UAAA,CAAA,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1D,QAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,IAAA;AAE3B,QAAA,IAAI,QAAA,KAAa,OAAA,IAAW,QAAA,KAAa,OAAA,EAAS;AAChD,UAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,UAAA,IAAI,IAAA,CAAK,KAAA,IAAWA,UAAA,CAAA,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA,EAAG;AACxD,YAAA,IAAMA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AACzC,cAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,IAAA;AAAA,YACvC,CAAA,MAAA,IAAaA,UAAA,CAAA,yBAAA,CAA0B,IAAA,CAAK,KAAA,CAAM,UAAU,KAAOA,UAAA,CAAA,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG;AAC9G,cAAA,IAAA,CAAK,OAAA,GAAU,WAAA;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO,IAAA;AAAA,EAC/C;AAAA,EAEQ,sBAAsB,KAAA,EAAoD;AAChF,IAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,IAAA,IAAMA,UAAA,CAAA,eAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,KAAA,CAAM,KAAA;AAC3C,IAAA,IAAMA,oCAAyB,KAAK,CAAA,IAAOA,UAAA,CAAA,eAAA,CAAgB,KAAA,CAAM,UAAU,CAAA,EAAG;AAC5E,MAAA,OAAO,MAAM,UAAA,CAAW,KAAA;AAAA,IAC1B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAe,cAAA,EAAoD;AACzE,IAAA,IAAMA,UAAA,CAAA,eAAA,CAAgB,cAAA,CAAe,IAAI,CAAA,EAAG;AAC1C,MAAA,OAAO,eAAe,IAAA,CAAK,IAAA;AAAA,IAC7B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,uBAAuB,GAAA,EAAqC;AAClE,IAAA,MAAM,QAAgC,EAAC;AAEvC,IAAAf,UAAS,GAAA,EAAK;AAAA,MACZ,WAAA,EAAa,CAACI,KAAAA,KAAS;AACrB,QAAA,MAAM,IAAA,GAAOA,MAAK,IAAA,CAAK,IAAA;AACvB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,wBAAA,CAAyB,IAAI,CAAA;AAC/C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,IAAA;AAC/B,UAAA,IAAI,SAAS,WAAA,EAAa;AACxB,YAAA,KAAA,CAAM,KAAK,CAAA,GAAI,WAAA;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,yBACN,IAAA,EAC+C;AAC/C,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,WAAA,GAAc,EAAA;AAGlB,IAAA,IAAMW,UAAA,CAAA,iBAAA,CAAkB,IAAI,CAAA,IAAK,IAAA,CAAK,aAAa,GAAA,EAAK;AACtD,MAAA,IAAMA,UAAA,CAAA,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACrC,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,QAAA,IAAMA,UAAA,CAAA,kBAAA,CAAmB,QAAA,CAAS,MAAM,CAAA,EAAG;AACzC,UAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,UAAA,IAAMA,UAAA,CAAA,YAAA,CAAa,UAAA,CAAW,MAAM,CAAA,EAAG;AACrC,YAAA,SAAA,GAAY,WAAW,MAAA,CAAO,IAAA;AAC9B,YAAA,WAAA,GAAc,GAAG,SAAS,CAAA,YAAA,CAAA;AAAA,UAC5B;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAaA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxC,QAAA,SAAA,GAAY,KAAK,QAAA,CAAS,IAAA;AAC1B,QAAA,WAAA,GAAc,GAAG,SAAS,CAAA,YAAA,CAAA;AAAA,MAC5B;AAAA,IACF;AAGA,IAAA,IAAMA,UAAA,CAAA,kBAAA,CAAmB,IAAI,CAAA,KAAM,IAAA,CAAK,aAAa,GAAA,IAAO,IAAA,CAAK,aAAa,IAAA,CAAA,EAAO;AACnF,MAAA,IAAMA,UAAA,CAAA,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,QAAA,MAAM,aAAa,IAAA,CAAK,IAAA;AACxB,QAAA,IAAMA,UAAA,CAAA,YAAA,CAAa,UAAA,CAAW,MAAM,CAAA,EAAG;AACrC,UAAA,SAAA,GAAY,WAAW,MAAA,CAAO,IAAA;AAC9B,UAAA,IAAMA,UAAA,CAAA,gBAAA,CAAiB,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,YAAA,WAAA,GAAc,CAAA,EAAG,SAAS,CAAA,kBAAA,EAAqB,IAAA,CAAK,MAAM,KAAK,CAAA,WAAA,CAAA;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAMA,UAAA,CAAA,iBAAA,CAAkB,IAAI,CAAA,IAAK,IAAA,CAAK,aAAa,GAAA,EAAK;AACtD,MAAA,IAAMA,UAAA,CAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA,IAAOA,8BAAmB,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACnF,QAAA,MAAM,UAAA,GAAeA,UAAA,CAAA,YAAA,CAAa,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,GAC3D,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAA,CAAS,IAAA,GAC9B,IAAA;AACJ,QAAA,IAAI,eAAe,UAAA,IAAgBA,UAAA,CAAA,YAAA,CAAa,KAAK,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG;AAC5E,UAAA,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,IAAA;AACxC,UAAA,WAAA,GAAc,GAAG,SAAS,CAAA,kBAAA,CAAA;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,aAAa,WAAA,GAAc,EAAE,KAAA,EAAO,SAAA,EAAW,aAAY,GAAI,IAAA;AAAA,EACxE;AAAA,EAEQ,UAAA,CAAW,UAAkB,eAAA,EAA2D;AAC9F,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,CAAA,SAAU,EAAC;AAE7C,IAAA,MAAM,QAAA,GAAgBC,KAAA,CAAA,QAAA,CAAS,QAAA,EAAeA,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,GAAG,QAAQ,CAAA,IAAA,CAAA,CAAO,QAAQ,SAAA,EAAW,EAAE,EAAE,WAAA,EAAY;AAEpE,IAAA,MAAM,MAAA,GAAgC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,KAAU;AACtE,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC3C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,SAAS,eAAe,CAAA;AAEpE,MAAA,OAAO;AAAA,QACL,MAAM,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,OAAA,IAAW,MAAM,MAAA,IAAU,OAAA;AAAA,QAC3D,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,IAAA,EAAM,SAAA;AAAA,QACN,QAAA;AAAA,QACA,aAAa,KAAA,CAAM;AAAA,OACrB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,aAAa,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,aAAA,CAAc,SAAS,CAAC,CAAA;AACnE,IAAA,MAAM,eAAe,UAAA,EAAY,OAAA;AAEjC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,MAAA;AAAA,QACJ,MAAA;AAAA,QACA,YAAA;AAAA,QACA,iBAAiB,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,CAAE,MAAA,GAAS,IAAI,eAAA,GAAkB;AAAA;AAC/E,KACF;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAOS;AAC9B,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAY;AAC/C,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,EAAO,WAAA,EAAY,IAAK,EAAA;AACjD,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,WAAA,EAAa,WAAA,EAAY,IAAK,EAAA;AAC7D,IAAA,MAAM,WAAW,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,UAAU,IAAI,gBAAgB,CAAA,CAAA;AAGlE,IAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,eAAA,IAAmB,KAAA,CAAM,iBAAiB,OAAA,EAAS;AAC5E,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAA,CAAM,YAAA,KAAiB,WAAA,IAAe,KAAA,CAAM,iBAAiB,SAAA,EAAW;AAC1E,MAAA,OAAO,KAAA,CAAM,YAAA,KAAiB,SAAA,GAAY,QAAA,GAAW,OAAA;AAAA,IACvD;AAGA,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG,OAAO,OAAA;AACvC,IAAA,IAAI,QAAA,CAAS,SAAS,OAAO,CAAA,IAAK,SAAS,QAAA,CAAS,KAAK,GAAG,OAAO,OAAA;AACnE,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG,OAAO,MAAA;AAC1C,IAAA,IAAI,QAAA,CAAS,SAAS,QAAQ,CAAA,IAAK,SAAS,QAAA,CAAS,SAAS,GAAG,OAAO,QAAA;AACxE,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AACtC,IAAA,IAAI,QAAA,CAAS,SAAS,QAAQ,CAAA,IAAK,SAAS,QAAA,CAAS,OAAO,GAAG,OAAO,QAAA;AACtE,IAAA,IAAI,QAAA,CAAS,SAAS,QAAQ,CAAA,IAAK,SAAS,QAAA,CAAS,QAAQ,GAAG,OAAO,QAAA;AAEvE,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CAAgB,WAAmB,KAAA,EAAwC;AACjF,IAAA,MAAM,IAAA,GAAO,MAAM,SAAS,CAAA;AAC5B,IAAA,OAAO,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AAAA,EACvD;AACF;;;ACpUO,SAAS,qBAAqB,MAAA,EAA4C;AAC/E,EAAA,MAAM,UAAU,YAAA,CAAa;AAAA,IAC3B,GAAG,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAAA,IAChC,GAAG,kBAAA,CAAmB,MAAA,CAAO,OAAO,CAAA;AAAA,IACpC,GAAG,sBAAA,CAAuB,MAAA,CAAO,WAAA,IAAe,EAAE;AAAA,GACnD,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,MAAe,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,GAAI,OAAA,CAAQ,MAAA,GAAS,IAAI,EAAE,OAAA,KAAY,EAAC;AAAA,IACxC,GAAI,KAAA,CAAM,MAAA,GAAS,IAAI,EAAE,KAAA,KAAU,EAAC;AAAA,IACpC,GAAI,UAAA,GAAa,EAAE,UAAA,KAAe;AAAC,GACrC;AACF;AAEA,SAAS,iBAAiB,KAAA,EAA6C;AACrE,EAAA,MAAM,UAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,EAAA,EAAI,KAAA,CAAM,OAAA,EAAS,EAAA,IAAM,KAAA,CAAM,IAAA;AAAA,QAC/B,IAAA,EAAM,YAAY,KAAK,CAAA;AAAA,QACvB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,WAAW,KAAA,CAAM,IAAA;AAAA,QACjB,OAAA,EAAS,MAAM,OAAA,IAAW,EAAE,IAAI,KAAA,CAAM,IAAA,EAAM,QAAQ,UAAA,EAAW;AAAA,QAC/D,iBAAiB,KAAA,CAAM;AAAA,OACxB,CAAA;AAAA,IACH;AACA,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,KAAiB,WAAA,EAAa;AAC1D,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAI,IAAA,CAAK,YAAA;AAAA,QACT,IAAA,EAAM,QAAA;AAAA,QACN,UAAU,IAAA,CAAK,YAAA;AAAA,QACf,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,YAAY,KAAA,EAAsD;AACzE,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,OAAO,QAAA;AACpC,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,OAAO,QAAA;AACpC,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ,OAAO,MAAA;AAClC,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,mBAAmB,OAAA,EAAiD;AAC3E,EAAA,OAAO,OAAA,CACJ,OAAO,CAAC,MAAA,KAAW,OAAO,EAAE,CAAA,CAC5B,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IAChB,EAAA,EAAI,MAAA,CAAO,OAAA,EAAS,EAAA,IAAM,MAAA,CAAO,EAAA;AAAA,IACjC,IAAA,EAAM,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,QAAA,GAAW,QAAA;AAAA,IAC5C,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AAAA,IACpF,UAAU,MAAA,CAAO,EAAA;AAAA,IACjB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,sBAAsB,MAAA,CAAO,oBAAA;AAAA,IAC7B,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,IACzB,iBAAiB,MAAA,CAAO;AAAA,GAC1B,CAAE,CAAA;AACN;AAEA,SAAS,uBAAuB,WAAA,EAAyD;AACvF,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,MAAgB;AAAA,IACtC,IAAI,UAAA,CAAW,EAAA;AAAA,IACf,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,UAAA,CAAW,QAAA,IAAY,UAAA,CAAW,cAAc,UAAA,CAAW,EAAA;AAAA,IAClE,OAAA,EAAS,EAAE,EAAA,EAAI,UAAA,CAAW,IAAI,MAAA,EAAQ,UAAA,CAAW,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAS;AAAA,IACtE,iBAAiB,UAAA,CAAW;AAAA,GAC9B,CAAE,CAAA;AACJ;AAEA,SAAS,aAAa,OAAA,EAAiD;AACrE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA8B;AAC/C,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AAChB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,QAAA,GAAW,EAAE,GAAG,MAAA,EAAQ,GAAG,QAAA,EAAU,SAAS,QAAA,CAAS,OAAA,IAAW,MAAA,CAAO,OAAA,KAAY,MAAM,CAAA;AAAA,EACjH;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAC,CAAA;AAC1E;AAEA,SAAS,eAAA,CAAgB,QAA0B,OAAA,EAA+C;AAChG,EAAA,MAAM,QAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,MAAM,eAAe,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,MAAA,KAAW,OAAO,EAAA,KAAO,IAAA,CAAK,YAAY,CAAA,IAC/E,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,SAAS,QAAQ,CAAA;AAC7D,IAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA,EAAI,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,MACrB,KAAA,EAAO,aAAa,KAAA,GAAQ,CAAA,OAAA,EAAU,aAAa,KAAK,CAAA,CAAA,GAAK,CAAA,OAAA,EAAU,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,MAC9E,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,GAAG,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UAC7B,IAAA,EAAM,MAAM,IAAA,KAAS,QAAA,GAAW,WAAW,KAAA,CAAM,IAAA,KAAS,WAAW,QAAA,GAAW,MAAA;AAAA,UAChF,QAAQ,KAAA,CAAM,IAAA;AAAA,UACd,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,aAAa,KAAA,CAAM;AAAA,SACrB,CAAE,CAAA;AAAA,QACF,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,aAAa,EAAA,EAAI,KAAA,EAAO,aAAa,KAAA,EAAM;AAAA,QACpE,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,YAAA,CAAa,YAAY,CAAA;AAAE,OAC1D;AAAA,MACA,UAAA,EAAY,oBAAoB,YAAY,CAAA;AAAA,MAC5C,aAAa,YAAA,CAAa,oBAAA,IAAwB,aAAa,WAAA,GAC3D,CAAC,wCAAwC,CAAA,GACzC;AAAA,KACL,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,IAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAO,YAAA,EAAc;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA,EAAI,CAAA,SAAA,EAAY,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,QACzB,KAAA,EAAO,OAAO,KAAA,GAAQ,CAAA,KAAA,EAAQ,OAAO,KAAK,CAAA,CAAA,GAAK,CAAA,YAAA,EAAe,MAAA,CAAO,YAAY,CAAA,CAAA;AAAA,QACjF,MAAA,EAAQ,UAAA;AAAA,QACR,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,QACjE,UAAA,EAAY,oBAAoB,MAAM;AAAA,OACvC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,oBAAA,EAAsB;AAC5D,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA,EAAI,CAAA,QAAA,EAAW,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,QACxB,KAAA,EAAO,OAAO,KAAA,GAAQ,CAAA,QAAA,EAAW,OAAO,KAAK,CAAA,CAAA,GAAK,CAAA,QAAA,EAAW,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,QACtE,MAAA,EAAQ,oBAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,OAAO,EAAA,EAAI,KAAA,EAAO,OAAO,KAAA,EAAM;AAAA,UACxD,EAAE,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,0DAAA,EAA2D;AAAA,UAC3F,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,YAAA,CAAa,MAAM,CAAA;AAAE,SACpD;AAAA,QACA,UAAA,EAAY,oBAAoB,MAAM,CAAA;AAAA,QACtC,WAAA,EAAa,CAAC,iCAAiC;AAAA,OAChD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,WAAA,IAAe,EAAC,EAAG;AACjD,IAAA,IAAI,WAAW,SAAA,IAAc,UAAA,CAAW,cAAc,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,EAAI;AACvF,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA,EAAI,CAAA,KAAA,EAAQ,UAAA,CAAW,EAAE,CAAA,CAAA;AAAA,QACzB,KAAA,EAAO,CAAA,kBAAA,EAAqB,UAAA,CAAW,EAAE,CAAA,CAAA;AAAA,QACzC,MAAA,EAAQ,aAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,EAAE,IAAA,EAAM,kBAAA,EAAoB,QAAQ,UAAA,CAAW,EAAA,EAAI,aAAa,2DAAA,EAA4D;AAAA,UAC5H,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,UAAA,CAAW,SAAA,EAAW,eAAe,qBAAA;AAAsB,SAC3F;AAAA,QACA,YAAY,EAAE,eAAA,EAAiB,WAAW,SAAA,EAAW,YAAA,GAAe,eAAe,iBAAA;AAAkB,OACtG,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAC,CAAA;AACtD;AAEA,SAAS,oBAAoB,MAAA,EAAgD;AAC3E,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,aAAA,EAAe,IAAA,KAAS,QAAA,GACnD,QAAA,GACA,MAAA,CAAO,gBAAA,EAAkB,eAAA,KAAoB,MAAA,CAAO,YAAA,GAAe,YAAA,GAAe,MAAA,CAAA;AACtF,EAAA,MAAM,OAAA,GAAU,CAAC,MAAA,CAAO,aAAA,EAAe,OAAO,aAAa,CAAA,CAAE,OAAO,OAAO,CAAA;AAC3E,EAAA,OAAO;AAAA,IACL,GAAI,eAAA,GAAkB,EAAE,eAAA,KAAoB,EAAC;AAAA,IAC7C,GAAI,WAAW,OAAA,CAAQ,MAAA,GAAS,IAAI,EAAE,OAAA,KAAY,EAAC;AAAA,IACnD,GAAI,OAAO,gBAAA,EAAkB,cAAA,GAAiB,EAAE,KAAA,EAAO,GAAA,KAAU;AAAC,GACpE;AACF;AAEA,SAAS,aAAa,MAAA,EAAkC;AACtD,EAAA,IAAI,MAAA,CAAO,aAAA,EAAe,WAAA,EAAa,OAAO,OAAO,aAAA,CAAc,WAAA;AACnE,EAAA,IAAI,MAAA,CAAO,aAAA,EAAe,IAAA,KAAS,QAAA,EAAU,OAAO,mDAAA;AACpD,EAAA,IAAI,MAAA,CAAO,YAAA,EAAc,OAAO,CAAA,uBAAA,EAA0B,OAAO,YAAY,CAAA,CAAA;AAC7E,EAAA,IAAI,OAAO,gBAAA,EAAkB,eAAA,SAAwB,CAAA,SAAA,EAAY,MAAA,CAAO,iBAAiB,eAAe,CAAA,CAAA;AACxG,EAAA,OAAO,2BAAA;AACT;AAEA,SAAS,oBAAA,CACP,MAAA,EACA,OAAA,EACA,KAAA,EAC8B;AAC9B,EAAA,MAAM,gBAAA,GAAmB,QACtB,MAAA,CAAO,CAAC,WAAW,CAAC,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,CAAE,QAAA,CAAS,OAAO,IAAI,CAAC,CAAA,CACrE,KAAA,CAAM,CAAA,EAAG,CAAC,EACV,GAAA,CAAI,CAAC,MAAA,KAAW,MAAA,CAAO,EAAE,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,EAAE,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,KAAK,CAAA;AAC9D,EAAA,MAAM,cAAc,MAAA,CAAO,OAAA,CACxB,MAAA,CAAO,CAAC,WAAW,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,oBAAoB,EACpE,GAAA,CAAI,CAAC,WAAW,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,sBAAA,CAAwB,CAAA;AACvD,EAAA,MAAM,gBAAA,GAAmB,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,MAAA,CAAO,kBAAkB,cAAc,CAAA;AAEhG,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,WAAA,EAAa,sBAAsB,MAAM,CAAA;AAAA,IACzC,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,GAAI,mBAAmB,EAAE,UAAA,EAAY,oBAAoB,gBAAgB,CAAA,KAAM,EAAC;AAAA,IAChF,GAAI,WAAA,CAAY,MAAA,GAAS,IAAI,EAAE,WAAA,KAAgB;AAAC,GAClD;AAEA,EAAA,OAAO,KAAA,CAAM,eAAe,WAAA,CAAY,MAAA,GAAS,KAAK,gBAAA,CAAiB,MAAA,GAAS,IAC5E,KAAA,GACA,MAAA;AACN;AAEA,SAAS,sBAAsB,MAAA,EAA8C;AAC3E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,EAAC;AAE3C,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,MAAM,kBAAkB,WAAA,CACrB,GAAA,CAAI,CAAC,UAAA,KAAe,WAAW,QAAA,IAAY,UAAA,CAAW,UAAA,IAAc,UAAA,CAAW,EAAE,CAAA,CACjF,MAAA,CAAO,OAAO,CAAA,CACd,KAAA,CAAM,GAAG,CAAC,CAAA;AACb,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,eAAA,CAAgB,SAAS,CAAA,GACrB,CAAA,kBAAA,EAAqB,gBAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,UAAA,CAAA,GAC/C;AAAA,KACN;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAiC;AAC1D,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,MAAM,aAAa,YAAA,CAAa,IAAA;AAChC,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA;AAC1F,IAAA,MAAM,UAAA,GAAa,UAAA,KAAe,CAAA,GAAI,OAAA,GAAU,QAAA;AAChD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,aAAA,GAAgB,CAAA,GACZ,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA,EAAA,EAAK,aAAa,CAAA,UAAA,CAAA,GAClE,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA;AAAA,KACtD;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,YAAY,CAAA,CAAE,MAAA;AAC/E,EAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,eAAe,CAAA,eAAA,EAAkB,oBAAoB,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EACxF;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,IAAA,KAAS,QAAQ,CAAA,CAAE,MAAA;AAChF,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,KAAA,CAAM,IAAA,CAAK,UAAU,WAAA,KAAgB,CAAA,GAAI,qBAAqB,CAAA,EAAG,WAAW,gBAAgB,CAAA,CAAE,CAAA;AAAA,EAChG;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,CAAO,gBAAA,EAAkB,cAAc,CAAA,CAAE,MAAA;AAC9F,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,UAAA,KAAe,CAAA,GAAI,gBAAA,GAAmB,uBAAuB,CAAA,CAAE,CAAA;AAAA,EACxF;AAEA,EAAA,IAAI,MAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAC5C,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,gBAAA,EAAmB,OAAO,KAAK,CAAA,CAAA,CAAA;AACxD,EAAA,OAAO,MAAA;AACT;ACjOO,IAAM,eAAN,MAAmB;AAAA,EAChB,cAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EAER,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAEvB,IAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA,IAAW,CAAC,UAAA,EAAY,SAAA,EAAW,YAAY,SAAS,CAAA;AAAA,MACxE,SAAS,MAAA,CAAO,OAAA,IAAW,CAAC,oBAAA,EAAsB,mBAAmB,YAAY;AAAA,KACnF;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,MACzB,SAAA,EAAW,OAAO,SAAA,IAAa,WAAA;AAAA,MAC/B,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,KAAA;AAAA,MACjD,WAAA,EAAa,OAAO,WAAA,IAAe,KAAA;AAAA,MACnC,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,QAAA,GAA+B;AACnC,IAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AAGnD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,SAAA,IAAa,WAAA;AAC5C,IAAA,MAAM,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yCAAA,EAA4C,SAAS,CAAA,CAAE,CAAA;AAGnE,IAAA,MAAM,cAAA,GAAiB,IAAI,cAAA,CAAe,IAAA,CAAK,cAAA,EAAgB;AAAA,MAC7D,aAAA,EAAe,IAAA,CAAK,eAAA,CAAgB,aAAA,IAAiB,IAAA;AAAA,MACrD,cAAA,EAAgB,KAAK,eAAA,CAAgB;AAAA,KACtC,CAAA;AACD,IAAA,MAAM,kBAAA,GAAqB,IAAI,kBAAA,CAAmB,IAAA,CAAK,cAAA,EAAgB;AAAA,MACrE,iBAAA,EAAmB,KAAK,eAAA,CAAgB,iBAAA;AAAA,MACxC,iBAAA,EAAmB,KAAK,eAAA,CAAgB;AAAA,KACzC,CAAA;AACD,IAAA,MAAM,iBAAA,GAAoB,IAAI,iBAAA,CAAkB,IAAA,CAAK,cAAc,CAAA;AACnE,IAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,IAAA,CAAK,cAAc,CAAA;AAEzD,IAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AACjD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC9C,eAAe,OAAA,EAAQ;AAAA,MACvB,mBAAmB,OAAA;AAAQ,KAC5B,CAAA;AAED,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,8DAAA,EAAiE,QAAQ,MAAM,CAAA,QAAA;AAAA,KACjF;AAGA,IAAA,MAAM,cAAc,MAAMP,IAAAA;AAAA,MACxB,IAAA,CAAK,cAAA,CAAe,OAAA,IAAW,CAAC,YAAY,SAAS,CAAA;AAAA,MACrD;AAAA,QACE,GAAA,EAAK,KAAK,cAAA,CAAe,OAAA;AAAA,QACzB,MAAA,EAAQ,IAAA,CAAK,cAAA,CAAe,OAAA,IAAW,CAAC,oBAAoB;AAAA;AAC9D,KACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mDAAA,EAAsD,WAAA,CAAY,MAAM,CAAA,SAAA,CAAW,CAAA;AAG/F,IAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,GAAA,CAAI,OAAO,IAAA,KAAiB;AACjE,MAAA,MAAMQ,YAAWb,cAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,cAAA,CAAe,SAAS,IAAI,CAAA;AAC/D,MAAA,IAAI;AACF,QAAA,MAAM,CAAC,UAAA,EAAY,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,UAC5C,iBAAA,CAAkB,YAAYa,SAAQ,CAAA;AAAA,UACtC,YAAA,CAAa,YAAYA,SAAQ;AAAA,SAClC,CAAA;AACD,QAAA,OAAO,EAAE,QAAA,EAAAA,SAAAA,EAAU,UAAA,EAAY,KAAA,EAAM;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC/D,QAAA,OAAO,EAAE,UAAAA,SAAAA,EAAU,UAAA,EAAY,EAAC,EAAG,KAAA,EAAO,EAAC,EAAE;AAAA,MAC/C;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,MAAM,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AAG9D,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAGxB;AACF,IAAA,KAAA,MAAW,UAAU,iBAAA,EAAmB;AACtC,MAAA,aAAA,CAAc,GAAA,CAAI,OAAO,QAAA,EAAU;AAAA,QACjC,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,OAAO,MAAA,CAAO;AAAA,OACf,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC9C,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AACpD,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,MAAM,sBAAA,GAAyB,IAAI,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC3E,QAAA,MAAM,aAAA,GAAgB,WAAW,UAAA,CAAW,MAAA;AAAA,UAC1C,CAAC,CAAA,KAAW,CAAC,sBAAA,CAAuB,GAAA,CAAI,EAAE,IAAI;AAAA,SAChD;AAIA,QAAA,MAAM,WAAA,GAAgC,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UAChE,GAAG,IAAA;AAAA,UACH,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,MAAM;AAAA,SACzB,CAAE,CAAA;AACF,QAAA,KAAA,MAAW,OAAA,IAAW,WAAW,KAAA,EAAO;AACtC,UAAA,MAAM,YAAA,GACJ,WAAA,CAAY,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,OAAA,CAAQ,EAAE,CAAA,IACjD,IAAA,CAAK,wBAAA,CAAyB,aAAa,OAAO,CAAA;AACpD,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,IAAA,CAAK,SAAA,CAAU,cAAc,OAAO,CAAA;AAAA,UACtC,CAAA,MAAO;AACL,YAAA,WAAA,CAAY,IAAA,CAAK;AAAA,cACf,GAAG,OAAA;AAAA,cACH,MAAA,EAAQ,CAAC,GAAG,OAAA,CAAQ,MAAM,CAAA;AAAA,cAC1B,YAAA,EAAc,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,YAAY;AAAA,aAC1D,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,GAAG,MAAA;AAAA,UACH,YAAY,CAAC,GAAG,MAAA,CAAO,UAAA,EAAY,GAAG,aAAa,CAAA;AAAA,UACnD,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,iBAAA,GAAoB,eAAA,CAAgB,GAAA,CAAI,oBAAoB,CAAA;AAGlE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,cAAA,EAAe;AAC9C,IAAA,MAAM,cAAc,WAAA,CAAY,IAAA;AAEhC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,WAAW,CAAA,CAAE,CAAA;AAGzD,IAAA,MAAM,QAAA,GAAwB;AAAA,MAC5B,OAAA,EAAS,KAAK,OAAA,CAAQ,OAAA;AAAA,MACtB,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACpC,WAAA;AAAA,MACA,OAAA,EAAS,iBAAA;AAAA,MACT,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,gBAAA,EAAkB,OAAA;AAAA,QAClB,GAAI,YAAY,OAAA,GAAU,EAAE,YAAY,WAAA,CAAY,OAAA,KAAY,EAAC;AAAA,QACjE,cAAc,iBAAA,CAAkB,MAAA;AAAA,QAChC,UAAA,EAAY,iBAAA,CAAkB,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,QACxE,YAAA,EAAc,iBAAA,CAAkB,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,QAC5E,eAAe,WAAA,CAAY,MAAA;AAAA;AAAA,QAE3B,GAAI,eAAe,kBAAA,GAAqB,CAAA,GACpC,EAAE,kBAAA,EAAoB,cAAA,CAAe,kBAAA,EAAmB,GACxD;AAAC;AACP,KACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAGnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAGlD,IAAA,MAAM,WAAWb,cAAAA,CAAK,OAAA;AAAA,MACpB,SAAA;AAAA,MACA,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,KACrC;AACA,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,UAAA,EAAY,OAAO,CAAA;AAC7C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,QAAQ,CAAA,CAAE,CAAA;AAG7D,IAAA,MAAM,gBAAA,GAAmBA,cAAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,oBAAoB,CAAA;AACrE,IAAA,MAAM,SAAA,CAAU,gBAAA,EAAkB,QAAA,EAAU,OAAO,CAAA;AACnD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oCAAA,EAAuC,gBAAgB,CAAA,CAAE,CAAA;AAErE,IAAA,OAAA,CAAQ,IAAI,qCAAqC,CAAA;AAEjD,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,MACrB;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,qBAAqB,SAAA,EAA2C;AAC3E,IAAA,MAAM,gBAAA,GAAmBA,cAAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,oBAAoB,CAAA;AACrE,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,gBAAA,EAAkB,OAAO,CAAA;AACxD,MAAA,OAAO,OAAA,CAAQ,MAAK,IAAK,IAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAAA,EAAyB;AACjD,IAAA,OAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEQ,SAAA,CAAU,QAAwB,MAAA,EAA8B;AACtE,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,QAAQ,KAAK,CAAA;AACnE,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAA,CAAK,UAAA,CAAW,eAAe,KAAK,CAAA;AAAA,MACtC,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,MAAA,CAAO,eAAe,MAAA,CAAO,YAAA,IAAgB,IAAA,CAAK,iBAAA,CAAkB,OAAO,YAAY,CAAA;AACvF,IAAA,MAAA,CAAO,eAAA,GAAkB,MAAA,CAAO,eAAA,GAC5B,EAAE,GAAG,MAAA,CAAO,eAAA,EAAiB,GAAI,MAAA,CAAO,eAAA,IAAmB,EAAC,KAC5D,MAAA,CAAO,eAAA;AAAA,EACb;AAAA,EAEQ,mBAAA,CACN,QACA,QAAA,EACiC;AACjC,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU;AAC5B,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,CAAS,IAAA,IAAQ,MAAM,IAAA,KAAS,QAAA,CAAS,MAAM,OAAO,IAAA;AACxE,MAAA,IAAI,KAAA,CAAM,gBAAgB,QAAA,CAAS,YAAA,IAAgB,MAAM,YAAA,KAAiB,QAAA,CAAS,cAAc,OAAO,IAAA;AACxG,MAAA,IAAI,KAAA,CAAM,OAAA,EAAS,EAAA,IAAM,QAAA,CAAS,OAAA,EAAS,EAAA,IAAM,KAAA,CAAM,OAAA,CAAQ,EAAA,KAAO,QAAA,CAAS,OAAA,CAAQ,EAAA,EAAI,OAAO,IAAA;AAClG,MAAA,IAAI,KAAA,CAAM,eAAe,QAAA,CAAS,WAAA,IAAe,MAAM,WAAA,KAAgB,QAAA,CAAS,aAAa,OAAO,IAAA;AACpG,MAAA,IACE,KAAA,CAAM,OAAA,EAAS,kBAAA,IACf,QAAA,CAAS,OAAA,EAAS,kBAAA,IAClB,KAAA,CAAM,OAAA,CAAQ,kBAAA,KAAuB,QAAA,CAAS,OAAA,CAAQ,kBAAA,EACtD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,UAAA,CAAW,QAA6B,MAAA,EAAmC;AACjF,IAAA,IAAI,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,IAAI,CAAA,EAAG;AAC3F,MAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,IACvB;AACA,IAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA;AACtC,IAAA,MAAA,CAAO,WAAA,GAAc,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA;AAClD,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,IAAA,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,IAAA,MAAA,CAAO,eAAA,GAAkB,MAAA,CAAO,eAAA,IAAmB,MAAA,CAAO,eAAA;AAC1D,IAAA,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA;AACpD,IAAA,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,YAAA;AACpD,IAAA,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,SAAS,MAAA,EAAQ;AACpD,MAAA,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,kBAAkB,YAAA,EAAsD;AAC9E,IAAA,OAAO,YAAA,IAAgB,YAAA,KAAiB,WAAA,GAAc,YAAA,GAAe,MAAA;AAAA,EACvE;AAAA,EAEQ,wBAAwB,IAAA,EAAuB;AACrD,IAAA,OAAO,qDAAA,CAAsD,KAAK,IAAI,CAAA;AAAA,EACxE;AAAA,EAEQ,wBAAA,CACN,OACA,QAAA,EAC4B;AAC5B,IAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAEzC,IAAA,IAAI,IAAA;AACJ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAE,MAAA;AAChG,MAAA,IAAI,UAAU,CAAA,KAAM,CAAC,IAAA,IAAQ,OAAA,GAAU,KAAK,OAAA,CAAA,EAAU;AACpD,QAAA,IAAA,GAAO,EAAE,MAAM,OAAA,EAAQ;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,EAAM,IAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,GAA8D;AAC1E,IAAA,IAAI;AACF,MAAA,MAAM,kBAAkBA,cAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,cAAA,CAAe,SAAS,cAAc,CAAA;AAChF,MAAA,MAAM,kBAAA,GAAqB,MAAM,QAAA,CAAS,eAAA,EAAiB,OAAO,CAAA;AAClE,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA;AACjD,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAY,IAAA,IAAQ,iBAAA;AAAA,QAC1B,SAAS,OAAO,WAAA,CAAY,OAAA,KAAY,QAAA,GAAW,YAAY,OAAA,GAAU,KAAA;AAAA,OAC3E;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAK,wEAAwE,CAAA;AACrF,MAAA,OAAO,EAAE,MAAM,iBAAA,EAAkB;AAAA,IACnC;AAAA,EACF;AACF;ACnRO,SAAS,eAAA,CAAgB,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAmB;AAClF,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAkD;AAC/D,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,IAAA,OAAO,UAAU,OAAA,GAAU,MAAA;AAAA,EAC7B,CAAA;AACA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,gBAAgB,CAAA;AAAA,IAClC,SAAA,EAAW,KAAA,CAAM,GAAA,CAAI,mBAAmB,CAAA;AAAA,IACxC,SAAA,EAAW,KAAA,CAAM,GAAA,CAAI,mBAAmB;AAAA,GAC1C;AACF;AAUO,SAAS,UAAA,GAAoC;AAClD,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,MAAM,MAAM,eAAA,EAAgB;AAE5B,EAAA,IAAI,aAAsC,EAAC;AAC3C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,IAAA,CAAK,KAAA,CAAMS,YAAAA,CAAa,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,IAC3D,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAU,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,IAC7H;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,GAAA,CAAI,MAAA,EAAQ;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,SAAA,EAAW,uBAAA;AAAA,IACX,SAAA,EAAW,WAAA;AAAA,IACX,YAAA,EAAc,IAAA;AAAA,IACd,aAAA,EAAe,IAAA;AAAA,IACf,GAAG,UAAA;AAAA,IACH,GAAI,IAAI,MAAA,GAAS,EAAE,QAAQ,GAAA,CAAI,MAAA,KAAW,EAAC;AAAA,IAC3C,GAAI,IAAI,SAAA,GAAY,EAAE,WAAW,GAAA,CAAI,SAAA,KAAc,EAAC;AAAA,IACpD,GAAI,IAAI,SAAA,GAAY,EAAE,WAAW,GAAA,CAAI,SAAA,KAAc;AAAC,GACtD;AAEA,EAAA,MAAM,UAAA,GAAa,eAAe,MAAM,CAAA;AACxC,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,MAAM,SAAS,UAAA,IAAc,uBAAA;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,mCAAmC,MAAM,CAAA;AAAA,CAAA,GACvC,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAClD;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,UAAA,CAAW,KAAa,MAAA,EAAuC;AAC7E,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAK,aAAa,CAAA;AAC1C,EAAA,MAAM,cAAA,GAAiB,aAAA,EAAc,GAAI,UAAA,EAAW,GAAI,IAAA;AAExD,EAAA,MAAM,YAAA,GAA+B;AAAA,IACnC,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,cAAA,EAAgB,MAAA,IAAU,EAAA;AAAA,IACnD,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,cAAA,EAAgB,SAAA,IAAa,EAAA;AAAA,IAC5D,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,cAAA,EAAgB,SAAA,IAAa,uBAAA;AAAA,IAC5D,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,cAAA,EAAgB,SAAA,IAAa,WAAA;AAAA,IAC5D,cAAc,MAAA,CAAO,YAAA,KAAiB,SAAY,MAAA,CAAO,YAAA,GAAgB,gBAAgB,YAAA,IAAgB,IAAA;AAAA,IACzG,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,cAAA,EAAgB,OAAA;AAAA,IAC3C,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,cAAA,EAAgB,OAAA;AAAA,IAC3C,aAAA,EAAe,MAAA,CAAO,aAAA,IAAiB,cAAA,EAAgB,aAAA,IAAiB,IAAA;AAAA,IACxE,cAAA,EAAgB,MAAA,CAAO,cAAA,IAAkB,cAAA,EAAgB,cAAA;AAAA,IACzD,iBAAA,EAAmB,MAAA,CAAO,iBAAA,IAAqB,cAAA,EAAgB,iBAAA;AAAA,IAC/D,iBAAA,EAAmB,MAAA,CAAO,iBAAA,IAAqB,cAAA,EAAgB,iBAAA;AAAA,IAC/D,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,cAAA,EAAgB;AAAA,GACvC;AAEA,EAAA,IAAI;AACF,IAAA,aAAA,CAAc,YAAY,IAAA,CAAK,SAAA,CAAU,cAAc,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAAA,EAC1E,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,UAAU,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AAAA,EAC7H;AACF;AAQO,SAAS,aAAA,GAA+B;AAC7C,EAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AAExB,EAAA,OAAO,eAAe,IAAA,EAAM;AAC1B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,EAAY,aAAa,CAAA;AACjD,IAAA,IAAI;AACF,MAAA,IAAI,WAAW,UAAU,CAAA,IAAK,SAAS,UAAU,CAAA,CAAE,QAAO,EAAG;AAC3D,QAAA,OAAO,UAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,UAAA,GAAa,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,EACvC;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,EAAM,aAAa,CAAA;AAC/C,EAAA,IAAI;AACF,IAAA,IAAI,WAAW,cAAc,CAAA,IAAK,SAAS,cAAc,CAAA,CAAE,QAAO,EAAG;AACnE,MAAA,OAAO,cAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,eAAe,MAAA,EAA+B;AAC5D,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,CAAC,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACzC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,CAAC,iCAAiC;AAAA,KAC5C;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,IAAU,OAAO,MAAA,CAAO,WAAW,QAAA,EAAU;AACvD,IAAA,MAAA,CAAO,KAAK,yFAAyF,CAAA;AAAA,EACvG,WAAW,CAAC,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,EAAG;AAC3C,IAAA,MAAA,CAAO,KAAK,8BAA8B,CAAA;AAAA,EAC5C;AAIA,EAAA,IAAI,MAAA,CAAO,cAAc,MAAA,IAAa,MAAA,CAAO,cAAc,EAAA,IAAM,OAAO,MAAA,CAAO,SAAA,KAAc,QAAA,EAAU;AACrG,IAAA,MAAA,CAAO,KAAK,4BAA4B,CAAA;AAAA,EAC1C;AAGA,EAAA,IAAI,OAAO,SAAA,KAAc,MAAA,IAAa,OAAO,MAAA,CAAO,cAAc,QAAA,EAAU;AAC1E,IAAA,MAAA,CAAO,KAAK,4BAA4B,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,OAAO,SAAA,KAAc,MAAA,IAAa,OAAO,MAAA,CAAO,cAAc,QAAA,EAAU;AAC1E,IAAA,MAAA,CAAO,KAAK,4BAA4B,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,MAAA,CAAO,YAAY,MAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AAClE,IAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,IAAK,CAAC,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,IAAA,KAAkB,OAAO,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC9G,IAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,MAAA,CAAO,YAAY,MAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AAClE,IAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,IAAK,CAAC,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,IAAA,KAAkB,OAAO,IAAA,KAAS,QAAQ,CAAA,EAAG;AAC9G,IAAA,MAAA,CAAO,KAAK,qCAAqC,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI,OAAO,YAAA,KAAiB,MAAA,IAAa,OAAO,MAAA,CAAO,iBAAiB,SAAA,EAAW;AACjF,IAAA,MAAA,CAAO,KAAK,gCAAgC,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAO,aAAA,KAAkB,MAAA,IAAa,OAAO,MAAA,CAAO,kBAAkB,SAAA,EAAW;AACnF,IAAA,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAAA,EAC/C;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,CAAC,gBAAA,EAAkB,mBAAA,EAAqB,mBAAmB,CAAA,EAAY;AACzF,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,IAAA,IAAI,KAAA,KAAU,MAAA,KAAc,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA,IAAK,CAAC,KAAA,CAAM,MAAM,CAAC,IAAA,KAAkB,OAAO,IAAA,KAAS,QAAQ,CAAA,CAAA,EAAI;AAC/G,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAAA,IACpD;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAW;AAC7B,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,IAAA,KAAS,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AACzF,MAAA,MAAA,CAAO,KAAK,wBAAwB,CAAA;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,MAAM,aAAa,MAAA,CAAO,IAAA;AAC1B,MAAA,IAAI,WAAW,YAAA,KAAiB,MAAA,IAAa,OAAO,UAAA,CAAW,iBAAiB,QAAA,EAAU;AACxF,QAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,WAAW,YAAA,KAAiB,MAAA,IAAa,OAAO,UAAA,CAAW,iBAAiB,QAAA,EAAU;AACxF,QAAA,MAAA,CAAO,KAAK,oCAAoC,CAAA;AAAA,MAClD;AACA,MAAA,IACE,UAAA,CAAW,WAAA,KAAgB,MAAA,KAC1B,OAAO,UAAA,CAAW,WAAA,KAAgB,QAAA,IACjC,UAAA,CAAW,WAAA,GAAc,CAAA,IACzB,UAAA,CAAW,WAAA,GAAc,CAAA,CAAA,EAC3B;AACA,QAAA,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAAA,MACjE;AACA,MAAA,IACE,UAAA,CAAW,uBAAuB,MAAA,KACjC,OAAO,WAAW,kBAAA,KAAuB,QAAA,IAAY,UAAA,CAAW,kBAAA,GAAqB,CAAA,CAAA,EACtF;AACA,QAAA,MAAA,CAAO,KAAK,uDAAuD,CAAA;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AC1RA,IAAM,gBAAA,GACJ,wMAAA;AAEF,SAAS,WAAW,MAAA,EAAiE;AACnF,EAAA,IAAI,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,MAAA,KAAW,aAAA,EAAe;AACzD,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,qBAAA,EAAsB;AAAA,EACzD;AACA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,SAAS,cAAA,EAAgB;AAC9D,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,CAAA,CAAA,EAAI;AAAA,EAC3D;AACA,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA,CAAA;AAC3E,EAAA,IAAA,CAAK,MAAA,CAAO,SAAS,UAAA,IAAc,MAAA,CAAO,SAAS,QAAA,KAAa,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC/F,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,mCAAA,EAAoC;AAAA,EACvE;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAG;AACvC;AAMO,SAAS,mBAAmB,QAAA,EAA8C;AAC/E,EAAA,MAAM,WAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,MAAA,IAAU,SAAS,OAAA,EAAS;AACrC,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG;AACzC,MAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,WAAW,MAAM,CAAA;AAC9C,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,MAAM,UAA0C,EAAC;AACjD,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAA,CAAQ,KAAK,QAAQ,CAAA;AACzC,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,EAAW,OAAA,CAAQ,KAAK,WAAW,CAAA;AAC/C,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,UAAU,MAAA,CAAO,EAAA;AAAA,QACjB,YAAY,MAAA,CAAO,IAAA;AAAA,QACnB,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAOO,SAAS,uBAAuB,QAAA,EAA2C;AAChF,EAAA,OAAO,QAAA,CAAS,GAAA;AAAA,IACd,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,MAAM,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,EAAA,EAAK,EAAE,UAAU,CAAA,EAAA,EAAK,EAAE,MAAM,CAAA,WAAA,EAAc,EAAE,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GAClG;AACF;;;ACFA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,mBAAA,GAAsB,CAAA;AAC5B,IAAM,mBAAA,GAAsB,GAAA;AAKrB,IAAM,oBAAN,MAAwB;AAAA,EACrB,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnD,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AACrC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,mBAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,OAAA,CAAQ,GAAA,EAAa,IAAA,EAAsC;AACvE,IAAA,IAAI,SAAA;AACJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,YAAY,OAAA,EAAA,EAAW;AAC3D,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,UAAA,CAAW,GAAG,mBAAA,GAAsB,CAAA,KAAM,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA;AAAA,MAClF;AACA,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AACjE,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA;AACxE,QAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,OAAA,GAAU,KAAK,UAAA,EAAY;AACvD,UAAA,SAAA,GAAY,IAAI,MAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AACvE,UAAA;AAAA,QACF;AACA,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,OAAA,GAC1B,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,SAAS,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA,GAC/D,GAAA;AAAA,MACN,CAAA,SAAE;AACA,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,MAAM,qBAAqB,KAAA,GAAQ,SAAA,GAAY,IAAI,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,IAAA,CAAK,OAAA,EAAiB,OAAA,EAAiB,UAAA,EAA0C;AACrF,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,gBAAA,CAAA,EAAoB;AAAA,QACvE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,UACpC,GAAI,UAAA,GAAa,EAAE,eAAA,EAAiB,UAAA,KAAe;AAAC,SACtD;AAAA,QACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,SAAS;AAAA,OAC1C,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACzD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,KAAA;AAAA,UACX,KAAA,EAAQ,WAAW,KAAA,IAAoB,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,SACxF;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,KAAA,GAAS,KAAK,IAAA,IAAQ,IAAA;AAC5B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,GAAG;AAAA,OACL;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,KAAA;AAAA,QACX,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,GAAgC;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,kBAAA,CAAA,EAAsB;AAAA,QACzE,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA;AACtC,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACzD,QAAA,OAAO;AAAA,UACL,KAAA,EAAQ,WAAW,KAAA,IAAoB,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,SACxF;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,KAAA,GAAS,KAAK,IAAA,IAAQ,IAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAQ,SAAA,EAA0D;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,oBAAA,CAAA,EAAwB;AAAA,QAC3E,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAW;AAAA,OACnC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAa,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACzD,QAAA,MAAM,SAAS,SAAA,EAAW,KAAA;AAC1B,QAAA,OAAO;AAAA,UACL,KAAA,EACG,QAAQ,OAAA,IACT,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,UAAU,CAAA;AAAA,SACnD;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,MAAA,MAAM,KAAA,GAAS,KAAK,IAAA,IAAQ,IAAA;AAC5B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC,EAAE;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,GAA2B;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,cAAA,CAAA,EAAkB;AAAA,QACrE,MAAA,EAAQ;AAAA,OACT,CAAA;AACD,MAAA,OAAO,QAAA,CAAS,EAAA;AAAA,IAClB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF","file":"index.mjs","sourcesContent":["import { parse, type ParserPlugin } from '@babel/parser';\nimport type * as t from '@babel/types';\n\nexport const DEFAULT_PARSER_PLUGINS: ParserPlugin[] = [\n 'jsx',\n 'typescript',\n ['decorators', { decoratorsBeforeExport: true }],\n 'asyncGenerators',\n ['pipelineOperator', { proposal: 'minimal' }],\n 'partialApplication',\n 'logicalAssignment',\n 'classPrivateProperties',\n 'classPrivateMethods',\n ['recordAndTuple', { syntaxType: 'hash' }],\n];\n\nexport function parseSource(source: string, parserPlugins: ParserPlugin[] = []): t.File {\n return parse(source, {\n sourceType: 'module',\n plugins: [...DEFAULT_PARSER_PLUGINS, ...parserPlugins],\n }) as t.File;\n}\n","import * as t from '@babel/types';\n\nexport function findJsxAttribute(\n element: t.JSXOpeningElement,\n name: string,\n): t.JSXAttribute | undefined {\n return element.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && attr.name.name === name,\n );\n}\n\nexport function getStringAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr || !attr.value) return undefined;\n if (t.isStringLiteral(attr.value)) return attr.value.value;\n if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n return undefined;\n}\n\nexport function getBooleanAttr(\n element: t.JSXOpeningElement,\n name: string,\n): boolean | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr) return undefined;\n if (attr.value === null) return true;\n if (t.isStringLiteral(attr.value)) {\n if (attr.value.value === 'true') return true;\n if (attr.value.value === 'false') return false;\n }\n if (t.isJSXExpressionContainer(attr.value) && t.isBooleanLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n return undefined;\n}\n\nexport function getExpressionIdentifierAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n return t.isIdentifier(attr.value.expression) ? attr.value.expression.name : undefined;\n}\n\nexport function getMemberExpressionAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n const expr = attr.value.expression;\n if (t.isIdentifier(expr)) return expr.name;\n if (\n t.isMemberExpression(expr) &&\n t.isIdentifier(expr.object) &&\n t.isIdentifier(expr.property)\n ) {\n return `${expr.object.name}.${expr.property.name}`;\n }\n return undefined;\n}\n\nexport function hasJsxAttribute(element: t.JSXOpeningElement, name: string): boolean {\n return Boolean(findJsxAttribute(element, name));\n}\n\nexport function firstStringAttr(\n element: t.JSXOpeningElement,\n names: string[],\n): { name: string; value: string } | undefined {\n for (const name of names) {\n const value = getStringAttr(element, name);\n if (value) return { name, value };\n }\n return undefined;\n}\n","import type * as t from '@babel/types';\nimport {\n getExpressionIdentifierAttr,\n getStringAttr,\n hasJsxAttribute,\n} from './attributes';\n\nexport type SemanticComponentRole =\n | 'view'\n | 'input'\n | 'button'\n | 'list'\n | 'modal'\n | 'select'\n | 'toggle'\n | 'date'\n | 'custom';\n\nconst VIEW_COMPONENTS = new Set(['View', 'ScrollView', 'SafeAreaView', 'KeyboardAvoidingView']);\nconst INPUT_COMPONENTS = new Set(['TextInput', 'Input', 'HocInput']);\nconst BUTTON_COMPONENTS = new Set(['TouchableOpacity', 'Pressable', 'Button']);\nconst LIST_COMPONENTS = new Set(['FlatList', 'SectionList', 'VirtualizedList', 'FlashList']);\nconst MODAL_COMPONENTS = new Set(['Modal', 'BottomSheet']);\n\nexport function classifyJsxComponent(\n name: string,\n element?: t.JSXOpeningElement,\n): SemanticComponentRole {\n if (LIST_COMPONENTS.has(name)) return 'list';\n if (MODAL_COMPONENTS.has(name)) return 'modal';\n if (/date/i.test(name)) return 'date';\n if (/(select|picker|dropdown|radio)/i.test(name)) return 'select';\n if (/(checkbox|switch|toggle)/i.test(name)) return 'toggle';\n if (INPUT_COMPONENTS.has(name)) return 'input';\n if (BUTTON_COMPONENTS.has(name)) return 'button';\n\n if (element) {\n const hasOptions = hasJsxAttribute(element, 'options');\n const hasValue = hasJsxAttribute(element, 'value');\n const hasChecked = hasJsxAttribute(element, 'checked') || hasJsxAttribute(element, 'selected');\n const hasOnChange =\n hasJsxAttribute(element, 'onChange') ||\n hasJsxAttribute(element, 'onValueChange') ||\n hasJsxAttribute(element, 'onChangeText');\n const hasOnPress = hasJsxAttribute(element, 'onPress');\n\n if (hasOptions && (hasValue || hasOnChange)) return 'select';\n if (hasChecked && hasOnChange) return 'toggle';\n if (hasOnChange && (hasJsxAttribute(element, 'label') || hasJsxAttribute(element, 'placeholder'))) {\n return 'input';\n }\n if (hasOnPress) return 'button';\n if (getStringAttr(element, 'visible') || getExpressionIdentifierAttr(element, 'visible')) {\n return 'modal';\n }\n }\n\n if (VIEW_COMPONENTS.has(name)) return 'view';\n return 'custom';\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nexport function collectFunctions(ast: t.File): Map<string, t.Function> {\n const handlers = new Map<string, t.Function>();\n\n traverse(ast, {\n FunctionDeclaration: (nodePath) => {\n if (nodePath.node.id?.name) handlers.set(nodePath.node.id.name, nodePath.node);\n },\n VariableDeclarator: (nodePath) => {\n if (!t.isIdentifier(nodePath.node.id)) return;\n const init = nodePath.node.init;\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n handlers.set(nodePath.node.id.name, init);\n }\n },\n });\n\n return handlers;\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport type { AppilotsInferredAction, SignalDescriptor } from '../../types';\n\nexport interface FunctionBehavior {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: SignalDescriptor;\n failureSignal?: SignalDescriptor;\n opensModal?: string;\n loadingStateBindings?: string[];\n}\n\nconst DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\nexport function analyzeFunctionBehavior(\n name: string,\n fn: t.Function,\n handlers: Map<string, t.Function>,\n seen = new Set<string>(),\n): FunctionBehavior {\n if (seen.has(name)) {\n return {\n appilotsInferred: { expectedOutcome: 'none' },\n destructive: false,\n nativeConfirmationExpected: false,\n };\n }\n seen.add(name);\n\n let hasAwait = fn.async === true;\n let hasThen = false;\n let hasStateSetter = false;\n let nativeConfirmationExpected = false;\n let targetScreen: string | undefined;\n let successSignal: SignalDescriptor | undefined;\n let failureSignal: SignalDescriptor | undefined;\n let opensModal: string | undefined;\n let destructive = DESTRUCTIVE_VERB.test(name);\n const loadingStateBindings = new Set<string>();\n\n const inspectCall = (node: t.CallExpression) => {\n if (t.isMemberExpression(node.callee) && t.isIdentifier(node.callee.property)) {\n const method = node.callee.property.name;\n if (method === 'then' || method === 'catch' || method === 'finally') hasThen = true;\n if (\n t.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n ['navigate', 'push', 'replace'].includes(method)\n ) {\n const firstArg = node.arguments[0];\n if (t.isStringLiteral(firstArg)) {\n targetScreen = firstArg.value;\n successSignal = { type: 'navigation', target: firstArg.value };\n }\n }\n if (\n t.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n method === 'goBack'\n ) {\n successSignal = { type: 'goBack', description: 'Action returns to the previous screen' };\n }\n if (t.isIdentifier(node.callee.object) && node.callee.object.name === 'Alert' && method === 'alert') {\n nativeConfirmationExpected = true;\n }\n if (\n t.isIdentifier(node.callee.object) &&\n /(toast|notification|snackbar)/i.test(node.callee.object.name)\n ) {\n const firstArg = node.arguments[0];\n const secondArg = node.arguments[1];\n const text = t.isStringLiteral(secondArg)\n ? secondArg.value\n : t.isStringLiteral(firstArg)\n ? firstArg.value\n : undefined;\n const signal: SignalDescriptor = { type: 'toast', description: text };\n if (/(error|danger|fail)/i.test(method) || (t.isStringLiteral(firstArg) && /error/i.test(firstArg.value))) {\n failureSignal = signal;\n } else {\n successSignal = successSignal ?? signal;\n }\n }\n }\n\n if (t.isIdentifier(node.callee)) {\n const calleeName = node.callee.name;\n if (/^set[A-Z]/.test(calleeName)) {\n hasStateSetter = true;\n const stateName = setterToStateName(calleeName);\n const firstArg = node.arguments[0];\n if (stateName && t.isBooleanLiteral(firstArg)) {\n if (/loading|submitting|saving|fetching|refreshing/i.test(stateName)) {\n loadingStateBindings.add(stateName);\n }\n if (firstArg.value === true && !/loading|submitting|saving|fetching|refreshing/i.test(stateName)) {\n opensModal = opensModal ?? stateName;\n }\n }\n }\n if (DESTRUCTIVE_VERB.test(calleeName)) destructive = true;\n\n const nested = handlers.get(calleeName);\n if (nested) {\n const nestedInfo = analyzeFunctionBehavior(calleeName, nested, handlers, seen);\n hasAwait = hasAwait || nestedInfo.appilotsInferred.isAsyncTrigger === true;\n nativeConfirmationExpected ||= nestedInfo.nativeConfirmationExpected;\n destructive ||= nestedInfo.destructive;\n targetScreen = targetScreen ?? nestedInfo.targetScreen;\n successSignal = successSignal ?? nestedInfo.successSignal;\n failureSignal = failureSignal ?? nestedInfo.failureSignal;\n opensModal = opensModal ?? nestedInfo.opensModal;\n for (const binding of nestedInfo.loadingStateBindings ?? []) {\n loadingStateBindings.add(binding);\n }\n }\n }\n };\n\n const inspectNode = (node: t.Node) => {\n if (t.isAwaitExpression(node)) hasAwait = true;\n if (t.isCallExpression(node)) inspectCall(node);\n if (t.isMemberExpression(node) && t.isIdentifier(node.property) && DESTRUCTIVE_VERB.test(node.property.name)) {\n destructive = true;\n }\n };\n\n if (fn.body) {\n traverse(fn.body as any, {\n noScope: true,\n enter: (nodePath: any) => inspectNode(nodePath.node),\n } as any);\n }\n\n const expectedOutcome: AppilotsInferredAction['expectedOutcome'] = targetScreen\n ? 'navigation'\n : successSignal?.type === 'goBack'\n ? 'navigation'\n : hasStateSetter || successSignal?.type === 'toast' || opensModal\n ? 'inline-feedback'\n : hasAwait || hasThen\n ? 'mixed'\n : 'none';\n\n return {\n appilotsInferred: {\n isAsyncTrigger: hasAwait || hasThen || undefined,\n expectedOutcome,\n ...(loadingStateBindings.size > 0\n ? { loadingStateBindings: Array.from(loadingStateBindings).sort() }\n : {}),\n },\n destructive,\n nativeConfirmationExpected,\n targetScreen,\n successSignal,\n failureSignal,\n opensModal,\n loadingStateBindings: Array.from(loadingStateBindings).sort(),\n };\n}\n\nfunction setterToStateName(setterName: string): string | undefined {\n const raw = setterName.replace(/^set/, '');\n if (!raw) return undefined;\n return raw.charAt(0).toLowerCase() + raw.slice(1);\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nexport interface NavigationCall {\n method: 'navigate' | 'push' | 'replace' | 'goBack';\n targetScreen?: string;\n params?: Record<string, string>;\n}\n\nexport function extractNavigationCalls(ast: t.File | t.Node): NavigationCall[] {\n const calls: NavigationCall[] = [];\n traverse(ast as any, {\n noScope: !t.isFile(ast),\n CallExpression: (nodePath: any) => {\n const node = nodePath.node as t.CallExpression;\n if (\n !t.isMemberExpression(node.callee) ||\n !t.isIdentifier(node.callee.object) ||\n node.callee.object.name !== 'navigation' ||\n !t.isIdentifier(node.callee.property)\n ) {\n return;\n }\n const method = node.callee.property.name;\n if (!['navigate', 'push', 'replace', 'goBack'].includes(method)) return;\n const firstArg = node.arguments[0];\n const targetScreen = t.isStringLiteral(firstArg) ? firstArg.value : undefined;\n calls.push({\n method: method as NavigationCall['method'],\n ...(targetScreen ? { targetScreen } : {}),\n params: extractNavigationParams(node.arguments[1]),\n });\n },\n } as any);\n return calls;\n}\n\nexport function extractNavigationParams(arg: t.Node | undefined | null): Record<string, string> {\n const params: Record<string, string> = {};\n if (!arg || !t.isObjectExpression(arg)) return params;\n for (const prop of arg.properties) {\n if (!t.isObjectProperty(prop)) continue;\n const key = t.isIdentifier(prop.key)\n ? prop.key.name\n : t.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key) continue;\n if (\n t.isMemberExpression(prop.value) &&\n t.isIdentifier(prop.value.object) &&\n t.isIdentifier(prop.value.property)\n ) {\n params[key] = `${prop.value.object.name}.${prop.value.property.name}`;\n } else if (t.isIdentifier(prop.value)) {\n params[key] = prop.value.name;\n } else if (t.isStringLiteral(prop.value)) {\n params[key] = prop.value.value;\n }\n }\n return params;\n}\n","import type { ScreenPermissionDescriptor } from '../../types';\n\nexport function extractPermissionsFromJsDoc(\n source: string,\n): ScreenPermissionDescriptor | undefined {\n if (!source.includes('@appilots-')) return undefined;\n\n const result: ScreenPermissionDescriptor = {};\n let touched = false;\n\n const permRe = /@appilots-permissions\\s+([^\\n]+)/g;\n let m: RegExpExecArray | null;\n while ((m = permRe.exec(source))) {\n const rawLine = (m[1] ?? '').replace(/\\*\\/?\\s*$/, '').trim();\n const parsed = parsePermissionLine(rawLine);\n if (parsed) {\n Object.assign(result, parsed);\n touched = true;\n break;\n }\n }\n\n if (/@appilots-pii\\b/.test(source)) {\n result.isPii = true;\n touched = true;\n }\n\n const blockedRe = /@appilots-blocked-actions\\s+([^\\n]+)/;\n const blockedMatch = blockedRe.exec(source);\n if (blockedMatch && blockedMatch[1]) {\n const ids = blockedMatch[1]\n .replace(/\\*\\/?\\s*$/, '')\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n if (ids.length > 0) {\n result.blockedActions = ids;\n touched = true;\n }\n }\n\n return touched ? result : undefined;\n}\n\nexport function extractDestructiveJsDocTargets(\n source: string,\n): Set<string> | '*' | undefined {\n if (!/@appilots-destructive\\b/.test(source)) return undefined;\n\n const out = new Set<string>();\n const re = /@appilots-destructive\\s*([^\\n]*)/g;\n let bareSeen = false;\n let m: RegExpExecArray | null;\n while ((m = re.exec(source))) {\n const rest = (m[1] ?? '').replace(/\\*\\/?\\s*$/, '').trim();\n if (!rest) {\n bareSeen = true;\n continue;\n }\n for (const id of rest.split(/[,\\s]+/).map((s) => s.trim()).filter(Boolean)) {\n out.add(id);\n }\n }\n\n if (out.size === 0) return bareSeen ? '*' : undefined;\n return out;\n}\n\nfunction parsePermissionLine(line: string): ScreenPermissionDescriptor | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('{')) {\n const candidate = trimmed.replace(/'/g, '\"');\n try {\n const obj = JSON.parse(candidate);\n if (obj && typeof obj === 'object') {\n return sanitisePermissionsObject(obj as Record<string, unknown>);\n }\n } catch {\n // Fall through to key=value parsing.\n }\n }\n\n const out: Record<string, unknown> = {};\n for (const pair of trimmed.split(/[,\\s]+/)) {\n const [k, v] = pair.split('=');\n if (!k || v === undefined) continue;\n const key = k.trim();\n const value = v.trim().replace(/^['\"]|['\"]$/g, '');\n if (value === 'true') out[key] = true;\n else if (value === 'false') out[key] = false;\n else out[key] = value;\n }\n return Object.keys(out).length > 0 ? sanitisePermissionsObject(out) : null;\n}\n\nfunction sanitisePermissionsObject(\n obj: Record<string, unknown>,\n): ScreenPermissionDescriptor {\n const out: ScreenPermissionDescriptor = {};\n if (\n typeof obj.agentAccess === 'string' &&\n (obj.agentAccess === 'read' || obj.agentAccess === 'write' || obj.agentAccess === 'none')\n ) {\n out.agentAccess = obj.agentAccess;\n }\n if (typeof obj.requiresConfirmation === 'boolean') {\n out.requiresConfirmation = obj.requiresConfirmation;\n }\n if (typeof obj.isPii === 'boolean') {\n out.isPii = obj.isPii;\n }\n if (Array.isArray(obj.blockedActions)) {\n const ids = obj.blockedActions.filter((x): x is string => typeof x === 'string' && !!x);\n if (ids.length > 0) out.blockedActions = ids;\n }\n return out;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport traverse from '@babel/traverse';\nimport * as BabelTypes from '@babel/types';\nimport glob from 'fast-glob';\nimport { parseSource } from '../ast/parse';\nimport { classifyJsxComponent } from '../ast/jsx/classify';\nimport { collectFunctions } from '../ast/functions/collect';\nimport { analyzeFunctionBehavior } from '../ast/functions/analyze-async';\nimport { extractNavigationCalls } from '../ast/navigation/calls';\nimport {\n extractDestructiveJsDocTargets,\n extractPermissionsFromJsDoc,\n} from '../extractors/appilots/jsdoc';\nimport type {\n AnalyzerConfig,\n ScreenDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n ActionDescriptor,\n ComponentDescriptor,\n CollectionDescriptor,\n RowActionDescriptor,\n AppilotsInferredAction,\n LocatorDescriptor,\n} from '../types';\n\nexport { extractDestructiveJsDocTargets, extractPermissionsFromJsDoc } from '../extractors/appilots/jsdoc';\n\n/**\n * Analyzes React Native source files to extract screen definitions,\n * their components, forms, and available actions.\n *\n * The analyzer uses Babel AST to:\n * 1. Extract optional registerScreen() calls (developer-provided metadata)\n * 2. Detect exported component names\n * 3. Find navigation patterns (navigation.navigate calls)\n * 4. Identify form inputs (TextInput, Input components)\n * 5. Extract button/action handlers\n *\n * §1 Strict mode: when `strictScreens` is enabled in config, only files\n * containing a `registerScreen()` call or matching `screenPatterns` globs\n * are included in the output. This avoids components/hooks/utils being\n * listed as screens.\n */\nexport class ScreenAnalyzer {\n private config: AnalyzerConfig;\n private verbose = process.env.VERBOSE === 'true';\n /** When true, only files with registerScreen or matching screen patterns are included */\n private strictScreens: boolean;\n /** Glob patterns that identify screen files in strict mode */\n private screenPatterns: string[];\n /** §D: Count of screens filtered out in strict mode (available after analyze()) */\n public screensFilteredOut = 0;\n\n constructor(\n config: AnalyzerConfig,\n options?: { strictScreens?: boolean; screenPatterns?: string[] },\n ) {\n this.config = config;\n this.strictScreens = options?.strictScreens ?? false;\n this.screenPatterns = options?.screenPatterns ?? [\n '**/*Screen.{ts,tsx}',\n '**/screens/**/*.{ts,tsx}',\n ];\n }\n\n /** Analyze all screens in the project */\n async analyze(): Promise<ScreenDescriptor[]> {\n const { include = ['src/**/*Screen.{ts,tsx}'], exclude = ['node_modules/**'] } = this.config;\n\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] Searching with patterns:`, include);\n if (this.strictScreens) {\n console.log(`[ScreenAnalyzer] Strict mode ON — screen patterns:`, this.screenPatterns);\n }\n }\n\n // Find all matching files\n const files = await glob(include, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] Found ${files.length} files`);\n }\n\n // In strict mode, pre-compute which files match screen patterns\n let screenPatternFiles: Set<string> | null = null;\n if (this.strictScreens) {\n const matched = await glob(this.screenPatterns, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n screenPatternFiles = new Set(matched.map((f) => path.resolve(this.config.rootDir, f)));\n }\n\n const screens: ScreenDescriptor[] = [];\n this.screensFilteredOut = 0;\n\n for (const file of files) {\n const filePath = path.resolve(this.config.rootDir, file);\n try {\n const descriptor = await this.analyzeFile(filePath);\n if (!descriptor) continue;\n\n // §1+§B: In strict mode, filter out non-screen files\n // Uses actual registerScreen() call detection, not optional metadata fields\n if (this.strictScreens) {\n const hasRegisterScreen = (descriptor as any).__hasRegisterScreen === true;\n const matchesPattern = screenPatternFiles?.has(filePath) ?? false;\n\n if (!hasRegisterScreen && !matchesPattern) {\n this.screensFilteredOut++;\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] ✗ Filtered (strict): ${file}`);\n }\n continue;\n }\n }\n\n screens.push(descriptor);\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] ✓ Analyzed: ${descriptor.name} (${file})`);\n }\n } catch (error) {\n if (this.verbose) {\n console.warn(`[ScreenAnalyzer] Failed to parse ${file}:`, error instanceof Error ? error.message : error);\n }\n // Skip files that fail to parse\n }\n }\n\n if (this.verbose && this.strictScreens) {\n console.log(`[ScreenAnalyzer] Strict mode: ${screens.length} included, ${this.screensFilteredOut} filtered out`);\n }\n\n return screens;\n }\n\n /** Analyze a single file. Returns descriptor + whether registerScreen was found. */\n async analyzeFile(filePath: string): Promise<ScreenDescriptor | null> {\n const source = await fs.readFile(filePath, 'utf-8');\n const name = this.extractScreenName(filePath);\n\n // Parse the file with the shared parser so every extractor sees\n // the same syntax support and parser changes stay centralized.\n const ast = parseSource(source, this.config.parserPlugins as any);\n\n // Extract metadata from registerScreen call\n const registerScreenMeta = this.extractRegisterScreenMetadata(ast);\n\n // §B: Track whether registerScreen() was actually called in this file\n const hasRegisterScreenCall = this.detectRegisterScreenCall(ast);\n\n // Extract component name (default export)\n const componentName = this.extractDefaultComponentName(ast);\n\n // Extract navigation targets from AST\n const navigationTargets = this.extractNavigationTargets(ast);\n\n // Extract forms and fields. registerScreen metadata is the app\n // author's explicit contract, so keep it ahead of JSX inference.\n const forms = this.mergeForms(registerScreenMeta?.forms ?? [], this.extractForms(ast));\n\n // Extract components\n const components = this.extractComponents(ast);\n\n // Extract actions\n const actions = this.extractActions(ast, registerScreenMeta);\n\n // Extract list/collection semantics. This is the static complement\n // to the SDK's runtime list snapshot: it tells the agent what a row\n // represents and what pressing that row is expected to do.\n const collections = this.extractCollections(ast);\n\n // Extract @appilots-permissions / @appilots-pii JSDoc metadata\n // (BACKLOG 2.1). Reads source comments — runs against the raw\n // file text to keep the implementation simple (Babel comment\n // tokens differ between configurations).\n const permissionsFromJsDoc = extractPermissionsFromJsDoc(source);\n\n // BACKLOG 2.2 — `@appilots-destructive <action-id>[, <id>...]`\n // marks specific extracted actions as destructive. Without an\n // arg, marks ALL actions on the screen as destructive (rare,\n // but supported for screens like \"DeleteAccount\").\n const destructiveTags = extractDestructiveJsDocTargets(source);\n if (destructiveTags) {\n for (const action of actions) {\n if (destructiveTags === '*' || destructiveTags.has(action.id)) {\n action.destructive = true;\n }\n }\n }\n\n // Merge registerScreen metadata with AST analysis\n const descriptor: ScreenDescriptor = {\n name: registerScreenMeta?.name || name,\n filePath,\n title: registerScreenMeta?.title,\n description: registerScreenMeta?.description,\n components,\n forms,\n actions,\n navigationTargets,\n ...(collections.length > 0 ? { collections } : {}),\n ...(registerScreenMeta?.suggestedPrompts && registerScreenMeta.suggestedPrompts.length > 0\n ? { suggestedPrompts: registerScreenMeta.suggestedPrompts }\n : {}),\n ...(permissionsFromJsDoc\n ? {\n permissions: permissionsFromJsDoc,\n ...(permissionsFromJsDoc.isPii ? { isPii: true } : {}),\n }\n : {}),\n };\n\n // Attach flag for strict mode filtering (not part of the public type)\n (descriptor as any).__hasRegisterScreen = hasRegisterScreenCall;\n\n return descriptor;\n }\n\n /**\n * §B: Detect actual presence of registerScreen() call in the AST.\n * This is more reliable than checking for title/description which are optional.\n */\n private detectRegisterScreenCall(ast: BabelTypes.File): boolean {\n let found = false;\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n if (found) return;\n const callee = nodePath.node.callee;\n\n if (\n (BabelTypes.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n ) {\n found = true;\n nodePath.stop();\n }\n },\n });\n\n return found;\n }\n\n /**\n * Extract metadata from registerScreen() call\n */\n private extractRegisterScreenMetadata(\n ast: BabelTypes.File\n ): Partial<ScreenDescriptor> & { name: string } | null {\n let metadata: Partial<ScreenDescriptor> & { name: string } | null = null;\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n\n // Check if this is a registerScreen call\n if (\n (BabelTypes.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n ) {\n // First argument should be an object expression\n const arg = nodePath.node.arguments[0];\n if (BabelTypes.isObjectExpression(arg)) {\n metadata = this.parseRegisterScreenObject(arg);\n }\n }\n },\n });\n\n return metadata;\n }\n\n /**\n * Parse the object passed to registerScreen()\n */\n private parseRegisterScreenObject(\n objExpr: BabelTypes.ObjectExpression\n ): Partial<ScreenDescriptor> & { name: string } {\n const result: Partial<ScreenDescriptor> & { name: string } = {\n name: '',\n actions: [],\n forms: [],\n navigationTargets: [],\n components: [],\n };\n\n for (const prop of objExpr.properties) {\n if (!BabelTypes.isObjectProperty(prop) && !BabelTypes.isObjectMethod(prop)) {\n continue;\n }\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n if (BabelTypes.isObjectProperty(prop)) {\n const value = prop.value;\n\n if (key === 'name' && BabelTypes.isStringLiteral(value)) {\n result.name = value.value;\n } else if (key === 'title' && BabelTypes.isStringLiteral(value)) {\n result.title = value.value;\n } else if (key === 'description' && BabelTypes.isStringLiteral(value)) {\n result.description = value.value;\n } else if (key === 'actions' && BabelTypes.isArrayExpression(value)) {\n result.actions = this.parseActionsArray(value);\n } else if (key === 'fields' && BabelTypes.isArrayExpression(value)) {\n // Convert fields to forms\n const fields = this.parseFieldsArray(value);\n if (fields.length > 0) {\n result.forms = [\n {\n id: 'default',\n fields,\n },\n ];\n }\n } else if (key === 'suggestedPrompts' && BabelTypes.isArrayExpression(value)) {\n // Each entry must be a static string literal — dynamic values can't\n // be safely inlined into the MCP doc, so they're silently skipped.\n const prompts: string[] = [];\n for (const element of value.elements) {\n if (BabelTypes.isStringLiteral(element)) {\n const trimmed = element.value.trim();\n if (trimmed.length > 0) prompts.push(trimmed);\n }\n }\n if (prompts.length > 0) {\n result.suggestedPrompts = prompts;\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Parse actions array from registerScreen\n */\n private parseActionsArray(arr: BabelTypes.ArrayExpression): ActionDescriptor[] {\n const actions: ActionDescriptor[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n const action = this.parseActionObject(element);\n if (action.id) {\n actions.push(action);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Parse a single action object\n */\n private parseActionObject(obj: BabelTypes.ObjectExpression): ActionDescriptor {\n const action: ActionDescriptor = {\n id: '',\n type: 'custom',\n };\n\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n const value = prop.value;\n\n if (key === 'id' && BabelTypes.isStringLiteral(value)) {\n action.id = value.value;\n } else if (key === 'label' && BabelTypes.isStringLiteral(value)) {\n action.label = value.value;\n } else if (key === 'type' && BabelTypes.isStringLiteral(value)) {\n action.type = (value.value as any) || 'custom';\n } else if (key === 'targetScreen' && BabelTypes.isStringLiteral(value)) {\n action.targetScreen = value.value;\n } else if (key === 'description' && BabelTypes.isStringLiteral(value)) {\n action.description = value.value;\n } else if (key === 'handler' && BabelTypes.isStringLiteral(value)) {\n action.handler = value.value;\n } else if (key === 'requiresConfirmation' && BabelTypes.isBooleanLiteral(value)) {\n action.requiresConfirmation = value.value;\n } else if (key === 'destructive' && BabelTypes.isBooleanLiteral(value)) {\n action.destructive = value.value;\n } else if (key === 'effect' && BabelTypes.isStringLiteral(value)) {\n action.effect = value.value;\n } else if (key === 'riskLevel' && BabelTypes.isStringLiteral(value)) {\n action.riskLevel = value.value;\n } else if (key === 'nativeConfirmationExpected' && BabelTypes.isBooleanLiteral(value)) {\n action.nativeConfirmationExpected = value.value;\n } else if (key === 'appilotsInferred' && BabelTypes.isObjectExpression(value)) {\n action.appilotsInferred = this.parseAppilotsInferredObject(value);\n }\n }\n\n return action;\n }\n\n private parseAppilotsInferredObject(obj: BabelTypes.ObjectExpression): AppilotsInferredAction {\n const out: AppilotsInferredAction = {};\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n const value = prop.value;\n if (key === 'isAsyncTrigger' && BabelTypes.isBooleanLiteral(value)) {\n out.isAsyncTrigger = value.value;\n } else if (key === 'expectedOutcome' && BabelTypes.isStringLiteral(value)) {\n out.expectedOutcome = value.value as AppilotsInferredAction['expectedOutcome'];\n } else if (key === 'loadingStateBindings' && BabelTypes.isArrayExpression(value)) {\n out.loadingStateBindings = value.elements\n .filter((el): el is BabelTypes.StringLiteral => BabelTypes.isStringLiteral(el))\n .map((el) => el.value);\n }\n }\n return out;\n }\n\n /**\n * Parse fields array from registerScreen\n */\n private parseFieldsArray(arr: BabelTypes.ArrayExpression): FormFieldDescriptor[] {\n const fields: FormFieldDescriptor[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n const field = this.parseFieldObject(element);\n if (field.name) {\n fields.push(field);\n }\n }\n }\n\n return fields;\n }\n\n /**\n * Parse a single field object\n */\n private parseFieldObject(obj: BabelTypes.ObjectExpression): FormFieldDescriptor {\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n };\n\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n const value = prop.value;\n\n if (key === 'id' && BabelTypes.isStringLiteral(value)) {\n field.name = value.value;\n } else if (key === 'label' && BabelTypes.isStringLiteral(value)) {\n field.label = value.value;\n } else if (key === 'type' && BabelTypes.isStringLiteral(value)) {\n field.type = (value.value as any) || 'text';\n } else if (key === 'required' && BabelTypes.isBooleanLiteral(value)) {\n field.required = value.value;\n } else if (key === 'placeholder' && BabelTypes.isStringLiteral(value)) {\n field.placeholder = value.value;\n } else if (key === 'defaultValue' && BabelTypes.isExpression(value)) {\n field.defaultValue = this.extractLiteralValue(value);\n } else if (key === 'options' && BabelTypes.isArrayExpression(value)) {\n field.options = this.parseOptionsArray(value);\n }\n }\n\n return field;\n }\n\n /**\n * Parse options array for select fields\n */\n private parseOptionsArray(arr: BabelTypes.ArrayExpression): { label: string; value: string }[] {\n const options: { label: string; value: string }[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n let label = '';\n let value = '';\n\n for (const prop of element.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n if (key === 'label' && BabelTypes.isStringLiteral(prop.value)) {\n label = prop.value.value;\n } else if (key === 'value' && BabelTypes.isStringLiteral(prop.value)) {\n value = prop.value.value;\n }\n }\n\n if (label && value) {\n options.push({ label, value });\n }\n }\n }\n\n return options;\n }\n\n private mergeForms(primary: FormDescriptor[], secondary: FormDescriptor[]): FormDescriptor[] {\n const out: FormDescriptor[] = primary.map((form) => ({\n ...form,\n fields: [...form.fields],\n }));\n\n for (const form of secondary) {\n const existing =\n out.find((candidate) => candidate.id === form.id) ??\n this.findFormWithSharedFields(out, form);\n if (!existing) {\n out.push({ ...form, fields: [...form.fields], submitAction: this.namedSubmitAction(form.submitAction) });\n continue;\n }\n\n for (const field of form.fields) {\n const existingField = this.findEquivalentField(existing.fields, field);\n if (existingField) {\n this.mergeFieldMetadata(existingField, field);\n } else {\n existing.fields.push(field);\n }\n }\n existing.submitAction = existing.submitAction ?? this.namedSubmitAction(form.submitAction);\n existing.validationRules = form.validationRules\n ? { ...form.validationRules, ...(existing.validationRules ?? {}) }\n : existing.validationRules;\n }\n\n return out;\n }\n\n private findEquivalentField(\n fields: FormFieldDescriptor[],\n incoming: FormFieldDescriptor,\n ): FormFieldDescriptor | undefined {\n return fields.find((field) => {\n if (field.name && incoming.name && field.name === incoming.name) return true;\n if (field.valueBinding && incoming.valueBinding && field.valueBinding === incoming.valueBinding) return true;\n if (field.locator?.id && incoming.locator?.id && field.locator.id === incoming.locator.id) return true;\n if (field.placeholder && incoming.placeholder && field.placeholder === incoming.placeholder) return true;\n if (\n field.locator?.accessibilityLabel &&\n incoming.locator?.accessibilityLabel &&\n field.locator.accessibilityLabel === incoming.locator.accessibilityLabel\n ) {\n return true;\n }\n return false;\n });\n }\n\n private namedSubmitAction(submitAction: string | undefined): string | undefined {\n return submitAction && submitAction !== 'anonymous' ? submitAction : undefined;\n }\n\n private mergeFieldMetadata(target: FormFieldDescriptor, source: FormFieldDescriptor): void {\n if (this.isWeakInferredFieldName(target.name) && !this.isWeakInferredFieldName(source.name)) {\n target.name = source.name;\n }\n target.label = target.label ?? source.label;\n target.placeholder = target.placeholder ?? source.placeholder;\n target.options = target.options ?? source.options;\n target.locator = target.locator ?? source.locator;\n if (target.locator && source.locator) {\n target.locator = this.mergeLocator(source.locator, target.locator);\n }\n target.sourceComponent = target.sourceComponent ?? source.sourceComponent;\n target.valueBinding = target.valueBinding ?? source.valueBinding;\n target.errorBinding = target.errorBinding ?? source.errorBinding;\n target.required = target.required || source.required;\n if (target.type === 'text' && source.type !== 'text') {\n target.type = source.type;\n }\n }\n\n private findFormWithSharedFields(\n forms: FormDescriptor[],\n incoming: FormDescriptor,\n ): FormDescriptor | undefined {\n if (incoming.fields.length === 0) return undefined;\n\n let best: { form: FormDescriptor; overlap: number } | undefined;\n for (const form of forms) {\n const overlap = incoming.fields.filter((field) =>\n this.findEquivalentField(form.fields, field),\n ).length;\n if (overlap > 0 && (!best || overlap > best.overlap)) {\n best = { form, overlap };\n }\n }\n\n return best?.form;\n }\n\n /**\n * Extract the name of the default exported component\n */\n private extractDefaultComponentName(ast: BabelTypes.File): string {\n let componentName = '';\n\n traverse(ast, {\n ExportDefaultDeclaration: (nodePath) => {\n const declaration = nodePath.node.declaration;\n\n if (BabelTypes.isFunctionDeclaration(declaration) && declaration.id?.name) {\n componentName = declaration.id.name;\n } else if (BabelTypes.isArrowFunctionExpression(declaration)) {\n // Arrow function export - try to get from parent variable declaration\n componentName = 'Component';\n }\n },\n VariableDeclarator: (nodePath) => {\n if (\n BabelTypes.isIdentifier(nodePath.node.id) &&\n (BabelTypes.isArrowFunctionExpression(nodePath.node.init) ||\n BabelTypes.isFunctionExpression(nodePath.node.init))\n ) {\n // Check if this is exported\n const parent = nodePath.parent;\n if (\n BabelTypes.isVariableDeclaration(parent) &&\n parent.declare === true\n ) {\n componentName = nodePath.node.id.name;\n }\n }\n },\n });\n\n return componentName;\n }\n\n /**\n * Extract navigation targets from navigation.navigate() calls\n */\n private extractNavigationTargets(ast: BabelTypes.File): string[] {\n const targets = new Set<string>();\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n\n // Match navigation.navigate('ScreenName') pattern\n if (\n BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.object) &&\n callee.object.name === 'navigation' &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'navigate'\n ) {\n const arg = nodePath.node.arguments[0];\n if (BabelTypes.isStringLiteral(arg)) {\n targets.add(arg.value);\n }\n }\n },\n });\n\n return Array.from(targets).sort();\n }\n\n /**\n * Extract form information from JSX\n */\n private extractForms(ast: BabelTypes.File): FormDescriptor[] {\n const forms: FormDescriptor[] = [];\n const fields = new Map<string, FormFieldDescriptor>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n // Detect native inputs and custom form controls by their prop\n // contract, not by app-specific component names.\n const role = classifyJsxComponent(componentName, element);\n if (['input', 'select', 'toggle', 'date'].includes(role)) {\n const field = this.extractFieldFromInputElement(element);\n if (field.name) {\n fields.set(field.name, field);\n }\n }\n }\n },\n });\n\n // Create a default form if we found any fields\n if (fields.size > 0) {\n forms.push({\n id: 'default',\n fields: Array.from(fields.values()),\n });\n }\n\n return forms;\n }\n\n /**\n * Extract field metadata from a TextInput/Input element\n */\n private extractFieldFromInputElement(element: BabelTypes.JSXOpeningElement): FormFieldDescriptor {\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n };\n const componentName = BabelTypes.isJSXIdentifier(element.name) ? element.name.name : '';\n const role = componentName ? classifyJsxComponent(componentName, element) : 'custom';\n field.sourceComponent = componentName || undefined;\n\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value) {\n if (BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'placeholder') {\n field.placeholder = attr.value.value;\n } else if (attrName === 'appilotsId') {\n field.name = attr.value.value;\n field.locator = this.mergeLocator(field.locator, {\n id: attr.value.value,\n appilotsId: attr.value.value,\n source: 'appilotsId',\n });\n } else if (attrName === 'testID') {\n // Use testID to derive field name if not set\n if (!field.name) {\n field.name = attr.value.value.replace(/^(input-|field-|txt-)/, '');\n }\n field.locator = this.mergeLocator(field.locator, {\n id: field.name || attr.value.value,\n testID: attr.value.value,\n source: 'testID',\n });\n } else if (attrName === 'label') {\n field.label = attr.value.value;\n } else if (attrName === 'accessibilityLabel') {\n if (!field.label) field.label = attr.value.value;\n field.locator = this.mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: this.slugifyActionId(attr.value.value) }),\n accessibilityLabel: attr.value.value,\n source: field.locator?.source ?? 'accessibilityLabel',\n });\n } else if (attrName === 'keyboardType') {\n if (attr.value.value === 'email-address' || attr.value.value === 'email') field.type = 'email';\n if (attr.value.value === 'phone-pad') field.type = 'phone';\n if (attr.value.value === 'numeric' || attr.value.value === 'number-pad') field.type = 'number';\n }\n } else if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n // Handle dynamic attributes\n if (attrName === 'value' && BabelTypes.isIdentifier(attr.value.expression)) {\n // Try to infer field name from variable name\n if (!field.name) {\n field.name = attr.value.expression.name;\n }\n field.valueBinding = attr.value.expression.name;\n } else if (attrName === 'checked' && BabelTypes.isIdentifier(attr.value.expression)) {\n if (!field.name) field.name = attr.value.expression.name;\n field.valueBinding = attr.value.expression.name;\n } else if (attrName === 'error') {\n field.errorBinding = this.expressionToBinding(attr.value.expression);\n } else if (attrName === 'required' && BabelTypes.isBooleanLiteral(attr.value.expression)) {\n field.required = attr.value.expression.value;\n }\n }\n } else if (attrName === 'required') {\n field.required = true;\n }\n }\n\n if (role === 'select') field.type = 'select';\n if (role === 'toggle') field.type = 'toggle';\n if (role === 'date') field.type = 'date';\n if (!field.name || this.isWeakInferredFieldName(field.name)) {\n const label = field.locator?.accessibilityLabel ?? field.label ?? field.placeholder;\n if (label) field.name = this.slugifyActionId(label);\n }\n if (!field.locator && field.name) {\n field.locator = { id: field.name, label: field.label, source: 'inferred' };\n } else if (field.locator && !field.locator.id && field.name) {\n field.locator = this.mergeLocator(field.locator, {\n id: field.name,\n label: field.label,\n source: field.locator.source ?? 'inferred',\n });\n }\n\n return field;\n }\n\n private isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n }\n\n /**\n * Extract component structure from JSX\n */\n private extractComponents(ast: BabelTypes.File): ComponentDescriptor[] {\n const components: ComponentDescriptor[] = [];\n const seen = new Set<string>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n if (seen.has(componentName)) return;\n seen.add(componentName);\n\n const type = this.inferComponentType(componentName);\n const component: ComponentDescriptor = {\n name: componentName,\n type,\n };\n\n // Extract testID and accessibilityLabel\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value && BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'testID') {\n component.testID = attr.value.value;\n } else if (attrName === 'accessibilityLabel') {\n component.accessibilityLabel = attr.value.value;\n }\n }\n }\n\n components.push(component);\n }\n },\n });\n\n return components;\n }\n\n /**\n * Infer component type from component name\n */\n private inferComponentType(name: string): ComponentDescriptor['type'] {\n const role = classifyJsxComponent(name);\n if (role === 'select' || role === 'toggle' || role === 'date') {\n return 'input';\n }\n if (role === 'input') {\n return 'input';\n }\n if (role === 'button') {\n return 'button';\n }\n if (role === 'list') {\n return 'list';\n }\n if (role === 'modal') {\n return 'modal';\n }\n if (role === 'view') {\n return 'view';\n }\n return 'custom';\n }\n\n /**\n * Extract actions from button/touchable elements\n */\n private extractActions(\n ast: BabelTypes.File,\n registerScreenMeta: Partial<ScreenDescriptor> & { name: string } | null\n ): ActionDescriptor[] {\n // Start with actions from registerScreen if available\n const actions = [...(registerScreenMeta?.actions || [])];\n const actionIds = new Set(actions.map((a) => a.id));\n const actionLabels = new Map(\n actions\n .filter((a) => a.label)\n .map((a) => [this.normalizeLabel(a.label!), a] as const),\n );\n\n // Extract additional actions from JSX buttons/touchables\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n if (classifyJsxComponent(componentName, element) === 'button') {\n const action = this.extractActionFromButton(element);\n const existingByLabel = action.label\n ? actionLabels.get(this.normalizeLabel(action.label))\n : undefined;\n if (existingByLabel) {\n this.mergeActionMetadata(existingByLabel, action);\n return;\n }\n if (action.id && !actionIds.has(action.id)) {\n actions.push(action);\n actionIds.add(action.id);\n if (action.label) actionLabels.set(this.normalizeLabel(action.label), action);\n }\n }\n }\n },\n });\n\n this.enrichActionsFromHandlers(ast, actions);\n\n return actions;\n }\n\n private normalizeLabel(label: string): string {\n return label\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '');\n }\n\n private mergeActionMetadata(target: ActionDescriptor, source: ActionDescriptor): void {\n target.handler = target.handler ?? source.handler;\n target.targetScreen = target.targetScreen ?? source.targetScreen;\n target.description = target.description ?? source.description;\n target.nativeConfirmationExpected =\n target.nativeConfirmationExpected || source.nativeConfirmationExpected || undefined;\n target.requiresConfirmation =\n target.requiresConfirmation || source.requiresConfirmation || undefined;\n target.destructive = target.destructive || source.destructive || undefined;\n target.effect = target.effect ?? source.effect;\n target.riskLevel = target.riskLevel ?? source.riskLevel;\n target.appilotsInferred = target.appilotsInferred ?? source.appilotsInferred;\n }\n\n private enrichActionsFromHandlers(ast: BabelTypes.File, actions: ActionDescriptor[]): void {\n const handlerMap = this.collectHandlerInfo(ast);\n const labelToHandler = this.collectButtonHandlersByLabel(ast);\n\n for (const action of actions) {\n if (!action.handler && action.label) {\n const handler = labelToHandler.get(action.label);\n if (handler) action.handler = handler;\n }\n\n const handler = action.handler ? handlerMap.get(action.handler) : undefined;\n if (!handler) continue;\n\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n ...handler.appilotsInferred,\n };\n if (handler.nativeConfirmationExpected) action.nativeConfirmationExpected = true;\n if (handler.targetScreen && !action.targetScreen) action.targetScreen = handler.targetScreen;\n if (handler.successSignal && !action.successSignal) action.successSignal = handler.successSignal;\n if (handler.failureSignal && !action.failureSignal) action.failureSignal = handler.failureSignal;\n if (handler.opensModal && !action.opensModal) action.opensModal = handler.opensModal;\n if (\n handler.destructive ||\n action.destructive === true ||\n action.requiresConfirmation === true ||\n action.effect === 'destructive' ||\n action.riskLevel === 'high'\n ) {\n action.destructive = true;\n action.effect = action.effect ?? 'destructive';\n action.riskLevel = action.riskLevel ?? 'high';\n action.requiresConfirmation = action.requiresConfirmation ?? true;\n }\n }\n }\n\n private collectButtonHandlersByLabel(ast: BabelTypes.File): Map<string, string> {\n const out = new Map<string, string>();\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n if (!BabelTypes.isJSXIdentifier(element.name)) return;\n const componentName = element.name.name;\n if (classifyJsxComponent(componentName, element) !== 'button') return;\n\n let label: string | undefined;\n let handler: string | undefined;\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName || !attr.value) continue;\n if (\n (attrName === 'title' || attrName === 'accessibilityLabel' || attrName === 'label') &&\n BabelTypes.isStringLiteral(attr.value)\n ) {\n label = attr.value.value;\n }\n if (\n attrName === 'onPress' &&\n BabelTypes.isJSXExpressionContainer(attr.value) &&\n BabelTypes.isIdentifier(attr.value.expression)\n ) {\n handler = attr.value.expression.name;\n }\n }\n if (label && handler) out.set(label, handler);\n },\n });\n return out;\n }\n\n private collectHandlerInfo(ast: BabelTypes.File): Map<string, {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: import('../types').SignalDescriptor;\n failureSignal?: import('../types').SignalDescriptor;\n opensModal?: string;\n }> {\n const handlers = collectFunctions(ast);\n\n const out = new Map<string, {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: import('../types').SignalDescriptor;\n failureSignal?: import('../types').SignalDescriptor;\n opensModal?: string;\n }>();\n\n for (const [name, fn] of handlers) {\n const info = analyzeFunctionBehavior(name, fn, handlers);\n out.set(name, info);\n }\n\n return out;\n }\n\n private analyzeHandlerFunction(\n name: string,\n fn: BabelTypes.Function,\n handlers: Map<string, BabelTypes.Function>,\n seen = new Set<string>(),\n ): {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n } {\n if (seen.has(name)) {\n return {\n appilotsInferred: { expectedOutcome: 'none' },\n destructive: false,\n nativeConfirmationExpected: false,\n };\n }\n seen.add(name);\n\n let hasAwait = fn.async === true;\n let hasThen = false;\n let hasStateSetter = false;\n let nativeConfirmationExpected = false;\n let targetScreen: string | undefined;\n let destructive = /(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(name);\n\n const inspectNode = (node: BabelTypes.Node) => {\n if (BabelTypes.isAwaitExpression(node)) hasAwait = true;\n if (\n BabelTypes.isCallExpression(node) &&\n BabelTypes.isMemberExpression(node.callee) &&\n BabelTypes.isIdentifier(node.callee.property)\n ) {\n const method = node.callee.property.name;\n if (method === 'then' || method === 'catch' || method === 'finally') hasThen = true;\n if (\n BabelTypes.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n ['navigate', 'push', 'replace'].includes(method)\n ) {\n const firstArg = node.arguments[0];\n if (BabelTypes.isStringLiteral(firstArg)) targetScreen = firstArg.value;\n }\n if (\n BabelTypes.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'Alert' &&\n method === 'alert'\n ) {\n nativeConfirmationExpected = true;\n }\n }\n if (BabelTypes.isCallExpression(node) && BabelTypes.isIdentifier(node.callee)) {\n const calleeName = node.callee.name;\n if (/^set[A-Z]/.test(calleeName)) hasStateSetter = true;\n if (/(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(calleeName)) {\n destructive = true;\n }\n const nested = handlers.get(calleeName);\n if (nested) {\n const nestedInfo = this.analyzeHandlerFunction(calleeName, nested, handlers, seen);\n hasAwait = hasAwait || nestedInfo.appilotsInferred.isAsyncTrigger === true;\n nativeConfirmationExpected ||= nestedInfo.nativeConfirmationExpected;\n destructive ||= nestedInfo.destructive;\n targetScreen = targetScreen ?? nestedInfo.targetScreen;\n }\n }\n if (\n BabelTypes.isMemberExpression(node) &&\n BabelTypes.isIdentifier(node.property) &&\n /(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(node.property.name)\n ) {\n destructive = true;\n }\n };\n\n if (fn.body) {\n traverse(fn.body as any, {\n noScope: true,\n enter: (nodePath: any) => inspectNode(nodePath.node),\n } as any);\n }\n\n const expectedOutcome: AppilotsInferredAction['expectedOutcome'] = targetScreen\n ? 'navigation'\n : hasStateSetter\n ? 'inline-feedback'\n : hasAwait || hasThen\n ? 'mixed'\n : 'none';\n\n return {\n appilotsInferred: {\n isAsyncTrigger: hasAwait || hasThen || undefined,\n expectedOutcome,\n },\n destructive,\n nativeConfirmationExpected,\n targetScreen,\n };\n }\n\n /**\n * BACKLOG 2.2 — heuristic destructive detection.\n *\n * Combines several signals:\n * - JSX `destructive` boolean prop (`<Pressable destructive />`)\n * - JSX `aria-destructive` attribute\n * - Handler name contains a generic destructive verb\n * (delete/destroy/remove/discard/wipe/revoke/etc.). `cancel` is intentionally excluded —\n * too many \"Cancelar\" buttons that just dismiss modals.\n * - testID / id contains a destructive verb\n *\n * Default-allow with explicit opt-out via `@appilots-non-destructive`\n * is more dangerous than the inverse, so we default-deny: the\n * heuristic must hit OR the JSDoc tag must be present.\n */\n private isElementDestructive(\n element: BabelTypes.JSXOpeningElement,\n handlerName: string | undefined,\n actionId: string | undefined,\n ): boolean {\n const DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\n // Explicit JSX prop wins.\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (attrName === 'destructive' || attrName === 'aria-destructive') {\n // <Btn destructive /> (no value) is true; <Btn destructive={false} />\n // turns it off.\n if (attr.value === null) return true;\n if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n const expr = attr.value.expression;\n if (BabelTypes.isBooleanLiteral(expr)) return expr.value;\n }\n if (BabelTypes.isStringLiteral(attr.value)) {\n return attr.value.value === 'true';\n }\n }\n }\n\n if (handlerName && DESTRUCTIVE_VERB.test(handlerName)) return true;\n if (actionId && DESTRUCTIVE_VERB.test(actionId)) return true;\n\n return false;\n }\n\n /**\n * Extract action metadata from a button element\n */\n private extractActionFromButton(element: BabelTypes.JSXOpeningElement): ActionDescriptor {\n const action: ActionDescriptor = {\n id: '',\n type: 'custom',\n };\n const componentName = BabelTypes.isJSXIdentifier(element.name) ? element.name.name : undefined;\n action.sourceComponent = componentName;\n let handlerName: string | undefined;\n\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value) {\n if (BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'appilotsId') {\n action.id = attr.value.value;\n action.locator = this.mergeLocator(action.locator, {\n id: attr.value.value,\n appilotsId: attr.value.value,\n source: 'appilotsId',\n });\n } else if (attrName === 'testID') {\n action.id = attr.value.value;\n action.locator = this.mergeLocator(action.locator, {\n id: attr.value.value,\n testID: attr.value.value,\n source: 'testID',\n });\n } else if (attrName === 'title' || attrName === 'label' || attrName === 'accessibilityLabel') {\n action.label = attr.value.value;\n if (attrName === 'accessibilityLabel') {\n action.locator = this.mergeLocator(action.locator, {\n accessibilityLabel: attr.value.value,\n source: 'accessibilityLabel',\n });\n }\n if (!action.id) {\n action.id = this.slugifyActionId(attr.value.value);\n }\n }\n } else if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n if (attrName === 'onPress' && BabelTypes.isIdentifier(attr.value.expression)) {\n // Infer action type from handler name\n handlerName = attr.value.expression.name.toLowerCase();\n action.handler = attr.value.expression.name;\n if (handlerName.includes('submit')) {\n action.type = 'submit';\n } else if (handlerName.includes('navigate')) {\n action.type = 'navigation';\n }\n } else if (attrName === 'onPress') {\n const inline = this.extractInlineOnPressMetadata(attr.value.expression);\n if (inline.handler) {\n handlerName = inline.handler.toLowerCase();\n action.handler = inline.handler;\n if (handlerName.includes('submit')) action.type = 'submit';\n }\n if (inline.targetScreen) {\n action.type = 'navigation';\n action.targetScreen = inline.targetScreen;\n }\n } else if (attrName === 'loading' && BabelTypes.isIdentifier(attr.value.expression)) {\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n isAsyncTrigger: true,\n loadingStateBindings: [attr.value.expression.name],\n };\n }\n }\n } else if (attrName === 'destructive') {\n action.destructive = true;\n }\n }\n\n if (!action.locator && action.id) {\n action.locator = { id: action.id, label: action.label, source: action.label ? 'label' : 'inferred' };\n }\n\n // BACKLOG 2.2 — flag the action as destructive if the heuristic\n // detects it. Persists into the MCP doc so the runtime doesn't\n // need to re-derive on every request.\n if (this.isElementDestructive(element, handlerName, action.id)) {\n action.destructive = true;\n }\n\n return action;\n }\n\n private extractInlineOnPressMetadata(\n expr: BabelTypes.Expression | BabelTypes.JSXEmptyExpression,\n ): Pick<ActionDescriptor, 'handler' | 'targetScreen'> {\n if (BabelTypes.isJSXEmptyExpression(expr)) return {};\n const navCall = extractNavigationCalls(expr).find((call) => call.targetScreen);\n const handler = this.extractFirstHandlerName(expr);\n return {\n ...(handler ? { handler } : {}),\n ...(navCall?.targetScreen ? { targetScreen: navCall.targetScreen } : {}),\n };\n }\n\n private extractFirstHandlerName(node: BabelTypes.Node): string | undefined {\n if (BabelTypes.isIdentifier(node)) return node.name;\n if (BabelTypes.isArrowFunctionExpression(node) || BabelTypes.isFunctionExpression(node)) {\n return this.extractFirstHandlerName(node.body);\n }\n if (BabelTypes.isBlockStatement(node)) {\n for (const statement of node.body) {\n const handler = this.extractFirstHandlerName(statement);\n if (handler) return handler;\n }\n return undefined;\n }\n if (BabelTypes.isExpressionStatement(node)) {\n return this.extractFirstHandlerName(node.expression);\n }\n if (BabelTypes.isReturnStatement(node)) {\n return node.argument ? this.extractFirstHandlerName(node.argument) : undefined;\n }\n if (BabelTypes.isUnaryExpression(node)) {\n return this.extractFirstHandlerName(node.argument);\n }\n if (BabelTypes.isAwaitExpression(node)) {\n return this.extractFirstHandlerName(node.argument);\n }\n if (BabelTypes.isCallExpression(node)) {\n if (BabelTypes.isIdentifier(node.callee)) return node.callee.name;\n return undefined;\n }\n return undefined;\n }\n\n private mergeLocator(\n current: LocatorDescriptor | undefined,\n next: LocatorDescriptor,\n ): LocatorDescriptor {\n return { ...(current ?? {}), ...next };\n }\n\n private expressionToBinding(expr: BabelTypes.Expression | BabelTypes.JSXEmptyExpression): string | undefined {\n if (BabelTypes.isIdentifier(expr)) return expr.name;\n if (\n BabelTypes.isMemberExpression(expr) &&\n BabelTypes.isIdentifier(expr.object) &&\n BabelTypes.isIdentifier(expr.property)\n ) {\n return `${expr.object.name}.${expr.property.name}`;\n }\n return undefined;\n }\n\n private slugifyActionId(label: string): string {\n return label\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n private extractCollections(ast: BabelTypes.File): CollectionDescriptor[] {\n const renderItemFns = this.collectRenderItemFunctions(ast);\n const collections: CollectionDescriptor[] = [];\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n if (!BabelTypes.isJSXIdentifier(element.name)) return;\n const component = element.name.name;\n if (!['FlatList', 'SectionList', 'VirtualizedList', 'FlashList'].includes(component)) {\n return;\n }\n\n const dataSource = this.jsxExpressionIdentifier(element, 'data');\n const renderItem = this.jsxExpressionIdentifier(element, 'renderItem');\n const keyField = this.extractKeyField(element);\n const renderFn = renderItem ? renderItemFns.get(renderItem) : undefined;\n const rowAction = renderFn ? this.extractRowAction(renderFn) : undefined;\n const displayFields = renderFn ? this.extractItemFields(renderFn) : [];\n const itemType = this.inferItemType(dataSource, renderItem, displayFields);\n const identityFields = this.inferIdentityFields(keyField, displayFields);\n const searchField = this.inferSearchField(ast, dataSource);\n\n const id = dataSource ?? renderItem ?? `${component.toLowerCase()}-${collections.length + 1}`;\n collections.push({\n id,\n component,\n ...(itemType ? { itemType } : {}),\n ...(dataSource ? { dataSource } : {}),\n ...(keyField ? { keyField } : {}),\n ...(renderItem ? { renderItem } : {}),\n ...(displayFields.length > 0 ? { displayFields } : {}),\n ...(rowAction ? { rowAction } : {}),\n ...(rowAction ? { rowActions: [rowAction] } : {}),\n ...(identityFields.length > 0 ? { identityFields } : {}),\n ...(searchField ? { searchField } : {}),\n });\n },\n });\n\n return collections;\n }\n\n private collectRenderItemFunctions(ast: BabelTypes.File): Map<string, BabelTypes.Function> {\n const out = new Map<string, BabelTypes.Function>();\n traverse(ast, {\n VariableDeclarator: (nodePath) => {\n if (!BabelTypes.isIdentifier(nodePath.node.id)) return;\n const init = nodePath.node.init;\n if (\n BabelTypes.isArrowFunctionExpression(init) ||\n BabelTypes.isFunctionExpression(init)\n ) {\n out.set(nodePath.node.id.name, init);\n }\n },\n FunctionDeclaration: (nodePath) => {\n if (nodePath.node.id?.name) out.set(nodePath.node.id.name, nodePath.node);\n },\n });\n return out;\n }\n\n private jsxExpressionIdentifier(\n element: BabelTypes.JSXOpeningElement,\n attrName: string,\n ): string | undefined {\n const attr = element.attributes.find((candidate) =>\n BabelTypes.isJSXAttribute(candidate) &&\n BabelTypes.isJSXIdentifier(candidate.name) &&\n candidate.name.name === attrName,\n );\n if (!BabelTypes.isJSXAttribute(attr) || !attr.value) return undefined;\n if (\n BabelTypes.isJSXExpressionContainer(attr.value) &&\n BabelTypes.isIdentifier(attr.value.expression)\n ) {\n return attr.value.expression.name;\n }\n if (BabelTypes.isStringLiteral(attr.value)) return attr.value.value;\n return undefined;\n }\n\n private extractKeyField(element: BabelTypes.JSXOpeningElement): string | undefined {\n const attr = element.attributes.find((candidate) =>\n BabelTypes.isJSXAttribute(candidate) &&\n BabelTypes.isJSXIdentifier(candidate.name) &&\n candidate.name.name === 'keyExtractor',\n );\n if (\n !BabelTypes.isJSXAttribute(attr) ||\n !attr.value ||\n !BabelTypes.isJSXExpressionContainer(attr.value)\n ) {\n return undefined;\n }\n const expr = attr.value.expression;\n if (!BabelTypes.isArrowFunctionExpression(expr)) return undefined;\n const param = expr.params[0];\n if (!BabelTypes.isIdentifier(param)) return undefined;\n if (\n BabelTypes.isMemberExpression(expr.body) &&\n BabelTypes.isIdentifier(expr.body.object) &&\n expr.body.object.name === param.name &&\n BabelTypes.isIdentifier(expr.body.property)\n ) {\n return expr.body.property.name;\n }\n return undefined;\n }\n\n private extractRowAction(fn: BabelTypes.Function): RowActionDescriptor | undefined {\n let action: RowActionDescriptor | undefined;\n traverse(fn.body as any, {\n noScope: true,\n CallExpression: (nodePath: any) => {\n const node = nodePath.node as BabelTypes.CallExpression;\n if (\n !BabelTypes.isMemberExpression(node.callee) ||\n !BabelTypes.isIdentifier(node.callee.object) ||\n node.callee.object.name !== 'navigation' ||\n !BabelTypes.isIdentifier(node.callee.property) ||\n !['navigate', 'push', 'replace'].includes(node.callee.property.name)\n ) {\n return;\n }\n const firstArg = node.arguments[0];\n if (!BabelTypes.isStringLiteral(firstArg)) return;\n const params = this.extractNavigationParams(node.arguments[1]);\n action = {\n type: 'navigation',\n targetScreen: firstArg.value,\n ...(Object.keys(params).length > 0 ? { params } : {}),\n description: `Pressing a row opens ${firstArg.value}`,\n };\n },\n } as any);\n return action;\n }\n\n private extractNavigationParams(arg: BabelTypes.Node | undefined | null): Record<string, string> {\n const params: Record<string, string> = {};\n if (!arg || !BabelTypes.isObjectExpression(arg)) return params;\n for (const prop of arg.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n const key = BabelTypes.isIdentifier(prop.key)\n ? prop.key.name\n : BabelTypes.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key) continue;\n if (\n BabelTypes.isMemberExpression(prop.value) &&\n BabelTypes.isIdentifier(prop.value.object) &&\n BabelTypes.isIdentifier(prop.value.property)\n ) {\n params[key] = `${prop.value.object.name}.${prop.value.property.name}`;\n } else if (BabelTypes.isIdentifier(prop.value)) {\n params[key] = prop.value.name;\n } else if (BabelTypes.isStringLiteral(prop.value)) {\n params[key] = prop.value.value;\n }\n }\n return params;\n }\n\n private extractItemFields(fn: BabelTypes.Function): string[] {\n const fields = new Set<string>();\n const itemNames = new Set<string>(['item']);\n const firstParam = fn.params[0];\n if (BabelTypes.isObjectPattern(firstParam)) {\n for (const prop of firstParam.properties) {\n if (\n BabelTypes.isObjectProperty(prop) &&\n BabelTypes.isIdentifier(prop.key) &&\n prop.key.name === 'item' &&\n BabelTypes.isIdentifier(prop.value)\n ) {\n itemNames.add(prop.value.name);\n }\n }\n } else if (BabelTypes.isIdentifier(firstParam)) {\n itemNames.add(firstParam.name);\n }\n\n traverse(fn.body as any, {\n noScope: true,\n MemberExpression: (nodePath: any) => {\n const node = nodePath.node as BabelTypes.MemberExpression;\n if (\n BabelTypes.isIdentifier(node.object) &&\n itemNames.has(node.object.name) &&\n BabelTypes.isIdentifier(node.property)\n ) {\n fields.add(node.property.name);\n }\n },\n } as any);\n\n return Array.from(fields).sort();\n }\n\n private inferItemType(\n dataSource: string | undefined,\n renderItem: string | undefined,\n displayFields: string[],\n ): string | undefined {\n const source = dataSource ?? renderItem;\n if (!source) return undefined;\n const singular = source\n .replace(/^render/i, '')\n .replace(/(List|Items|Data|Rows|Sections)$/i, '')\n .replace(/s$/i, '');\n const candidate = singular.charAt(0).toUpperCase() + singular.slice(1);\n if (candidate.length > 1) return candidate;\n if (displayFields.length > 0) return 'Item';\n return undefined;\n }\n\n private inferIdentityFields(\n keyField: string | undefined,\n displayFields: string[],\n ): string[] {\n const out = new Set<string>();\n if (keyField) out.add(keyField);\n for (const field of displayFields) {\n if (/^(id|uuid|key|name|title|plate|email|slug)$/i.test(field)) out.add(field);\n }\n return Array.from(out);\n }\n\n private inferSearchField(ast: BabelTypes.File, dataSource: string | undefined): string | undefined {\n if (!dataSource) return undefined;\n let queryBinding: string | undefined;\n traverse(ast, {\n CallExpression: (nodePath) => {\n const node = nodePath.node;\n if (!BabelTypes.isMemberExpression(node.callee)) return;\n if (!BabelTypes.isIdentifier(node.callee.property) || node.callee.property.name !== 'filter') return;\n if (!BabelTypes.isIdentifier(node.callee.object) || node.callee.object.name !== dataSource) return;\n const fn = node.arguments[0];\n if (!BabelTypes.isArrowFunctionExpression(fn) && !BabelTypes.isFunctionExpression(fn)) return;\n traverse(fn.body as any, {\n noScope: true,\n Identifier: (innerPath: any) => {\n const name = innerPath.node.name;\n if (/query|search|filter/i.test(name)) queryBinding = queryBinding ?? name;\n },\n } as any);\n },\n });\n return queryBinding;\n }\n\n /**\n * Extract literal values from AST nodes\n */\n private extractLiteralValue(node: BabelTypes.Expression): unknown {\n if (BabelTypes.isStringLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isNumericLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isBooleanLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isNullLiteral(node)) {\n return null;\n }\n return undefined;\n }\n\n /**\n * Extract screen name from file path\n * E.g., /src/screens/ItemListScreen.tsx -> ItemListScreen\n */\n private extractScreenName(filePath: string): string {\n const basename = path.basename(filePath);\n return basename.replace(/\\.(tsx?|jsx?)$/, '');\n }\n}\n\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport * as parser from '@babel/parser';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport type {\n AnalyzerConfig,\n NavigationGraph,\n NavigationNode,\n NavigatorDescriptor,\n ParamDescriptor,\n} from '../types';\n\ninterface ParsedNavigator {\n name: string;\n type: 'stack' | 'tab' | 'drawer';\n screens: ParsedScreen[];\n initialRouteName?: string;\n parentNavigator?: string;\n}\n\ninterface ParsedScreen {\n name: string;\n navigatorName: string;\n navigatorType: 'stack' | 'tab' | 'drawer';\n params?: ParamDescriptor[];\n parentNavigator?: string;\n}\n\ninterface TypeExport {\n name: string;\n type: 'stack' | 'tab' | 'drawer';\n paramEntries: Map<string, ParamDescriptor[]>;\n}\n\n/**\n * Analyzes React Navigation configuration to build a navigation graph.\n */\nexport class NavigationAnalyzer {\n private config: AnalyzerConfig;\n /** Extra glob patterns for navigation file discovery (added to defaults) */\n private navigationInclude: string[];\n /** Extra glob patterns to exclude from navigation analysis */\n private navigationExclude: string[];\n\n constructor(\n config: AnalyzerConfig,\n options?: { navigationInclude?: string[]; navigationExclude?: string[] },\n ) {\n this.config = config;\n this.navigationInclude = options?.navigationInclude ?? [];\n this.navigationExclude = options?.navigationExclude ?? [];\n }\n\n /** Build the full navigation graph */\n async analyze(): Promise<NavigationGraph> {\n const navigationFiles = await this.findNavigationFiles();\n const parsedNavigators: ParsedNavigator[] = [];\n const typeExports: TypeExport[] = [];\n\n // Parse all navigation files\n for (const filePath of navigationFiles) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const navigators = this.parseNavigators(content, filePath);\n const types = this.parseParamTypes(content, filePath);\n\n parsedNavigators.push(...navigators);\n typeExports.push(...types);\n } catch (error) {\n console.warn(`Failed to parse ${filePath}:`, error);\n }\n }\n\n // Match type exports to navigators\n this.attachParamsToNavigators(parsedNavigators, typeExports);\n\n // Build the navigation graph\n return this.buildNavigationGraph(parsedNavigators);\n }\n\n /** Find all navigation-related files */\n private async findNavigationFiles(): Promise<string[]> {\n const patterns = [\n '**/navigation/**/*.{ts,tsx}',\n '**/navigator*.{ts,tsx}',\n '**/routes*.{ts,tsx}',\n // §5: Add user-configured navigation patterns (additive, not replacing)\n ...this.navigationInclude,\n ];\n\n const excludePatterns = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n ...(this.config.exclude || []),\n // §5: Add user-configured navigation excludes\n ...this.navigationExclude,\n ];\n\n const files = await glob(patterns, {\n cwd: this.config.rootDir,\n ignore: excludePatterns,\n });\n\n return files.map((file) => path.join(this.config.rootDir, file));\n }\n\n /** Parse navigator definitions from a file */\n private parseNavigators(content: string, filePath: string): ParsedNavigator[] {\n const navigators: ParsedNavigator[] = [];\n\n try {\n const ast = parser.parse(content, {\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'typescript',\n ...((this.config.parserPlugins || []) as parser.ParserPlugin[]),\n ] as parser.ParserPlugin[],\n });\n\n const navigatorCalls: Map<string, ParsedNavigator> = new Map();\n const screensByNavigator: Map<string, ParsedScreen[]> = new Map();\n\n traverse(ast, {\n // Detect createStackNavigator / createTabNavigator / createDrawerNavigator calls\n CallExpression: (nodePath) => {\n const { node } = nodePath;\n const callee = node.callee;\n\n let navigatorType: 'stack' | 'tab' | 'drawer' | null = null;\n\n if (\n t.isIdentifier(callee) &&\n callee.name === 'createNativeStackNavigator'\n ) {\n navigatorType = 'stack';\n } else if (\n t.isIdentifier(callee) &&\n callee.name === 'createStackNavigator'\n ) {\n navigatorType = 'stack';\n } else if (\n t.isIdentifier(callee) &&\n callee.name === 'createBottomTabNavigator'\n ) {\n navigatorType = 'tab';\n } else if (\n t.isIdentifier(callee) &&\n callee.name === 'createTabNavigator'\n ) {\n navigatorType = 'tab';\n } else if (\n t.isIdentifier(callee) &&\n callee.name === 'createDrawerNavigator'\n ) {\n navigatorType = 'drawer';\n }\n\n if (navigatorType) {\n // Extract variable assignment\n const parent = nodePath.parent;\n if (\n t.isVariableDeclarator(parent) &&\n t.isIdentifier(parent.id)\n ) {\n const varName = parent.id.name;\n navigatorCalls.set(varName, {\n name: varName,\n type: navigatorType,\n screens: [],\n });\n }\n }\n },\n\n // Detect Stack.Navigator / Tab.Navigator JSX elements\n JSXElement: (nodePath) => {\n const { node } = nodePath;\n const openingElement = node.openingElement;\n\n if (\n t.isJSXMemberExpression(openingElement.name) &&\n t.isJSXIdentifier(openingElement.name.object)\n ) {\n const objectName = openingElement.name.object.name;\n const propertyName = t.isJSXIdentifier(openingElement.name.property)\n ? openingElement.name.property.name\n : null;\n\n if (propertyName === 'Navigator') {\n const navigator = navigatorCalls.get(objectName);\n if (navigator) {\n // Extract initialRouteName\n const initialRouteAttr = openingElement.attributes.find(\n (attr) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === 'initialRouteName'\n );\n\n if (\n t.isJSXAttribute(initialRouteAttr) &&\n t.isStringLiteral(initialRouteAttr.value)\n ) {\n navigator.initialRouteName = initialRouteAttr.value.value;\n }\n\n // Extract screens from children\n const screens = this.extractScreensFromNavigator(\n node,\n objectName,\n navigator.type\n );\n screensByNavigator.set(objectName, screens);\n }\n }\n }\n },\n });\n\n // Build final navigator list with screens\n navigatorCalls.forEach((navigator) => {\n const screens = screensByNavigator.get(navigator.name) || [];\n navigator.screens = screens;\n navigators.push(navigator);\n });\n } catch (error) {\n console.warn(`Failed to parse navigators in ${filePath}:`, error);\n }\n\n return navigators;\n }\n\n /** Extract screens from a navigator JSX element */\n private extractScreensFromNavigator(\n navigatorElement: t.JSXElement,\n navigatorVarName: string,\n navigatorType: 'stack' | 'tab' | 'drawer'\n ): ParsedScreen[] {\n const screens: ParsedScreen[] = [];\n\n if (!navigatorElement.children) return screens;\n\n for (const child of navigatorElement.children) {\n if (\n t.isJSXElement(child) &&\n t.isJSXMemberExpression(child.openingElement.name)\n ) {\n const memberExpr = child.openingElement.name;\n if (\n t.isJSXIdentifier(memberExpr.object) &&\n memberExpr.object.name === navigatorVarName &&\n t.isJSXIdentifier(memberExpr.property) &&\n memberExpr.property.name === 'Screen'\n ) {\n const screenName = this.extractAttributeValue(\n child.openingElement.attributes,\n 'name'\n );\n\n if (screenName) {\n screens.push({\n name: screenName,\n navigatorName: navigatorVarName,\n navigatorType,\n });\n }\n }\n }\n }\n\n return screens;\n }\n\n /** Extract string attribute value from JSX attributes */\n private extractAttributeValue(\n attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[],\n attrName: string\n ): string | null {\n const attr = attributes.find(\n (a) => t.isJSXAttribute(a) && t.isJSXIdentifier(a.name) && a.name.name === attrName\n );\n\n if (\n t.isJSXAttribute(attr) &&\n t.isStringLiteral(attr.value)\n ) {\n return attr.value.value;\n }\n\n return null;\n }\n\n /** Parse TypeScript type exports (ParamList types) */\n private parseParamTypes(content: string, filePath: string): TypeExport[] {\n const types: TypeExport[] = [];\n\n try {\n const ast = parser.parse(content, {\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'typescript',\n ...((this.config.parserPlugins || []) as parser.ParserPlugin[]),\n ] as parser.ParserPlugin[],\n });\n\n traverse(ast, {\n TSTypeAliasDeclaration: (nodePath) => {\n const { node } = nodePath;\n const typeName = node.id.name;\n\n // Match React Navigation param-list aliases such as\n // RootStackParamList, MainTabParamList, SettingsDrawerParamList,\n // or a project-specific FooParamList.\n const typeMatch = /^[A-Za-z0-9_]*(Stack|Tab|Drawer)?ParamList$/i.test(typeName);\n\n if (typeMatch && node.typeAnnotation?.type === 'TSTypeLiteral') {\n const paramEntries = this.extractParamListEntries(\n node.typeAnnotation as t.TSTypeLiteral,\n typeName\n );\n\n const navType = this.inferTypeFromName(typeName);\n if (navType) {\n types.push({\n name: typeName,\n type: navType.type,\n paramEntries,\n });\n }\n }\n },\n });\n } catch (error) {\n console.warn(`Failed to parse types in ${filePath}:`, error);\n }\n\n return types;\n }\n\n /** Extract param entries from a TypeScript type literal */\n private extractParamListEntries(\n typeLiteral: t.TSTypeLiteral,\n typeName: string\n ): Map<string, ParamDescriptor[]> {\n const entries = new Map<string, ParamDescriptor[]>();\n\n for (const member of typeLiteral.members) {\n if (member.type === 'TSPropertySignature' && member.key) {\n const keyName =\n member.key.type === 'Identifier' ? member.key.name : null;\n\n if (keyName && member.typeAnnotation) {\n const params = this.extractParamsFromType(\n member.typeAnnotation.typeAnnotation\n );\n entries.set(keyName, params);\n }\n }\n }\n\n return entries;\n }\n\n /** Extract param descriptors from a TypeScript type */\n private extractParamsFromType(typeAnnotation: t.TypeAnnotation | t.TSType): ParamDescriptor[] {\n const params: ParamDescriptor[] = [];\n\n if (\n typeAnnotation.type === 'TSUndefinedKeyword' ||\n typeAnnotation.type === 'TSNullKeyword'\n ) {\n return params;\n }\n\n if (typeAnnotation.type === 'TSTypeLiteral') {\n const typeLiteral = typeAnnotation as t.TSTypeLiteral;\n for (const member of typeLiteral.members) {\n if (member.type === 'TSPropertySignature' && member.key) {\n const keyName =\n member.key.type === 'Identifier' ? member.key.name : null;\n\n if (keyName) {\n const typeStr = member.typeAnnotation\n ? this.typeToString(member.typeAnnotation.typeAnnotation)\n : 'unknown';\n const required = !member.optional;\n\n params.push({\n name: keyName,\n type: typeStr,\n required,\n });\n }\n }\n }\n }\n\n return params;\n }\n\n /** Convert TypeScript type annotation to string */\n private typeToString(type: t.TypeAnnotation | t.TSType): string {\n if (type.type === 'TSStringKeyword') return 'string';\n if (type.type === 'TSNumberKeyword') return 'number';\n if (type.type === 'TSBooleanKeyword') return 'boolean';\n if (type.type === 'TSUndefinedKeyword') return 'undefined';\n if (type.type === 'TSNullKeyword') return 'null';\n\n if (type.type === 'TSUnionType') {\n return (type as t.TSUnionType).types.map((t) => this.typeToString(t)).join(' | ');\n }\n\n if (type.type === 'TSTypeLiteral') {\n return 'object';\n }\n\n if (type.type === 'TSTypeReference' && (type as t.TSTypeReference).typeName) {\n const name = (type as t.TSTypeReference).typeName;\n return name.type === 'Identifier' ? name.name : 'unknown';\n }\n\n return 'unknown';\n }\n\n /** Infer navigator type from type name */\n private inferTypeFromName(\n typeName: string\n ): { type: 'stack' | 'tab' | 'drawer' } | null {\n if (/stack/i.test(typeName)) return { type: 'stack' };\n if (/tab/i.test(typeName)) return { type: 'tab' };\n if (/drawer/i.test(typeName)) return { type: 'drawer' };\n return null;\n }\n\n /** Attach parsed type params to navigator screens */\n private attachParamsToNavigators(\n navigators: ParsedNavigator[],\n types: TypeExport[]\n ): void {\n for (const navigator of navigators) {\n // Try to find a matching type export\n const matchingType = types.find((t) => t.type === navigator.type);\n\n if (matchingType) {\n for (const screen of navigator.screens) {\n const screenParams = matchingType.paramEntries.get(screen.name);\n if (screenParams) {\n screen.params = screenParams;\n }\n }\n }\n }\n }\n\n /** Build the complete navigation graph */\n private buildNavigationGraph(\n parsedNavigators: ParsedNavigator[]\n ): NavigationGraph {\n const screens: Record<string, NavigationNode> = {};\n const navigators: NavigatorDescriptor[] = [];\n let initialScreen = '';\n\n // First pass: create navigator descriptors and identify root navigator\n for (const navigator of parsedNavigators) {\n const screenNames = navigator.screens.map((s) => s.name);\n\n navigators.push({\n name: navigator.name,\n type: navigator.type,\n screens: screenNames,\n parentNavigator: navigator.parentNavigator,\n });\n\n // Root navigator is likely the one that contains 'Auth' or 'Main' screens\n // or the first navigator with an initialRouteName\n if (\n !initialScreen &&\n navigator.initialRouteName &&\n (navigator.name.includes('Root') ||\n screenNames.some((s) => s === 'Auth' || s === 'Main'))\n ) {\n initialScreen = navigator.initialRouteName;\n }\n }\n\n // Second pass: create navigation nodes with reachability\n for (const navigator of parsedNavigators) {\n for (const screen of navigator.screens) {\n const screenKey = screen.name;\n\n // Calculate reachable screens\n const reachableTo: string[] = [];\n const reachableFrom: string[] = [];\n\n // For screens in the same navigator\n for (const otherScreen of navigator.screens) {\n if (otherScreen.name !== screen.name) {\n if (navigator.type === 'tab') {\n // Tab screens can reach all other screens in the same tab\n reachableTo.push(otherScreen.name);\n reachableFrom.push(otherScreen.name);\n } else {\n // Stack screens can reach other screens via navigation\n reachableTo.push(otherScreen.name);\n }\n }\n }\n\n screens[screenKey] = {\n screenName: screen.name,\n navigatorType: navigator.type,\n parentNavigator: navigator.name,\n reachableFrom,\n reachableTo,\n params: screen.params,\n };\n }\n }\n\n // If no initial screen identified, use the first screen from the root navigator\n if (!initialScreen && parsedNavigators.length > 0) {\n const firstNavigator = parsedNavigators[0];\n const rootNavigator = parsedNavigators.find(\n (n) => n.name.includes('Root') || (firstNavigator && n.name === firstNavigator.name)\n );\n if (rootNavigator && rootNavigator.screens && rootNavigator.screens.length > 0) {\n const firstScreen = rootNavigator.screens[0];\n initialScreen = firstScreen?.name || '';\n }\n }\n\n return {\n screens,\n initialScreen,\n navigators,\n };\n }\n}\n","import type { AnalyzerConfig, ComponentDescriptor } from '../types';\nimport { readFileSync } from 'fs';\nimport * as parser from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\n/**\n * Analyzes React Native components to extract their semantic meaning,\n * props, and interaction points.\n */\nexport class ComponentAnalyzer {\n private config: AnalyzerConfig;\n\n constructor(config: AnalyzerConfig) {\n this.config = config;\n }\n\n /** Analyze components in a file */\n async analyzeFile(filePath: string): Promise<ComponentDescriptor[]> {\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', ['decorators', { decoratorsBeforeExport: true }]],\n });\n\n const components: ComponentDescriptor[] = [];\n\n traverse(ast, {\n JSXElement: (path) => {\n const component = this.extractComponentFromJSXElement(path.node);\n if (component) {\n components.push(component);\n }\n },\n });\n\n return components;\n } catch (error) {\n console.error(`Failed to analyze file ${filePath}:`, error);\n return [];\n }\n }\n\n private extractComponentFromJSXElement(\n element: t.JSXElement\n ): ComponentDescriptor | null {\n const elementName = this.getElementName(element.openingElement);\n if (!elementName) return null;\n\n const type = this.determineComponentType(elementName);\n const props = this.extractProps(element.openingElement);\n const { testID, accessibilityLabel } = this.extractAccessibilityProps(element.openingElement);\n const children = this.extractChildren(element.children);\n\n return {\n name: elementName,\n type,\n props: Object.keys(props).length > 0 ? props : undefined,\n children: children.length > 0 ? children : undefined,\n testID,\n accessibilityLabel,\n };\n }\n\n private getElementName(openingElement: t.JSXOpeningElement): string | null {\n if (t.isJSXIdentifier(openingElement.name)) {\n return openingElement.name.name;\n }\n if (t.isJSXMemberExpression(openingElement.name)) {\n const parts: string[] = [];\n let current: t.JSXNamespacedName | t.JSXMemberExpression | t.JSXIdentifier =\n openingElement.name;\n while (t.isJSXMemberExpression(current)) {\n if (t.isJSXIdentifier(current.property)) {\n parts.unshift(current.property.name);\n }\n current = current.object as t.JSXNamespacedName | t.JSXMemberExpression | t.JSXIdentifier;\n }\n if (t.isJSXIdentifier(current)) {\n parts.unshift(current.name);\n }\n return parts.join('.');\n }\n return null;\n }\n\n private determineComponentType(\n name: string\n ): 'view' | 'input' | 'button' | 'list' | 'modal' | 'custom' {\n const viewComponents = ['View', 'ScrollView', 'SafeAreaView', 'KeyboardAvoidingView'];\n const inputComponents = ['TextInput', 'Input'];\n const buttonComponents = ['TouchableOpacity', 'Pressable', 'Button'];\n const listComponents = ['FlatList', 'SectionList'];\n const modalComponents = ['Modal', 'BottomSheet'];\n\n if (viewComponents.includes(name)) return 'view';\n if (inputComponents.includes(name)) return 'input';\n if (buttonComponents.includes(name)) return 'button';\n if (listComponents.includes(name)) return 'list';\n if (modalComponents.includes(name)) return 'modal';\n\n return 'custom';\n }\n\n private extractProps(openingElement: t.JSXOpeningElement): Record<string, string> {\n const props: Record<string, string> = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if (attr.value === null) {\n // Boolean prop\n props[propName] = 'true';\n } else if (t.isStringLiteral(attr.value)) {\n props[propName] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n props[propName] = attr.value.expression.value;\n }\n }\n }\n\n return props;\n }\n\n private extractAccessibilityProps(openingElement: t.JSXOpeningElement): {\n testID?: string;\n accessibilityLabel?: string;\n } {\n const result: { testID?: string; accessibilityLabel?: string } = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if ((propName === 'testID' || propName === 'accessibilityLabel') && attr.value) {\n if (t.isStringLiteral(attr.value)) {\n result[propName as keyof typeof result] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n result[propName as keyof typeof result] = attr.value.expression.value;\n }\n }\n }\n }\n\n return result;\n }\n\n private extractChildren(\n children: Array<t.JSXElement[\"children\"][number]>,\n depth: number = 0,\n maxDepth: number = 3\n ): ComponentDescriptor[] {\n if (depth >= maxDepth) return [];\n\n const extracted: ComponentDescriptor[] = [];\n\n for (const child of children) {\n if (t.isJSXElement(child)) {\n const component = this.extractComponentFromJSXElement(child);\n if (component) {\n extracted.push(component);\n }\n }\n }\n\n return extracted;\n }\n}\n","import type { AnalyzerConfig, FormDescriptor, FormFieldDescriptor } from '../types';\nimport { readFileSync } from 'fs';\nimport * as parser from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport * as path from 'path';\n\n/**\n * Analyzes form structures in React Native screens, extracting\n * field definitions, validation rules, and submit actions.\n */\nexport class FormAnalyzer {\n private config: AnalyzerConfig;\n private stateVariables: Map<string, { varName: string; type: string }> = new Map();\n private inputElements: Array<{\n varName: string;\n appilotsId?: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n }> = [];\n private submitButtons: Array<{ label?: string; handler?: string }> = [];\n\n constructor(config: AnalyzerConfig) {\n this.config = config;\n }\n\n /** Analyze forms in a file */\n async analyzeFile(filePath: string): Promise<FormDescriptor[]> {\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', ['decorators', { decoratorsBeforeExport: true }]],\n });\n\n this.stateVariables.clear();\n this.inputElements = [];\n this.submitButtons = [];\n\n // First pass: extract state variables\n traverse(ast, {\n CallExpression: (path) => {\n this.extractStateVariables(path.node);\n },\n });\n\n // Second pass: extract input elements and buttons\n traverse(ast, {\n JSXElement: (path) => {\n this.extractFormElements(path.node);\n },\n });\n\n // Third pass: extract validation rules\n const validationRules = this.extractValidationRules(ast);\n\n // Build forms from extracted data\n return this.buildForms(filePath, validationRules);\n } catch (error) {\n console.error(`Failed to analyze forms in file ${filePath}:`, error);\n return [];\n }\n }\n\n private extractStateVariables(node: t.CallExpression): void {\n if (\n t.isIdentifier(node.callee) &&\n node.callee.name === 'useState' &&\n node.arguments.length > 0\n ) {\n // Try to find the assignment: const [varName, setVarName] = useState(...)\n // This is found in VariableDeclarator context\n return;\n }\n }\n\n private extractFormElements(element: t.JSXElement): void {\n const elementName = this.getElementName(element.openingElement);\n\n if (!elementName) return;\n\n // Detect input elements\n if (elementName === 'TextInput' || elementName === 'Input') {\n const inputInfo = this.extractInputInfo(element.openingElement);\n this.inputElements.push(inputInfo);\n }\n\n // Detect submit buttons (TouchableOpacity, Pressable, Button with onPress at end)\n if (['TouchableOpacity', 'Pressable', 'Button'].includes(elementName)) {\n const buttonInfo = this.extractButtonInfo(element.openingElement);\n if (buttonInfo) {\n this.submitButtons.push(buttonInfo);\n }\n }\n }\n\n private extractInputInfo(\n openingElement: t.JSXOpeningElement\n ): {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n } {\n const info: {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n } = { varName: '' };\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n const propValue = this.extractAttributeValue(attr.value);\n\n switch (propName) {\n case 'label':\n info.label = propValue;\n break;\n case 'placeholder':\n info.placeholder = propValue;\n break;\n case 'keyboardType':\n info.keyboardType = propValue;\n break;\n case 'testID':\n info.testID = propValue;\n break;\n case 'appilotsId':\n info.appilotsId = propValue;\n if (propValue) info.varName = propValue;\n break;\n case 'value':\n // Try to extract variable name from value binding\n if (attr.value && t.isJSXExpressionContainer(attr.value) && t.isIdentifier(attr.value.expression)) {\n info.varName = attr.value.expression.name;\n }\n break;\n }\n }\n }\n\n return info;\n }\n\n private extractButtonInfo(\n openingElement: t.JSXOpeningElement\n ): { label?: string; handler?: string } | null {\n const info: { label?: string; handler?: string } = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if (propName === 'title' || propName === 'label') {\n info.label = this.extractAttributeValue(attr.value);\n }\n\n if (propName === 'onPress') {\n if (attr.value && t.isJSXExpressionContainer(attr.value)) {\n if (t.isIdentifier(attr.value.expression)) {\n info.handler = attr.value.expression.name;\n } else if (t.isArrowFunctionExpression(attr.value.expression) || t.isFunctionExpression(attr.value.expression)) {\n info.handler = 'anonymous';\n }\n }\n }\n }\n }\n\n return Object.keys(info).length > 0 ? info : null;\n }\n\n private extractAttributeValue(value: t.JSXAttribute['value']): string | undefined {\n if (value === null) return undefined;\n if (t.isStringLiteral(value)) return value.value;\n if (t.isJSXExpressionContainer(value) && t.isStringLiteral(value.expression)) {\n return value.expression.value;\n }\n return undefined;\n }\n\n private getElementName(openingElement: t.JSXOpeningElement): string | null {\n if (t.isJSXIdentifier(openingElement.name)) {\n return openingElement.name.name;\n }\n return null;\n }\n\n private extractValidationRules(ast: t.File): Record<string, string> {\n const rules: Record<string, string> = {};\n\n traverse(ast, {\n IfStatement: (path) => {\n const test = path.node.test;\n const rule = this.extractRuleFromCondition(test);\n if (rule) {\n const { field, description } = rule;\n if (field && description) {\n rules[field] = description;\n }\n }\n },\n });\n\n return rules;\n }\n\n private extractRuleFromCondition(\n test: t.Expression\n ): { field: string; description: string } | null {\n let fieldName = '';\n let description = '';\n\n // Pattern: !varName.trim() or varName.length < N\n if (t.isUnaryExpression(test) && test.operator === '!') {\n if (t.isCallExpression(test.argument)) {\n const callExpr = test.argument;\n if (t.isMemberExpression(callExpr.callee)) {\n const memberExpr = callExpr.callee;\n if (t.isIdentifier(memberExpr.object)) {\n fieldName = memberExpr.object.name;\n description = `${fieldName} is required`;\n }\n }\n } else if (t.isIdentifier(test.argument)) {\n fieldName = test.argument.name;\n description = `${fieldName} is required`;\n }\n }\n\n // Pattern: varName.length < N\n if (t.isBinaryExpression(test) && (test.operator === '<' || test.operator === '<=')) {\n if (t.isMemberExpression(test.left)) {\n const memberExpr = test.left;\n if (t.isIdentifier(memberExpr.object)) {\n fieldName = memberExpr.object.name;\n if (t.isNumericLiteral(test.right)) {\n description = `${fieldName} must be at least ${test.right.value} characters`;\n }\n }\n }\n }\n\n // Pattern: !varName.includes('@')\n if (t.isUnaryExpression(test) && test.operator === '!') {\n if (t.isCallExpression(test.argument) && t.isMemberExpression(test.argument.callee)) {\n const methodName = t.isIdentifier(test.argument.callee.property)\n ? test.argument.callee.property.name\n : null;\n if (methodName === 'includes' && t.isIdentifier(test.argument.callee.object)) {\n fieldName = test.argument.callee.object.name;\n description = `${fieldName} format is invalid`;\n }\n }\n }\n\n return fieldName && description ? { field: fieldName, description } : null;\n }\n\n private buildForms(filePath: string, validationRules: Record<string, string>): FormDescriptor[] {\n if (this.inputElements.length === 0) return [];\n\n const fileName = path.basename(filePath, path.extname(filePath));\n const formId = `${fileName}Form`.replace(/Screen$/, '').toLowerCase();\n\n const fields: FormFieldDescriptor[] = this.inputElements.map((input) => {\n const fieldType = this.inferFieldType(input);\n const required = this.isFieldRequired(input.varName, validationRules);\n\n return {\n name: input.appilotsId || input.varName || input.testID || 'field',\n label: input.label,\n type: fieldType,\n required,\n placeholder: input.placeholder,\n };\n });\n\n const lastButton = this.submitButtons[this.submitButtons.length - 1];\n const submitAction = lastButton?.handler;\n\n return [\n {\n id: formId,\n fields,\n submitAction,\n validationRules: Object.keys(validationRules).length > 0 ? validationRules : undefined,\n },\n ];\n }\n\n private inferFieldType(input: {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n }): FormFieldDescriptor['type'] {\n const lowerVarName = input.varName.toLowerCase();\n const lowerLabel = input.label?.toLowerCase() || '';\n const lowerPlaceholder = input.placeholder?.toLowerCase() || '';\n const combined = `${lowerVarName} ${lowerLabel} ${lowerPlaceholder}`;\n\n // Check keyboardType first\n if (input.keyboardType === 'email-address' || input.keyboardType === 'email') {\n return 'email';\n }\n if (input.keyboardType === 'phone-pad' || input.keyboardType === 'numeric') {\n return input.keyboardType === 'numeric' ? 'number' : 'phone';\n }\n\n // Check variable/label/placeholder names\n if (combined.includes('email')) return 'email';\n if (combined.includes('phone') || combined.includes('tel')) return 'phone';\n if (combined.includes('password')) return 'text';\n if (combined.includes('number') || combined.includes('numeric')) return 'number';\n if (combined.includes('date')) return 'date';\n if (combined.includes('toggle') || combined.includes('check')) return 'toggle';\n if (combined.includes('select') || combined.includes('choice')) return 'select';\n\n return 'text';\n }\n\n private isFieldRequired(fieldName: string, rules: Record<string, string>): boolean {\n const rule = rules[fieldName];\n return rule !== undefined && rule.includes('required');\n }\n}\n","import type {\n ActionDescriptor,\n CollectionDescriptor,\n FlowDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n ScreenAgentHints,\n ScreenDescriptor,\n TargetDescriptor,\n WaitPolicyDescriptor,\n} from '../types';\n\nexport function enrichScreenForAgent(screen: ScreenDescriptor): ScreenDescriptor {\n const targets = mergeTargets([\n ...targetsFromForms(screen.forms),\n ...targetsFromActions(screen.actions),\n ...targetsFromCollections(screen.collections ?? []),\n ]);\n const flows = synthesizeFlows(screen, targets);\n const agentHints = synthesizeAgentHints(screen, targets, flows);\n\n return {\n ...screen,\n ...(targets.length > 0 ? { targets } : {}),\n ...(flows.length > 0 ? { flows } : {}),\n ...(agentHints ? { agentHints } : {}),\n };\n}\n\nfunction targetsFromForms(forms: FormDescriptor[]): TargetDescriptor[] {\n const targets: TargetDescriptor[] = [];\n for (const form of forms) {\n for (const field of form.fields) {\n targets.push({\n id: field.locator?.id ?? field.name,\n role: fieldToRole(field),\n label: field.label,\n fieldName: field.name,\n locator: field.locator ?? { id: field.name, source: 'inferred' },\n sourceComponent: field.sourceComponent,\n });\n }\n if (form.submitAction && form.submitAction !== 'anonymous') {\n targets.push({\n id: form.submitAction,\n role: 'submit',\n actionId: form.submitAction,\n label: form.submitAction,\n });\n }\n }\n return targets;\n}\n\nfunction fieldToRole(field: FormFieldDescriptor): TargetDescriptor['role'] {\n if (field.type === 'toggle') return 'toggle';\n if (field.type === 'select') return 'select';\n if (field.type === 'date') return 'date';\n return 'input';\n}\n\nfunction targetsFromActions(actions: ActionDescriptor[]): TargetDescriptor[] {\n return actions\n .filter((action) => action.id)\n .map((action) => ({\n id: action.locator?.id ?? action.id,\n role: action.type === 'submit' ? 'submit' : 'button',\n label: action.label,\n locator: action.locator ?? { id: action.id, label: action.label, source: 'inferred' },\n actionId: action.id,\n handler: action.handler,\n targetScreen: action.targetScreen,\n destructive: action.destructive,\n requiresConfirmation: action.requiresConfirmation,\n opensModal: action.opensModal,\n opensBottomSheet: action.opensBottomSheet,\n sourceComponent: action.sourceComponent,\n }));\n}\n\nfunction targetsFromCollections(collections: CollectionDescriptor[]): TargetDescriptor[] {\n return collections.map((collection) => ({\n id: collection.id,\n role: 'list',\n label: collection.itemType ?? collection.dataSource ?? collection.id,\n locator: { id: collection.id, testID: collection.id, source: 'testID' },\n sourceComponent: collection.component,\n }));\n}\n\nfunction mergeTargets(targets: TargetDescriptor[]): TargetDescriptor[] {\n const byId = new Map<string, TargetDescriptor>();\n for (const target of targets) {\n if (!target.id) continue;\n const existing = byId.get(target.id);\n byId.set(target.id, existing ? { ...target, ...existing, locator: existing.locator ?? target.locator } : target);\n }\n return Array.from(byId.values()).sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction synthesizeFlows(screen: ScreenDescriptor, targets: TargetDescriptor[]): FlowDescriptor[] {\n const flows: FlowDescriptor[] = [];\n\n for (const form of screen.forms) {\n const submitAction = screen.actions.find((action) => action.id === form.submitAction)\n ?? screen.actions.find((action) => action.type === 'submit');\n if (!submitAction) continue;\n\n flows.push({\n id: `submit-${form.id}`,\n title: submitAction.label ? `Submit ${submitAction.label}` : `Submit ${form.id}`,\n intent: 'form_submit',\n steps: [\n ...form.fields.map((field) => ({\n type: field.type === 'select' ? 'select' : field.type === 'toggle' ? 'toggle' : 'fill',\n target: field.name,\n label: field.label,\n required: field.required,\n description: field.placeholder,\n })),\n { type: 'press', target: submitAction.id, label: submitAction.label },\n { type: 'wait', description: describeWait(submitAction) },\n ],\n waitPolicy: waitPolicyForAction(submitAction),\n safetyNotes: submitAction.requiresConfirmation || submitAction.destructive\n ? ['Requires confirmation before execution']\n : undefined,\n });\n }\n\n for (const action of screen.actions) {\n if (action.type === 'submit') continue;\n if (action.targetScreen) {\n flows.push({\n id: `navigate-${action.id}`,\n title: action.label ? `Open ${action.label}` : `Navigate to ${action.targetScreen}`,\n intent: 'navigate',\n steps: [{ type: 'press', target: action.id, label: action.label }],\n waitPolicy: waitPolicyForAction(action),\n });\n } else if (action.destructive || action.requiresConfirmation) {\n flows.push({\n id: `confirm-${action.id}`,\n title: action.label ? `Confirm ${action.label}` : `Confirm ${action.id}`,\n intent: 'destructive_action',\n steps: [\n { type: 'press', target: action.id, label: action.label },\n { type: 'confirm', description: 'Wait for native or custom confirmation before continuing' },\n { type: 'wait', description: describeWait(action) },\n ],\n waitPolicy: waitPolicyForAction(action),\n safetyNotes: ['Destructive or high-risk action'],\n });\n }\n }\n\n for (const collection of screen.collections ?? []) {\n if (collection.rowAction || (collection.rowActions && collection.rowActions.length > 0)) {\n flows.push({\n id: `list-${collection.id}`,\n title: `Act on an item in ${collection.id}`,\n intent: 'list_action',\n steps: [\n { type: 'choose-list-item', target: collection.id, description: 'Resolve the user reference to a visible or searchable row' },\n { type: 'press', description: collection.rowAction?.description ?? 'Open the row action' },\n ],\n waitPolicy: { expectedOutcome: collection.rowAction?.targetScreen ? 'navigation' : 'inline-feedback' },\n });\n }\n }\n\n return flows.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction waitPolicyForAction(action: ActionDescriptor): WaitPolicyDescriptor {\n const expectedOutcome = action.successSignal?.type === 'goBack'\n ? 'goBack'\n : action.appilotsInferred?.expectedOutcome ?? (action.targetScreen ? 'navigation' : undefined);\n const signals = [action.successSignal, action.failureSignal].filter(Boolean) as WaitPolicyDescriptor['signals'];\n return {\n ...(expectedOutcome ? { expectedOutcome } : {}),\n ...(signals && signals.length > 0 ? { signals } : {}),\n ...(action.appilotsInferred?.isAsyncTrigger ? { maxMs: 10000 } : {}),\n };\n}\n\nfunction describeWait(action: ActionDescriptor): string {\n if (action.successSignal?.description) return action.successSignal.description;\n if (action.successSignal?.type === 'goBack') return 'Wait for the app to return to the previous screen';\n if (action.targetScreen) return `Wait for navigation to ${action.targetScreen}`;\n if (action.appilotsInferred?.expectedOutcome) return `Wait for ${action.appilotsInferred.expectedOutcome}`;\n return 'Wait for the UI to settle';\n}\n\nfunction synthesizeAgentHints(\n screen: ScreenDescriptor,\n targets: TargetDescriptor[],\n flows: FlowDescriptor[],\n): ScreenAgentHints | undefined {\n const preferredTargets = targets\n .filter((target) => ['submit', 'button', 'list'].includes(target.role))\n .slice(0, 8)\n .map((target) => target.id);\n const commonTasks = flows.slice(0, 6).map((flow) => flow.title);\n const safetyNotes = screen.actions\n .filter((action) => action.destructive || action.requiresConfirmation)\n .map((action) => `${action.id} requires confirmation`);\n const firstAsyncAction = screen.actions.find((action) => action.appilotsInferred?.isAsyncTrigger);\n\n const hints: ScreenAgentHints = {\n primaryGoal: synthesizePrimaryGoal(screen),\n commonTasks,\n preferredTargets,\n ...(firstAsyncAction ? { waitPolicy: waitPolicyForAction(firstAsyncAction) } : {}),\n ...(safetyNotes.length > 0 ? { safetyNotes } : {}),\n };\n\n return hints.primaryGoal || commonTasks.length > 0 || preferredTargets.length > 0\n ? hints\n : undefined;\n}\n\nfunction synthesizePrimaryGoal(screen: ScreenDescriptor): string | undefined {\n const goals: string[] = [];\n const collections = screen.collections ?? [];\n\n if (collections.length > 0) {\n const collectionNames = collections\n .map((collection) => collection.itemType ?? collection.dataSource ?? collection.id)\n .filter(Boolean)\n .slice(0, 3);\n goals.push(\n collectionNames.length > 0\n ? `Browse and act on ${collectionNames.join(', ')} list data`\n : 'Browse and act on list data',\n );\n }\n\n const uniqueFields = new Map<string, FormFieldDescriptor>();\n for (const form of screen.forms) {\n for (const field of form.fields) {\n uniqueFields.set(field.name, field);\n }\n }\n const fieldCount = uniqueFields.size;\n if (fieldCount > 0) {\n const requiredCount = Array.from(uniqueFields.values()).filter((field) => field.required).length;\n const fieldLabel = fieldCount === 1 ? 'field' : 'fields';\n goals.push(\n requiredCount > 0\n ? `Complete a form with ${fieldCount} ${fieldLabel} (${requiredCount} required)`\n : `Complete a form with ${fieldCount} ${fieldLabel}`,\n );\n }\n\n const navigationCount = screen.actions.filter((action) => action.targetScreen).length;\n if (navigationCount > 0) {\n goals.push(`Open ${navigationCount} related screen${navigationCount === 1 ? '' : 's'}`);\n }\n\n const submitCount = screen.actions.filter((action) => action.type === 'submit').length;\n if (submitCount > 0) {\n goals.push(`Submit ${submitCount === 1 ? 'the primary form' : `${submitCount} forms/actions`}`);\n }\n\n const asyncCount = screen.actions.filter((action) => action.appilotsInferred?.isAsyncTrigger).length;\n if (asyncCount > 0) {\n goals.push(`Wait for ${asyncCount === 1 ? 'async feedback' : 'async action feedback'}`);\n }\n\n if (goals.length > 0) return goals.join('; ');\n if (screen.title) return `Screen labeled \"${screen.title}\"`;\n return undefined;\n}\n","import { mkdir, writeFile, readFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport type { MCPGeneratorOptions, MCPDocument, MCPOutput } from './types';\nimport type { AnalyzerConfig, FormDescriptor, FormFieldDescriptor, ScreenDescriptor } from '../types';\nimport { ScreenAnalyzer } from '../analyzers/ScreenAnalyzer';\nimport { NavigationAnalyzer } from '../analyzers/NavigationAnalyzer';\nimport { ComponentAnalyzer } from '../analyzers/ComponentAnalyzer';\nimport { FormAnalyzer } from '../analyzers/FormAnalyzer';\nimport { enrichScreenForAgent } from '../pipeline/enrichment';\nimport glob from 'fast-glob';\n\n/**\n * Main generator that orchestrates analyzers and produces MCP documents.\n *\n * @example\n * ```ts\n * const generator = new MCPGenerator({\n * rootDir: './my-rn-app',\n * outputDir: '.appilots',\n * format: 'json',\n * });\n *\n * const output = await generator.generate();\n * console.log(`Generated MCP at: ${output.filePath}`);\n * ```\n */\nexport interface MCPGeneratorConfig {\n rootDir: string;\n outputDir?: string;\n format?: 'json';\n version?: string;\n includeSourcePaths?: boolean;\n splitOutput?: boolean;\n /** §1: Only include files with registerScreen() or matching screen patterns */\n strictScreens?: boolean;\n /** §1: Custom glob patterns for screen file detection */\n screenPatterns?: string[];\n /** §5: Additional navigation file patterns (added to defaults) */\n navigationInclude?: string[];\n /** §5: Exclude patterns for navigation analysis */\n navigationExclude?: string[];\n /** Source include patterns */\n include?: string[];\n /** Source exclude patterns */\n exclude?: string[];\n}\n\nexport class MCPGenerator {\n private analyzerConfig: AnalyzerConfig;\n private options: MCPGeneratorOptions;\n private generatorConfig: MCPGeneratorConfig;\n\n constructor(config: MCPGeneratorConfig) {\n this.generatorConfig = config;\n\n this.analyzerConfig = {\n rootDir: config.rootDir,\n include: config.include ?? ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n exclude: config.exclude ?? ['**/node_modules/**', '**/__tests__/**', '**/dist/**'],\n };\n\n this.options = {\n format: config.format ?? 'json',\n outputDir: config.outputDir ?? '.appilots',\n includeSourcePaths: config.includeSourcePaths ?? false,\n splitOutput: config.splitOutput ?? false,\n version: config.version ?? '1.0',\n };\n }\n\n /** Generate MCP documents from the project */\n async generate(): Promise<MCPOutput> {\n console.log('[MCPGenerator] Starting generation...');\n\n // Create output directory if it doesn't exist\n const outputDir = this.options.outputDir || '.appilots';\n await mkdir(outputDir, { recursive: true });\n console.log(`[MCPGenerator] Output directory ensured: ${outputDir}`);\n\n // Run all analyzers in parallel\n const screenAnalyzer = new ScreenAnalyzer(this.analyzerConfig, {\n strictScreens: this.generatorConfig.strictScreens ?? true,\n screenPatterns: this.generatorConfig.screenPatterns,\n });\n const navigationAnalyzer = new NavigationAnalyzer(this.analyzerConfig, {\n navigationInclude: this.generatorConfig.navigationInclude,\n navigationExclude: this.generatorConfig.navigationExclude,\n });\n const componentAnalyzer = new ComponentAnalyzer(this.analyzerConfig);\n const formAnalyzer = new FormAnalyzer(this.analyzerConfig);\n\n console.log('[MCPGenerator] Running analyzers...');\n const [screens, navigation] = await Promise.all([\n screenAnalyzer.analyze(),\n navigationAnalyzer.analyze(),\n ]);\n\n console.log(\n `[MCPGenerator] Screen and navigation analysis complete. Found ${screens.length} screens`\n );\n\n // Find all screen files to run ComponentAnalyzer and FormAnalyzer on each\n const screenFiles = await glob(\n this.analyzerConfig.include || ['**/*.tsx', '**/*.ts'],\n {\n cwd: this.analyzerConfig.rootDir,\n ignore: this.analyzerConfig.exclude || ['**/node_modules/**'],\n }\n );\n\n console.log(`[MCPGenerator] Analyzing components and forms from ${screenFiles.length} files...`);\n\n // Run ComponentAnalyzer and FormAnalyzer on each screen file\n const enrichmentPromises = screenFiles.map(async (file: string) => {\n const filePath = path.resolve(this.analyzerConfig.rootDir, file);\n try {\n const [components, forms] = await Promise.all([\n componentAnalyzer.analyzeFile(filePath),\n formAnalyzer.analyzeFile(filePath),\n ]);\n return { filePath, components, forms };\n } catch (error) {\n console.warn(`[MCPGenerator] Failed to analyze ${file}:`, error);\n return { filePath, components: [], forms: [] };\n }\n });\n\n const enrichmentResults = await Promise.all(enrichmentPromises);\n\n // Create a map of file path to enrichment data\n const enrichmentMap = new Map<\n string,\n { components: any[]; forms: any[] }\n >();\n for (const result of enrichmentResults) {\n enrichmentMap.set(result.filePath, {\n components: result.components,\n forms: result.forms,\n });\n }\n\n // Enrich screens with components and forms from analyzers\n const enrichedScreens = screens.map((screen) => {\n const enrichment = enrichmentMap.get(screen.filePath);\n if (enrichment) {\n // Merge components (avoid duplicates)\n const existingComponentNames = new Set(screen.components.map((c) => c.name));\n const newComponents = enrichment.components.filter(\n (c: any) => !existingComponentNames.has(c.name)\n );\n\n // Merge forms. registerScreen/ScreenAnalyzer forms are the primary\n // contract; FormAnalyzer enriches them with submit/validation data.\n const mergedForms: FormDescriptor[] = screen.forms.map((form) => ({\n ...form,\n fields: [...form.fields],\n }));\n for (const newForm of enrichment.forms) {\n const existingForm =\n mergedForms.find((form) => form.id === newForm.id) ??\n this.findFormWithSharedFields(mergedForms, newForm);\n if (existingForm) {\n this.mergeForm(existingForm, newForm);\n } else {\n mergedForms.push({\n ...newForm,\n fields: [...newForm.fields],\n submitAction: this.namedSubmitAction(newForm.submitAction),\n });\n }\n }\n\n return {\n ...screen,\n components: [...screen.components, ...newComponents],\n forms: mergedForms,\n } as ScreenDescriptor;\n }\n return screen;\n });\n\n const agentReadyScreens = enrichedScreens.map(enrichScreenForAgent);\n\n // Get project name and app version from package.json\n const projectInfo = await this.getProjectInfo();\n const projectName = projectInfo.name;\n\n console.log(`[MCPGenerator] Project name: ${projectName}`);\n\n // Build the MCPDocument\n const document: MCPDocument = {\n version: this.options.version!,\n generatedAt: new Date().toISOString(),\n projectName,\n screens: agentReadyScreens,\n navigation,\n metadata: {\n generatorVersion: '0.1.0',\n ...(projectInfo.version ? { appVersion: projectInfo.version } : {}),\n totalScreens: agentReadyScreens.length,\n totalForms: agentReadyScreens.reduce((acc, s) => acc + s.forms.length, 0),\n totalActions: agentReadyScreens.reduce((acc, s) => acc + s.actions.length, 0),\n analyzedFiles: screenFiles.length,\n // §D: Only set when strict mode filters out screens\n ...(screenAnalyzer.screensFilteredOut > 0\n ? { screensFilteredOut: screenAnalyzer.screensFilteredOut }\n : {}),\n },\n };\n\n // Serialize document to JSON\n const serialized = JSON.stringify(document, null, 2);\n\n // Calculate SHA-256 checksum\n const checksum = this.calculateChecksum(serialized);\n\n // Write the document file\n const filePath = path.resolve(\n outputDir,\n `mcp-document.${this.options.format}`\n );\n await writeFile(filePath, serialized, 'utf-8');\n console.log(`[MCPGenerator] Document written to: ${filePath}`);\n\n // Write checksum file\n const checksumFilePath = path.resolve(outputDir, '.appilots-checksum');\n await writeFile(checksumFilePath, checksum, 'utf-8');\n console.log(`[MCPGenerator] Checksum written to: ${checksumFilePath}`);\n\n console.log('[MCPGenerator] Generation complete!');\n\n return {\n document,\n filePath,\n format: this.options.format,\n checksum,\n };\n }\n\n /**\n * Read the previously stored checksum from disk.\n * Returns null if no checksum file exists (first run).\n *\n * §4: This replaces the incomplete `hasChanged` static method.\n * To detect actual changes, compare this value with `output.checksum`\n * after calling `generate()`.\n */\n static async readPreviousChecksum(outputDir: string): Promise<string | null> {\n const checksumFilePath = path.resolve(outputDir, '.appilots-checksum');\n try {\n const content = await readFile(checksumFilePath, 'utf-8');\n return content.trim() || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Calculate SHA-256 checksum of content\n */\n private calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n }\n\n private mergeForm(target: FormDescriptor, source: FormDescriptor): void {\n for (const field of source.fields) {\n const existingField = this.findEquivalentField(target.fields, field);\n if (existingField) {\n this.mergeField(existingField, field);\n } else {\n target.fields.push(field);\n }\n }\n target.submitAction = target.submitAction ?? this.namedSubmitAction(source.submitAction);\n target.validationRules = source.validationRules\n ? { ...source.validationRules, ...(target.validationRules ?? {}) }\n : target.validationRules;\n }\n\n private findEquivalentField(\n fields: FormFieldDescriptor[],\n incoming: FormFieldDescriptor,\n ): FormFieldDescriptor | undefined {\n return fields.find((field) => {\n if (field.name && incoming.name && field.name === incoming.name) return true;\n if (field.valueBinding && incoming.valueBinding && field.valueBinding === incoming.valueBinding) return true;\n if (field.locator?.id && incoming.locator?.id && field.locator.id === incoming.locator.id) return true;\n if (field.placeholder && incoming.placeholder && field.placeholder === incoming.placeholder) return true;\n if (\n field.locator?.accessibilityLabel &&\n incoming.locator?.accessibilityLabel &&\n field.locator.accessibilityLabel === incoming.locator.accessibilityLabel\n ) {\n return true;\n }\n return false;\n });\n }\n\n private mergeField(target: FormFieldDescriptor, source: FormFieldDescriptor): void {\n if (this.isWeakInferredFieldName(target.name) && !this.isWeakInferredFieldName(source.name)) {\n target.name = source.name;\n }\n target.label = target.label ?? source.label;\n target.placeholder = target.placeholder ?? source.placeholder;\n target.options = target.options ?? source.options;\n target.locator = target.locator ?? source.locator;\n target.sourceComponent = target.sourceComponent ?? source.sourceComponent;\n target.valueBinding = target.valueBinding ?? source.valueBinding;\n target.errorBinding = target.errorBinding ?? source.errorBinding;\n target.required = target.required || source.required;\n if (target.type === 'text' && source.type !== 'text') {\n target.type = source.type;\n }\n }\n\n private namedSubmitAction(submitAction: string | undefined): string | undefined {\n return submitAction && submitAction !== 'anonymous' ? submitAction : undefined;\n }\n\n private isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n }\n\n private findFormWithSharedFields(\n forms: FormDescriptor[],\n incoming: FormDescriptor,\n ): FormDescriptor | undefined {\n if (incoming.fields.length === 0) return undefined;\n\n let best: { form: FormDescriptor; overlap: number } | undefined;\n for (const form of forms) {\n const overlap = incoming.fields.filter((field) => this.findEquivalentField(form.fields, field)).length;\n if (overlap > 0 && (!best || overlap > best.overlap)) {\n best = { form, overlap };\n }\n }\n\n return best?.form;\n }\n\n /**\n * Get project name and version from package.json in rootDir\n */\n private async getProjectInfo(): Promise<{ name: string; version?: string }> {\n try {\n const packageJsonPath = path.resolve(this.analyzerConfig.rootDir, 'package.json');\n const packageJsonContent = await readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n return {\n name: packageJson.name || 'Unknown Project',\n version: typeof packageJson.version === 'string' ? packageJson.version : undefined,\n };\n } catch (error) {\n console.warn('[MCPGenerator] Failed to read package.json, using default project name');\n return { name: 'Unknown Project' };\n }\n }\n}\n","import { readFileSync, writeFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { existsSync, statSync } from 'fs';\n\n/**\n * Appilots configuration interface\n */\nexport interface AppilotsConfig {\n /** API key for authenticating with Appilots backend */\n apiKey: string;\n /**\n * Project ID on Appilots dashboard. Optional at load time — the API key\n * already identifies the project server-side (env-only CI workflows run\n * without a .appilotsrc), so commands must not assume it is present.\n */\n projectId?: string;\n /** Server URL for Appilots API */\n serverUrl: string;\n /** Output directory for generated files */\n outputDir?: string;\n /** Glob patterns to include in analysis */\n include?: string[];\n /** Glob patterns to exclude from analysis */\n exclude?: string[];\n /** Automatically activate generated MCP on sync */\n autoActivate?: boolean;\n /**\n * Strict screen filtering (§1).\n * When true, only files with registerScreen() calls or matching\n * screenPatterns are included as screens in the MCP document.\n * Default: true (exclude components/hooks/config files from the MCP screen map)\n */\n strictScreens?: boolean;\n /**\n * Glob patterns that identify screen files (used with strictScreens).\n * Default: ['**\\/*Screen.{ts,tsx}', '**\\/screens/**\\/*.{ts,tsx}']\n */\n screenPatterns?: string[];\n /**\n * Additional glob patterns for navigation file discovery (§5).\n * These are ADDED to the default patterns, not replacing them.\n */\n navigationInclude?: string[];\n /**\n * Glob patterns to exclude from navigation analysis (§5).\n */\n navigationExclude?: string[];\n /** `appilots eval` settings — see docs: Testing your agent between releases. */\n eval?: EvalConfig;\n}\n\nexport interface EvalConfig {\n /** Directory of `*.json` scenario files. Default: `<outputDir>/scenarios`. */\n scenariosDir?: string;\n /** Committed baseline file. Default: `<outputDir>/eval-baseline.json`. */\n baselinePath?: string;\n /** Minimum fraction of scenarios that must pass (0-1). Default: 0.95. */\n minPassRate?: number;\n /** Max fractional token increase vs baseline before it's flagged as a\n * regression on an otherwise-passing scenario. Default: 0.25 (+25%). */\n maxTokenRegression?: number;\n}\n\n/**\n * Validation result type\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Environment overrides recognized by the CLI. Precedence when loading:\n * command-line flags (applied by each command) > env vars > .appilotsrc.\n */\nexport interface EnvOverrides {\n apiKey?: string;\n projectId?: string;\n serverUrl?: string;\n}\n\n/**\n * Reads APPILOTS_* environment variables, treating blank values as unset.\n */\nexport function getEnvOverrides(env: NodeJS.ProcessEnv = process.env): EnvOverrides {\n const clean = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n };\n return {\n apiKey: clean(env.APPILOTS_API_KEY),\n projectId: clean(env.APPILOTS_PROJECT_ID),\n serverUrl: clean(env.APPILOTS_SERVER_URL),\n };\n}\n\n/**\n * Loads configuration from the nearest .appilotsrc merged with APPILOTS_*\n * environment variables (env wins). Works without a .appilotsrc when\n * APPILOTS_API_KEY is set, so CI can run `appilots sync` with env vars only.\n *\n * @returns AppilotsConfig if a file or APPILOTS_API_KEY exists, null otherwise\n * @throws when the file is unparseable or the merged config fails validation\n */\nexport function loadConfig(): AppilotsConfig | null {\n const configPath = getConfigPath();\n const env = getEnvOverrides();\n\n let fileConfig: Record<string, unknown> = {};\n if (configPath) {\n try {\n fileConfig = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch (error) {\n throw new Error(`Failed to parse .appilotsrc at ${configPath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n } else if (!env.apiKey) {\n return null;\n }\n\n const merged = {\n serverUrl: 'http://localhost:4000',\n outputDir: '.appilots',\n autoActivate: true,\n strictScreens: true,\n ...fileConfig,\n ...(env.apiKey ? { apiKey: env.apiKey } : {}),\n ...(env.projectId ? { projectId: env.projectId } : {}),\n ...(env.serverUrl ? { serverUrl: env.serverUrl } : {}),\n } as AppilotsConfig;\n\n const validation = validateConfig(merged);\n if (!validation.valid) {\n const source = configPath ?? 'environment variables';\n throw new Error(\n `Invalid Appilots configuration (${source}):\\n` +\n validation.errors.map((e) => ` - ${e}`).join('\\n') +\n '\\nFix .appilotsrc or set APPILOTS_API_KEY / APPILOTS_SERVER_URL.'\n );\n }\n\n return merged;\n}\n\n/**\n * Saves configuration to .appilotsrc in the given directory\n *\n * @param dir Directory to write .appilotsrc to\n * @param config Partial config to merge with defaults\n */\nexport function saveConfig(dir: string, config: Partial<AppilotsConfig>): void {\n const configPath = join(dir, '.appilotsrc');\n const existingConfig = getConfigPath() ? loadConfig() : null;\n\n const mergedConfig: AppilotsConfig = {\n apiKey: config.apiKey || existingConfig?.apiKey || '',\n projectId: config.projectId || existingConfig?.projectId || '',\n serverUrl: config.serverUrl || existingConfig?.serverUrl || 'http://localhost:4000',\n outputDir: config.outputDir || existingConfig?.outputDir || '.appilots',\n autoActivate: config.autoActivate !== undefined ? config.autoActivate : (existingConfig?.autoActivate ?? true),\n include: config.include || existingConfig?.include,\n exclude: config.exclude || existingConfig?.exclude,\n strictScreens: config.strictScreens ?? existingConfig?.strictScreens ?? true,\n screenPatterns: config.screenPatterns || existingConfig?.screenPatterns,\n navigationInclude: config.navigationInclude || existingConfig?.navigationInclude,\n navigationExclude: config.navigationExclude || existingConfig?.navigationExclude,\n eval: config.eval || existingConfig?.eval,\n };\n\n try {\n writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2), 'utf-8');\n } catch (error) {\n throw new Error(`Failed to write .appilotsrc to ${configPath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Finds and returns the path to the nearest .appilotsrc file by walking up\n * the directory tree from cwd. Follows the same logic as .npmrc lookup.\n *\n * @returns Path to .appilotsrc if found, null otherwise\n */\nexport function getConfigPath(): string | null {\n let currentDir = resolve(process.cwd());\n const root = resolve('/');\n\n while (currentDir !== root) {\n const configPath = join(currentDir, '.appilotsrc');\n try {\n if (existsSync(configPath) && statSync(configPath).isFile()) {\n return configPath;\n }\n } catch {\n // Continue searching if we can't access the file\n }\n currentDir = resolve(currentDir, '..');\n }\n\n // Check root level as last resort\n const rootConfigPath = join(root, '.appilotsrc');\n try {\n if (existsSync(rootConfigPath) && statSync(rootConfigPath).isFile()) {\n return rootConfigPath;\n }\n } catch {\n // Ignore\n }\n\n return null;\n}\n\n/**\n * Validates an Appilots configuration object for required fields and types\n *\n * @param config Configuration object to validate\n * @returns ValidationResult with valid flag and array of error messages\n */\nexport function validateConfig(config: any): ValidationResult {\n const errors: string[] = [];\n\n if (!config || typeof config !== 'object') {\n return {\n valid: false,\n errors: ['Configuration must be an object'],\n };\n }\n\n // Check required fields\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n errors.push('apiKey is required and must be a string (set it in .appilotsrc or via APPILOTS_API_KEY)');\n } else if (!config.apiKey.startsWith('ak_')) {\n errors.push('apiKey must start with \"ak_\"');\n }\n\n // projectId is optional (the API key identifies the project), but when\n // present it must be a non-empty string\n if (config.projectId !== undefined && config.projectId !== '' && typeof config.projectId !== 'string') {\n errors.push('projectId must be a string');\n }\n\n // Check optional fields types\n if (config.serverUrl !== undefined && typeof config.serverUrl !== 'string') {\n errors.push('serverUrl must be a string');\n }\n\n if (config.outputDir !== undefined && typeof config.outputDir !== 'string') {\n errors.push('outputDir must be a string');\n }\n\n if (config.include !== undefined && !Array.isArray(config.include)) {\n errors.push('include must be an array of strings');\n } else if (Array.isArray(config.include) && !config.include.every((item: unknown) => typeof item === 'string')) {\n errors.push('include must be an array of strings');\n }\n\n if (config.exclude !== undefined && !Array.isArray(config.exclude)) {\n errors.push('exclude must be an array of strings');\n } else if (Array.isArray(config.exclude) && !config.exclude.every((item: unknown) => typeof item === 'string')) {\n errors.push('exclude must be an array of strings');\n }\n\n if (config.autoActivate !== undefined && typeof config.autoActivate !== 'boolean') {\n errors.push('autoActivate must be a boolean');\n }\n\n if (config.strictScreens !== undefined && typeof config.strictScreens !== 'boolean') {\n errors.push('strictScreens must be a boolean');\n }\n\n for (const field of ['screenPatterns', 'navigationInclude', 'navigationExclude'] as const) {\n const value = config[field];\n if (value !== undefined && (!Array.isArray(value) || !value.every((item: unknown) => typeof item === 'string'))) {\n errors.push(`${field} must be an array of strings`);\n }\n }\n\n if (config.eval !== undefined) {\n if (typeof config.eval !== 'object' || config.eval === null || Array.isArray(config.eval)) {\n errors.push('eval must be an object');\n } else {\n const evalConfig = config.eval as Record<string, unknown>;\n if (evalConfig.scenariosDir !== undefined && typeof evalConfig.scenariosDir !== 'string') {\n errors.push('eval.scenariosDir must be a string');\n }\n if (evalConfig.baselinePath !== undefined && typeof evalConfig.baselinePath !== 'string') {\n errors.push('eval.baselinePath must be a string');\n }\n if (\n evalConfig.minPassRate !== undefined &&\n (typeof evalConfig.minPassRate !== 'number' ||\n evalConfig.minPassRate < 0 ||\n evalConfig.minPassRate > 1)\n ) {\n errors.push('eval.minPassRate must be a number between 0 and 1');\n }\n if (\n evalConfig.maxTokenRegression !== undefined &&\n (typeof evalConfig.maxTokenRegression !== 'number' || evalConfig.maxTokenRegression < 0)\n ) {\n errors.push('eval.maxTokenRegression must be a non-negative number');\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { MCPDocument } from '../generators/types';\nimport type { ActionDescriptor } from '../types/index';\n\n/**\n * Metadata lint (OKR-005 KR4) — every mutating action registered in the\n * MCP document should declare `effect` and `riskLevel` so the runtime can\n * enforce safety policy without parsing labels. The generator extracts\n * these fields when declared in registerScreen(); this lint surfaces the\n * ones that were not, instead of letting them pass silently.\n */\n\nexport interface MetadataLintWarning {\n screen: string;\n actionId: string;\n actionType: ActionDescriptor['type'];\n missing: ('effect' | 'riskLevel')[];\n reason: string;\n}\n\n/**\n * Verbs that indicate an action changes state even when its `type` alone\n * doesn't say so (custom handlers, api_call wrappers, etc.). Mirrors the\n * destructive-verb heuristic used by ScreenAnalyzer for the\n * `destructive` flag, plus non-destructive mutation verbs.\n */\nconst MUTATION_VERB_RE =\n /\\b(delete|destroy|remove|discard|wipe|revoke|cancel|reset|clear|create|add|register|save|submit|update|edit|change|toggle|pay|send|confirm|subscribe|unsubscribe|renew|downgrade|upgrade|transfer)\\w*/i;\n\nfunction isMutating(action: ActionDescriptor): { mutating: boolean; reason: string } {\n if (action.destructive || action.effect === 'destructive') {\n return { mutating: true, reason: 'flagged destructive' };\n }\n if (action.type === 'submit' || action.type === 'state_change') {\n return { mutating: true, reason: `type \"${action.type}\"` };\n }\n const haystack = `${action.id} ${action.label ?? ''} ${action.handler ?? ''}`;\n if ((action.type === 'api_call' || action.type === 'custom') && MUTATION_VERB_RE.test(haystack)) {\n return { mutating: true, reason: 'mutation verb in id/label/handler' };\n }\n return { mutating: false, reason: '' };\n}\n\n/**\n * Scans every screen action and returns one warning per mutating action\n * that is missing `effect` and/or `riskLevel`.\n */\nexport function lintActionMetadata(document: MCPDocument): MetadataLintWarning[] {\n const warnings: MetadataLintWarning[] = [];\n\n for (const screen of document.screens) {\n for (const action of screen.actions ?? []) {\n const { mutating, reason } = isMutating(action);\n if (!mutating) continue;\n\n const missing: MetadataLintWarning['missing'] = [];\n if (!action.effect) missing.push('effect');\n if (!action.riskLevel) missing.push('riskLevel');\n if (missing.length === 0) continue;\n\n warnings.push({\n screen: screen.name,\n actionId: action.id,\n actionType: action.type,\n missing,\n reason,\n });\n }\n }\n\n return warnings;\n}\n\n/**\n * Formats lint warnings for terminal output: one line per action plus an\n * aggregate line, e.g.\n * VehicleDetails.deleteVehicle (submit): missing effect, riskLevel\n */\nexport function formatMetadataWarnings(warnings: MetadataLintWarning[]): string[] {\n return warnings.map(\n (w) => `${w.screen}.${w.actionId} (${w.actionType}, ${w.reason}): missing ${w.missing.join(', ')}`\n );\n}\n","/**\n * HTTP client for communicating with the Appilots API backend\n */\n\n/**\n * Result from a sync operation\n */\nexport interface SyncResult {\n success: boolean;\n unchanged: boolean;\n id?: string;\n checksum?: string;\n screensCount?: number;\n formsCount?: number;\n actionsCount?: number;\n error?: string;\n}\n\n/**\n * One eval scenario as sent to `POST /cli/eval/run`. Shape mirrors the\n * server's `evalScenarioRequestSchema` — kept as a plain interface here\n * (no @appilots/shared import) since this package publishes standalone.\n */\nexport interface EvalScenarioRequest {\n id: string;\n screen?: string;\n observation?: unknown;\n prompt: string;\n modelOverride?: string;\n}\n\nexport interface EvalScenarioResult {\n id: string;\n content: string;\n actions: Array<{ id: string; type: string; payload: Record<string, unknown> }>;\n totalTokens: number;\n totalCostUsd: number;\n totalLatencyMs: number;\n modelUsed: string;\n}\n\n/**\n * Result from an eval run\n */\nexport interface EvalRunResult {\n results?: EvalScenarioResult[];\n error?: string;\n}\n\n/**\n * Result from a status query\n */\nexport interface StatusResult {\n project?: {\n id: string;\n name: string;\n };\n activeMcp?: {\n id: string;\n version: string;\n screensCount: number;\n formsCount: number;\n actionsCount: number;\n };\n error?: string;\n}\n\n/**\n * Appilots API client configuration\n */\ninterface APIClientConfig {\n serverUrl: string;\n apiKey: string;\n /** Per-request timeout in ms (default 30s) */\n timeoutMs?: number;\n /** Retries on network errors / 5xx (default 2) */\n maxRetries?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRY_BASE_DELAY_MS = 500;\n\n/**\n * HTTP client for communicating with Appilots API\n */\nexport class AppilotsAPIClient {\n private serverUrl: string;\n private apiKey: string;\n private timeoutMs: number;\n private maxRetries: number;\n\n constructor(config: APIClientConfig) {\n this.serverUrl = config.serverUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.apiKey = config.apiKey;\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n }\n\n /**\n * fetch with a hard timeout and exponential-backoff retries. Retries\n * only on network failures and 5xx responses — 4xx are the caller's\n * problem and retrying them would just spam the server.\n */\n private async request(url: string, init: RequestInit): Promise<Response> {\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, RETRY_BASE_DELAY_MS * 2 ** (attempt - 1)));\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n if (response.status >= 500 && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);\n continue;\n }\n return response;\n } catch (err) {\n lastError = controller.signal.aborted\n ? new Error(`Request timed out after ${this.timeoutMs}ms: ${url}`)\n : err;\n } finally {\n clearTimeout(timer);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n /**\n * Syncs content with the Appilots backend\n *\n * @param content The MCP content object to sync\n * @param version Version string for the content\n * @param appVersion Host app version (package.json) — sent as\n * X-App-Version so the backend can associate the MCP\n * document with the app build that produced it\n * @returns SyncResult with success status and metadata\n */\n async sync(content: object, version: string, appVersion?: string): Promise<SyncResult> {\n try {\n const response = await this.request(`${this.serverUrl}/api/v1/cli/sync`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...(appVersion ? { 'X-App-Version': appVersion } : {}),\n },\n body: JSON.stringify({ content, version }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n return {\n success: false,\n unchanged: false,\n error: (errorData?.error as string) || `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as Record<string, unknown>;\n return {\n success: true,\n ...inner,\n } as SyncResult;\n } catch (error) {\n return {\n success: false,\n unchanged: false,\n error: error instanceof Error ? error.message : 'Failed to sync with Appilots API',\n };\n }\n }\n\n /**\n * Gets the status of the Appilots project and active MCP\n *\n * @returns StatusResult with project and active MCP information\n */\n async status(): Promise<StatusResult> {\n try {\n const response = await this.request(`${this.serverUrl}/api/v1/cli/status`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n return {\n error: (errorData?.error as string) || `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as StatusResult;\n return inner;\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Failed to fetch status from Appilots API',\n };\n }\n }\n\n /**\n * Runs a batch of eval scenarios against the project's MCP document in\n * decision/dry-run mode — no side effects, same relay path as the\n * dashboard's sandbox, authenticated with this client's API key.\n *\n * @param scenarios Scenarios to run, capped server-side at\n * EVAL_MAX_SCENARIOS_PER_RUN (currently 20) as a cost guard.\n */\n async evalRun(scenarios: EvalScenarioRequest[]): Promise<EvalRunResult> {\n try {\n const response = await this.request(`${this.serverUrl}/api/v1/cli/eval/run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ scenarios }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n const errObj = errorData?.error as Record<string, unknown> | undefined;\n return {\n error:\n (errObj?.message as string | undefined) ||\n `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as { results?: EvalScenarioResult[] };\n return { results: inner.results ?? [] };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Failed to run eval against Appilots API',\n };\n }\n }\n\n /**\n * Checks if the Appilots API server is healthy\n *\n * @returns true if server is healthy, false otherwise\n */\n async health(): Promise<boolean> {\n try {\n const response = await this.request(`${this.serverUrl}/api/v1/health`, {\n method: 'GET',\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n"]}
|