@seoengine.ai/next-llm-ready 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/clipboard.ts","../src/utils/download.ts","../src/utils/html-to-markdown.ts","../src/hooks/use-llm-copy.ts","../src/components/CopyButton.tsx","../src/components/CopyDropdown.tsx","../src/hooks/use-toc.ts","../src/components/TOC.tsx","../src/components/LLMBadge.tsx","../src/hooks/use-analytics.ts","../src/server/generate-markdown.ts","../src/server/generate-llms-txt.ts","../src/api/llms-txt-handler.ts","../src/api/markdown-handler.ts","../src/api/analytics-handler.ts"],"names":["defaultOptions","error","useState","jsxs","jsx","useCallback","Fragment","useEffect","useRef","NextResponse"],"mappings":";;;;;;;AASA,eAAsB,gBAAgB,IAAA,EAAgC;AAEpE,EAAA,IAAI,UAAU,SAAA,IAAa,OAAO,SAAA,CAAU,SAAA,CAAU,cAAc,UAAA,EAAY;AAC9E,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,GAAG,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,OAAO,wBAAwB,IAAI,CAAA;AACrC;AAKA,SAAS,wBAAwB,IAAA,EAAuB;AACtD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,UAAU,CAAA;AAClD,EAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AAGjB,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,OAAA;AAC1B,EAAA,QAAA,CAAS,MAAM,GAAA,GAAM,SAAA;AACrB,EAAA,QAAA,CAAS,MAAM,IAAA,GAAO,SAAA;AACtB,EAAA,QAAA,CAAS,MAAM,OAAA,GAAU,GAAA;AACzB,EAAA,QAAA,CAAS,MAAM,aAAA,GAAgB,MAAA;AAG/B,EAAA,QAAA,CAAS,MAAM,QAAA,GAAW,MAAA;AAE1B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,EAAA,QAAA,CAAS,KAAA,EAAM;AACf,EAAA,QAAA,CAAS,MAAA,EAAO;AAEhB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,IAAA,OAAO,UAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAC1C,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AChDA,IAAM,cAAA,GAAkC;AAAA,EACtC,QAAA,EAAU,SAAA;AAAA,EACV,SAAA,EAAW,IAAA;AAAA,EACX,eAAA,EAAiB;AACnB,CAAA;AAKO,SAAS,cAAA,CACd,OAAA,EACA,OAAA,GAA2B,EAAC,EACtB;AACN,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,cAAA,EAAgB,GAAG,OAAA,EAAQ;AAC7C,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,QAAA,IAAY,SAAS,CAAA;AAC5D,EAAA,MAAM,YAAA,GAAe,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,SAAS,CAAA,CAAA;AAGlD,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,KAAc,IAAA,GAAO,eAAA,GAAkB,YAAA;AAG7D,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,cAAA,CAAA,EAAkB,CAAA;AACtE,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAEpC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,EAAA,IAAA,CAAK,QAAA,GAAW,YAAA;AAGhB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAC9B,EAAA,IAAA,CAAK,KAAA,EAAM;AACX,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAG9B,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACzB;AAKO,SAAS,iBAAiB,IAAA,EAAsB;AACrD,EAAA,OAAO,IAAA,CACJ,aAAY,CACZ,OAAA,CAAQ,iBAAiB,EAAE,CAAA,CAC3B,QAAQ,MAAA,EAAQ,GAAG,EACnB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,YAAY,EAAE,CAAA,CACtB,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA;AACrB;AAKO,SAAS,iBAAiB,KAAA,EAAuB;AACtD,EAAA,MAAM,IAAA,GAAO,iBAAiB,KAAK,CAAA;AACnC,EAAA,MAAM,IAAA,GAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAClD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACxB;;;ACzDA,IAAMA,eAAAA,GAAwC;AAAA,EAC5C,kBAAA,EAAoB,IAAA;AAAA,EACpB,aAAA,EAAe,IAAA;AAAA,EACf,YAAA,EAAc,IAAA;AAAA,EACd,YAAA,EAAc,IAAA;AAAA,EACd,gBAAgB;AAClB,CAAA;AAKO,SAAS,cAAA,CACd,IAAA,EACA,OAAA,GAAiC,EAAC,EAC1B;AACR,EAAA,MAAM,IAAA,GAAO,EAAE,GAAGA,eAAAA,EAAgB,GAAG,OAAA,EAAQ;AAG7C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEjC,IAAA,OAAO,iBAAA,CAAkB,MAAM,IAAI,CAAA;AAAA,EACrC;AAGA,EAAA,MAAM,MAAM,IAAI,SAAA,EAAU,CAAE,eAAA,CAAgB,MAAM,WAAW,CAAA;AAC7D,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACnC;AAKA,SAAS,iBAAA,CAAkB,MAAc,IAAA,EAAqC;AAC5E,EAAA,IAAI,QAAA,GAAW,IAAA;AAGf,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,qDAAA,EAAuD,EAAE,CAAA;AACrF,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,kDAAA,EAAoD,EAAE,CAAA;AAAA,EACpF;AAGA,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,UAAU,CAAA;AAChE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,WAAW,CAAA;AACjE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,YAAY,CAAA;AAClE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,aAAa,CAAA;AACnE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,cAAc,CAAA;AACpE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,eAAe,CAAA;AAGrE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,gCAAA,EAAkC,QAAQ,CAAA;AACtE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,4BAAA,EAA8B,MAAM,CAAA;AAGhE,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,gDAAA,EAAkD,UAAU,CAAA;AAAA,EAC1F;AAGA,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA;AAAA,MAClB,mEAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA;AAAA,MAClB,mEAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,0CAAA,EAA4C,SAAS,CAAA;AAAA,EACnF;AAGA,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,IAAI,CAAA;AAC/C,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,IAAI,CAAA;AAC5C,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,IAAI,CAAA;AAC/C,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,IAAI,CAAA;AAC5C,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,QAAQ,CAAA;AAG9D,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,yCAAA,EAA2C,CAAC,GAAG,OAAA,KAAY;AACrF,IAAA,OAAO,SAAS,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,GAAI,IAAA;AAAA,EAC1D,CAAC,CAAA;AAGD,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,8CAAA,EAAgD,kBAAkB,CAAA;AAC9F,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,4BAAA,EAA8B,MAAM,CAAA;AAGhE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,uBAAA,EAAyB,QAAQ,CAAA;AAC7D,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,cAAA,EAAgB,IAAI,CAAA;AAGhD,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,gBAAA,EAAkB,SAAS,CAAA;AAGvD,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAG1C,EAAA,QAAA,GAAW,mBAAmB,QAAQ,CAAA;AAGtC,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA;AAC7C,EAAA,QAAA,GAAW,SAAS,IAAA,EAAK;AAEzB,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,WAAA,CAAY,MAAY,IAAA,EAAqC;AACpE,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,SAAA,EAAW;AACpC,IAAA,OAAO,KAAK,WAAA,IAAe,EAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,YAAA,EAAc;AACvC,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA;AAChB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAG5C,EAAA,IAAI,IAAA,CAAK,cAAA,GAAiB,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA,CAAE,OAAO,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,OAAA,KAAY,QAAA,IAAY,YAAY,OAAA,CAAA,EAAU;AACtE,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,CAC/C,GAAA,CAAI,CAAC,KAAA,KAAU,YAAY,KAAA,EAAO,IAAI,CAAC,CAAA,CACvC,KAAK,EAAE,CAAA;AAEV,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,EAAA,EAAO,YAAA,CAAa,MAAM;AAAA,CAAA;AAAA,IACnC,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,GAAA,EAAQ,YAAA,CAAa,MAAM;AAAA,CAAA;AAAA,IACpC,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,IAAA,EAAS,YAAA,CAAa,MAAM;AAAA,CAAA;AAAA,IACrC,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,KAAA,EAAU,YAAA,CAAa,MAAM;AAAA,CAAA;AAAA,IACtC,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,MAAA,EAAW,YAAA,CAAa,MAAM;AAAA,CAAA;AAAA,IACvC,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,OAAA,EAAY,YAAA,CAAa,MAAM;AAAA,CAAA;AAAA,IACxC,KAAK,GAAA;AACH,MAAA,OAAO;AAAA,EAAK,YAAA,CAAa,MAAM;AAAA,CAAA;AAAA,IACjC,KAAK,IAAA;AACH,MAAA,OAAO,IAAA,CAAK,qBAAqB,IAAA,GAAO,GAAA;AAAA,IAC1C,KAAK,QAAA;AAAA,IACL,KAAK,GAAA;AACH,MAAA,OAAO,KAAK,YAAY,CAAA,EAAA,CAAA;AAAA,IAC1B,KAAK,IAAA;AAAA,IACL,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,YAAY,CAAA,CAAA,CAAA;AAAA,IACzB,KAAK,GAAA;AACH,MAAA,OAAO,IAAI,YAAY,CAAA,CAAA,CAAA;AAAA,IACzB,KAAK,GAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,KAAK,YAAY,CAAA,EAAA,CAAA;AAAA,IAC1B,KAAK,GAAA;AACH,MAAA,IAAI,KAAK,YAAA,EAAc;AACrB,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IAAK,EAAA;AAC7C,QAAA,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA;AAC3C,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA,IAAK,EAAA;AAC3C,QAAA,OAAO,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAA;AAAA,MACzB;AACA,MAAA,OAAO,EAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,EAAK,YAAY;AAAA,CAAA;AAAA,IAC1B,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,EAAK,YAAY;AAAA,CAAA;AAAA,IAC1B,KAAK,IAAA;AACH,MAAA,OAAO,CAAA,EAAA,EAAK,YAAA,CAAa,IAAA,EAAM;AAAA,CAAA;AAAA,IACjC,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,EAAA,EAAO,aAAa,IAAA,EAAK,CAAE,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAC;AAAA,CAAA;AAAA,IAC1D,KAAK,KAAA;AACH,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,aAAA,CAAc,MAAM,CAAA;AAChD,MAAA,MAAM,OAAO,WAAA,EAAa,SAAA,CAAU,MAAM,gBAAgB,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AACpE,MAAA,MAAM,IAAA,GAAO,aAAa,WAAA,IAAe,YAAA;AACzC,MAAA,OAAO;AAAA,MAAA,EAAW,IAAI;AAAA,EAAK,IAAA,CAAK,MAAM;AAAA;AAAA,CAAA;AAAA,IACxC,KAAK,MAAA;AAEH,MAAA,IAAI,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,WAAA,OAAkB,KAAA,EAAO;AAC1D,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAK,YAAY,CAAA,EAAA,CAAA;AAAA,IAC1B,KAAK,IAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,aAAa,OAAO,CAAA;AAAA,IAC7B,KAAK,KAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,QAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AACE,MAAA,OAAO,YAAA;AAAA;AAEb;AAKA,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,gBAAA,CAAiB,IAAI,CAAA;AACxC,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAE9B,EAAA,IAAI,QAAA,GAAW,IAAA;AACf,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,gBAAA,CAAiB,QAAQ,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,KAAK,EAChC,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,aAAa,IAAA,EAAK,IAAK,EAAE,CAAA,CAC5C,KAAK,KAAK,CAAA;AAEb,IAAA,QAAA,IAAY,KAAK,UAAU,CAAA;AAAA,CAAA;AAG3B,IAAA,IAAI,CAAC,eAAA,KAAoB,GAAA,CAAI,cAAc,IAAI,CAAA,IAAK,UAAU,CAAA,CAAA,EAAI;AAChE,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAC/B,IAAI,MAAM,KAAK,CAAA,CACf,IAAA,CAAK,KAAK,CAAA;AACb,MAAA,QAAA,IAAY,KAAK,SAAS,CAAA;AAAA,CAAA;AAC1B,MAAA,eAAA,GAAkB,IAAA;AAAA,IACpB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,QAAA,GAAW,IAAA;AACpB;AAKA,SAAS,mBAAmB,IAAA,EAAsB;AAChD,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,OAAA,EAAS,GAAA;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,MAAA,EAAQ,GAAA;AAAA,IACR,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS,GAAA;AAAA,IACT,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,SAAA,EAAW,QAAA;AAAA,IACX,SAAA,EAAW,QAAA;AAAA,IACX,UAAA,EAAY,QAAA;AAAA,IACZ,QAAA,EAAU,MAAA;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACb;AAEA,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,IAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,IAAI,OAAO,MAAA,EAAQ,GAAG,GAAG,IAAI,CAAA;AAAA,EACvD;AAGA,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,GAAA,KAAQ,MAAA,CAAO,YAAA,CAAa,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC,CAAC,CAAA;AACvF,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA;AAAA,IAAQ,mBAAA;AAAA,IAAqB,CAAC,GAAG,GAAA,KAC/C,MAAA,CAAO,aAAa,QAAA,CAAS,GAAA,EAAK,EAAE,CAAC;AAAA,GACvC;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,WAAW,IAAA,EAAsB;AAC/C,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,UAAA,EAAY,EAAE,EACtB,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AACvC;AAKO,SAAS,oBAAA,CAAqB,IAAA,EAAc,cAAA,GAAiB,GAAA,EAAa;AAC/E,EAAA,MAAM,KAAA,GAAQ,WAAW,IAAI,CAAA;AAC7B,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,cAAc,CAAA;AACzC;;;AC9RA,SAAS,4BAA4B,OAAA,EAAsC;AACzE,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,OAAA,CAAQ,YAAA,EAAc,IAAA,EAAK,EAAG;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,EAAM,CAAA;AACtC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AAEzC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAQ;AAC9B,IAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,OAAA,CAAQ,WAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAM,MAAA,EAAQ;AACxB,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,eAAA,GACJ,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GACzD,cAAA,CAAe,OAAA,CAAQ,OAAO,IAC9B,OAAA,CAAQ,OAAA;AACd,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,EAAK;AAC/B;AA6BO,SAAS,WAAW,OAAA,EAA8C;AACvE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AAGrD,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM;AAC7B,IAAA,OAAO,2BAAA,CAA4B,QAAQ,OAAO,CAAA;AAAA,EACpD,CAAA,EAAG,CAAC,OAAA,CAAQ,OAAO,CAAC,CAAA;AAGpB,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACjB,CAAC,MAAA,KAAuB;AACtB,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,MAAM,YACJ,OAAO,OAAA,CAAQ,YAAY,QAAA,GAAW,MAAA,GAAY,QAAQ,OAAA,CAAQ,GAAA;AAEpE,QAAA,OAAA,CAAQ,WAAA,CAAY;AAAA,UAClB,MAAA;AAAA,UACA,SAAA;AAAA,UACA,KAAK,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,MAAA;AAAA,UAC5D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACnC,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAGA,EAAA,MAAM,IAAA,GAAO,YAAY,YAA8B;AACrD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAE9C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,UAAA,CAAW,MAAM,CAAA;AACjB,QAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAG1B,QAAA,UAAA,CAAW,MAAM,YAAA,CAAa,KAAK,CAAA,EAAG,GAAI,CAAA;AAC1C,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,MAC/C;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAMC,SAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,aAAa,CAAA;AAClE,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAA,OAAA,CAAQ,UAAUA,MAAK,CAAA;AACvB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,UAAU,CAAC,CAAA;AAGlC,EAAA,MAAM,IAAA,GAAO,YAAY,MAAc;AACrC,IAAA,UAAA,CAAW,MAAM,CAAA;AACjB,IAAA,OAAA,CAAQ,YAAY,MAAM,CAAA;AAC1B,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,UAAU,CAAC,CAAA;AAGlC,EAAA,MAAM,QAAA,GAAW,WAAA;AAAA,IACf,CAAC,QAAA,KAA4B;AAC3B,MAAA,MAAM,QACJ,OAAO,OAAA,CAAQ,YAAY,QAAA,GAAW,SAAA,GAAY,QAAQ,OAAA,CAAQ,KAAA;AAEpE,MAAA,cAAA,CAAe,QAAA,EAAU;AAAA,QACvB,QAAA,EAAU,QAAA,IAAY,gBAAA,CAAiB,KAAK,CAAA;AAAA,QAC5C,SAAA,EAAW;AAAA,OACZ,CAAA;AAED,MAAA,UAAA,CAAW,UAAU,CAAA;AACrB,MAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,IAChC,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,OAAA,EAAS,UAAU;AAAA,GAChC;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;ACrKO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,QAAA,GAAW,QAAA;AAAA,EACX,gBAAA,GAAmB,IAAA;AAAA,EACnB,SAAA,GAAY,EAAA;AAAA,EACZ,YAAA,GAAe,SAAA;AAAA,EACf,aAAA,GAAgB,GAAA;AAAA,EAChB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAoB;AAClB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,KAAA,KAAU,UAAA,CAAW;AAAA,IACvD,OAAA;AAAA,IACA,SAAA,EAAW,CAAC,MAAA,KAAuB;AACjC,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,UAAA,CAAW,MAAM,YAAA,CAAa,KAAK,CAAA,EAAG,aAAa,CAAA;AACnD,MAAA,MAAA,GAAS,MAAM,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,gBAAA,EAAkB;AAEvB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,MAAM,QAAQ,SAAA,CAAU,QAAA,CAAS,aAAY,CAAE,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AACjE,MAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA;AAErC,MAAA,IAAI,UAAU,CAAA,CAAE,QAAA,IAAY,EAAE,GAAA,CAAI,WAAA,OAAkB,GAAA,EAAK;AACvD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,gBAAA,EAAkB,IAAI,CAAC,CAAA;AAE3B,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,oBAAA;AAAA,IACA,sBAAsB,QAAQ,CAAA,CAAA;AAAA,IAC9B,SAAA,IAAa,mBAAA;AAAA,IACb,SAAA,IAAa,mBAAA;AAAA,IACb,KAAA,IAAS,iBAAA;AAAA,IACT;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAsB,KAAA,EACnC,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,aAAA;AAAA,QACX,OAAA,EAAS,IAAA;AAAA,QACT,UAAU,QAAA,IAAY,SAAA;AAAA,QACtB,YAAA,EAAY,IAAA;AAAA,QACZ,KAAA,EAAO,gBAAA,GAAmB,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,QAAA,CAAS,QAAA,CAAS,KAAK,CAAA,GAAI,QAAA,GAAM,MAAM,CAAA,SAAA,CAAA,GAAc,IAAA;AAAA,QAGrG,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,IAAA;AAAA,cACN,MAAA,EAAO,IAAA;AAAA,cACP,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,GAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cACf,SAAA,EAAU,gBAAA;AAAA,cAET,sCACC,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,oBAElC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,gCACvD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D;AAAA,eAAA,EACpE;AAAA;AAAA,WAEJ;AAAA,8BACC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA,SAAA,GAAY,eAAe,IAAA,EAAK;AAAA;AAAA;AAAA,KACxE;AAAA,IAGC,SAAA,wBACE,KAAA,EAAA,EAAI,SAAA,EAAU,4CAA2C,IAAA,EAAK,QAAA,EAAS,WAAA,EAAU,QAAA,EAC/E,QAAA,EAAA,YAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;ACjHA,IAAM,gBAAA,GAAuC;AAAA,EAC3C;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,mBAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,kBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA;AAAA,sBACvDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D;AAAA,KAAA,EACpE,CAAA;AAAA,IAEF,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8CAAA,EAA+C,CAAA;AAAA,sBACvDA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI;AAAA,KAAA,EAChC;AAAA,GAEJ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,KAAA,EAAO,mBAAA;AAAA,IACP,MAAA,EAAQ,UAAA;AAAA,IACR,IAAA,kBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2CAAA,EAA4C,CAAA;AAAA,sBACpDA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB,CAAA;AAAA,sBACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI;AAAA,KAAA,EACvC;AAAA;AAGN,CAAA;AAiBO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,SAAA,GAAY,gBAAA;AAAA,EACZ,QAAA,GAAW,QAAA;AAAA,EACX,gBAAA,GAAmB,IAAA;AAAA,EACnB,SAAA,GAAY,EAAA;AAAA,EACZ,YAAA,GAAe,SAAA;AAAA,EACf,aAAA,GAAgB,GAAA;AAAA,EAChB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,EAAsB;AACpB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,WAAA,GAAc,OAAuB,IAAI,CAAA;AAE/C,EAAA,MAAM,EAAE,MAAM,IAAA,EAAM,QAAA,EAAU,UAAU,SAAA,EAAW,SAAA,KAAc,UAAA,CAAW;AAAA,IAC1E,OAAA;AAAA,IACA,SAAA,EAAW,CAAC,MAAA,KAAuB;AACjC,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,UAAA,CAAW,MAAM,YAAA,CAAa,KAAK,CAAA,EAAG,aAAa,CAAA;AAAA,MACrD;AACA,MAAA,MAAA,GAAS,MAAM,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAAkB;AAC5C,MAAA,IAAI,YAAA,CAAa,WAAW,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAC5E,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,kBAAkB,CAAA;AACrD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,kBAAkB,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,EAAkB;AAEvB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAE1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,MAAA,EAAQ;AAChC,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,QAAQ,SAAA,CAAU,QAAA,CAAS,aAAY,CAAE,OAAA,CAAQ,KAAK,CAAA,IAAK,CAAA;AACjE,MAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA;AAErC,MAAA,IAAI,UAAU,CAAA,CAAE,QAAA,IAAY,EAAE,GAAA,CAAI,WAAA,OAAkB,GAAA,EAAK;AACvD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,gBAAA,EAAkB,IAAA,EAAM,MAAM,CAAC,CAAA;AAGnC,EAAA,MAAM,eAAA,GAAkBG,WAAAA;AAAA,IACtB,CAAC,IAAA,KAA2B;AAC1B,MAAA,SAAA,CAAU,KAAK,CAAA;AAEf,MAAA,IAAI,OAAO,IAAA,CAAK,MAAA,KAAW,UAAA,EAAY;AACrC,QAAA,IAAA,CAAK,MAAA,EAAO;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,QAAQ,KAAK,MAAA;AAAQ,QACnB,KAAK,MAAA;AACH,UAAA,IAAA,EAAK;AACL,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAA,IAAA,EAAK;AACL,UAAA,YAAA,CAAa,IAAI,CAAA;AACjB,UAAA;AAAA,QACF,KAAK,UAAA;AACH,UAAA,QAAA,EAAS;AACT,UAAA;AAAA;AACJ,IACF,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,IAAA,EAAM,QAAQ;AAAA,GACvB;AAGA,EAAA,MAAM,qBAAA,GAAwBA,WAAAA;AAAA,IAC5B,CAAC,CAAA,KAA2B;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,EAAS,gBAAA,CAAiB,QAAQ,CAAA;AAC5D,MAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,MAAA,MAAM,eAAe,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,CAAE,OAAA,CAAQ,SAAS,aAAkC,CAAA;AAE1F,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,YAAY,YAAA,GAAe,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,eAAe,CAAA,GAAI,CAAA;AACvE,UAAA,KAAA,CAAM,SAAS,GAAG,KAAA,EAAM;AACxB,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,YAAY,YAAA,GAAe,CAAA,GAAI,YAAA,GAAe,CAAA,GAAI,MAAM,MAAA,GAAS,CAAA;AACvE,UAAA,KAAA,CAAM,SAAS,GAAG,KAAA,EAAM;AACxB,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA;AAAA;AACJ,IACF,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,qBAAA;AAAA,IACA,sBAAsB,QAAQ,CAAA,CAAA;AAAA,IAC9B;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACEF,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,SAAA,EAAW,kBAAkB,KAAA,EACnD,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAEb,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,sBAAsB,SAAA,GAAY,mBAAA,GAAsB,EAAE,CAAA,CAAA,EAAI,SAAA,GAAY,sBAAsB,EAAE,CAAA,CAAA;AAAA,YAC7G,OAAA,EAAS,IAAA;AAAA,YACT,UAAU,QAAA,IAAY,SAAA;AAAA,YACtB,YAAA,EAAY,IAAA;AAAA,YAEZ,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,IAAA;AAAA,kBACN,MAAA,EAAO,IAAA;AAAA,kBACP,OAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAK,MAAA;AAAA,kBACL,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAY,GAAA;AAAA,kBACZ,SAAA,EAAU,gBAAA;AAAA,kBAET,QAAA,EAAA,SAAA,mBACCA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAiB,CAAA,mBAElCD,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oCAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA;AAAA,oCACvDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D;AAAA,mBAAA,EACpE;AAAA;AAAA,eAEJ;AAAA,8BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oBAAA,EAAsB,QAAA,EAAA,SAAA,GAAY,eAAe,IAAA,EAAK;AAAA;AAAA;AAAA,SACxE;AAAA,wBAGAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,wBAAA;AAAA,YACV,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,YAChC,eAAA,EAAe,MAAA;AAAA,YACf,eAAA,EAAc,MAAA;AAAA,YACd,YAAA,EAAW,cAAA;AAAA,YACX,QAAA;AAAA,YAEA,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,IAAA;AAAA,gBACN,MAAA,EAAO,IAAA;AAAA,gBACP,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBACL,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,GAAA;AAAA,gBAEZ,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB;AAAA;AAAA;AACpC;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBAGAA,GAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,WAAA;AAAA,UACL,SAAA,EAAW,CAAA,mBAAA,EAAsB,MAAA,GAAS,0BAAA,GAA6B,EAAE,CAAA,CAAA;AAAA,UACzE,IAAA,EAAK,MAAA;AAAA,UACL,eAAa,CAAC,MAAA;AAAA,UACd,SAAA,EAAW,qBAAA;AAAA,UAEV,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,qBACdD,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,yBAAA;AAAA,cACV,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,cACnC,QAAA,EAAU,SAAS,CAAA,GAAI,EAAA;AAAA,cAEtB,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,wBAAQC,GAAAA,CAAC,UAAK,SAAA,EAAU,yBAAA,EAA2B,eAAK,IAAA,EAAK,CAAA;AAAA,gCACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,eAAK,KAAA,EAAM,CAAA;AAAA,gBACtD,IAAA,CAAK,4BACJA,GAAAA,CAAC,UAAK,SAAA,EAAU,6BAAA,EAA+B,eAAK,QAAA,EAAS;AAAA;AAAA,aAAA;AAAA,YAV1D,IAAA,CAAK;AAAA,WAab;AAAA;AAAA,OACH;AAAA,MAGC,SAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0CAAA,EAA2C,IAAA,EAAK,UAC5D,QAAA,EAAA,YAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IAGC,6BACCA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACjC,MAAA,EAAQ,IAAA;AAAA,QACR,UAAA,EAAY;AAAA;AAAA;AACd,GAAA,EAEJ,CAAA;AAEJ;AAKA,SAAS,aAAA,CAAc;AAAA,EACrB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,QAAA,GAAW,OAAuB,IAAI,CAAA;AAG5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,EAAQ;AAAA,IAClC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,YAAY,KAAA,CAAM,gBAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAE3C,IAAA,KAAA,EAAO,KAAA,EAAM;AAEb,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,QAAQ,KAAA,EAAO;AAErB,MAAA,IAAI,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,aAAA,KAAkB,KAAA,EAAO;AAClD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,EAAM,KAAA,EAAM;AAAA,MACd,WAAW,CAAC,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,kBAAkB,IAAA,EAAM;AACzD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,KAAA,EAAO,KAAA,EAAM;AAAA,MACf;AAAA,IACF,CAAA;AAEA,IAAA,KAAA,CAAM,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC3C,IAAA,OAAO,MAAM,KAAA,CAAM,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,MAAK,QAAA,EAAS,YAAA,EAAW,MAAA,EAAO,YAAA,EAAW,kBAAA,EAC1E,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EAA2B,SAAS,OAAA,EAAS,CAAA;AAAA,oBAC5DD,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,WAAU,yBAAA,EAC5B,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACtDA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,uBAAA;AAAA,YACV,OAAA,EAAS,OAAA;AAAA,YACT,YAAA,EAAW,aAAA;AAAA,YAEX,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,8BACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,aAAA,EACtC;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,OAAA,EAAQ,CAAA,EACvD,CAAA;AAAA,sBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,yBAAA,EAA0B,OAAA,EAAS,SAAS,QAAA,EAAA,OAAA,EAE5E,CAAA;AAAA,wBACAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,yBAAA,EAA0B,OAAA,EAAS,UAAA,EAAY,QAAA,EAAA,UAAA,EAE/E,CAAA;AAAA,wBACAA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,uBAAA,EAAwB,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAA,MAAA,EAEzE;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACzVO,SAAS,OAAO,OAAA,EAAsC;AAC3D,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,MAAA,GAAS,CAAC,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAC1B,UAAA,GAAa,qBAAA;AAAA,IACb,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,QAAAA,CAAuB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAG5D,EAAAK,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAE1B,IAAA,MAAM,YAAY,UAAA,CAAW,OAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,gBAAA,CAAiB,QAAQ,CAAA;AAEpD,IAAA,MAAM,YAA0B,EAAC;AACjC,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,KAAO;AACvB,MAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACvC,MAAA,MAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,EAAE,CAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,EAAA,CAAG,WAAA,EAAa,IAAA,EAAK,IAAK,EAAA;AAGvC,MAAA,IAAI,KAAK,EAAA,CAAG,EAAA;AACZ,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,EAAA,GAAK,iBAAA,CAAkB,MAAM,KAAK,CAAA;AAClC,QAAA,EAAA,CAAG,EAAA,GAAK,EAAA;AAAA,MACV;AAEA,MAAA,SAAA,CAAU,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAClC,MAAA,KAAA,EAAA;AAAA,IACF,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,SAAS,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,UAAA,EAAY,MAAM,CAAC,CAAA;AAGvB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY,OAAA,IAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AAEnD,IAAA,MAAM,YAAY,UAAA,CAAW,OAAA;AAC7B,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,IAAA,EAAM,IAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAqB,CAAC,OAAA,KAAY;AACrD,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AACzB,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,WAAA,CAAY,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,QAC7B;AAAA,MACF,CAAC,CAAA;AAAA,IACH,GAAG,eAAe,CAAA;AAGlB,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,MAAA,MAAM,OAAA,GAAU,UAAU,aAAA,CAAc,CAAA,CAAA,EAAI,IAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA,CAAE,CAAA;AACpE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,GAAG,CAAC,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,SAAS,CAAC,CAAA;AAGhD,EAAA,MAAM,QAAA,GAAWF,WAAAA,CAAY,CAAC,EAAA,KAAe;AAC3C,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA;AAC1C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,eAAe,EAAE,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,SAAS,CAAA;AAC7D,MAAA,WAAA,CAAY,EAAE,CAAA;AAGd,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,QAAQ,SAAA,CAAU,IAAA,EAAM,EAAA,EAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,QAAA,EAAS;AACxC;AAKA,SAAS,iBAAA,CAAkB,MAAc,KAAA,EAAuB;AAC9D,EAAA,MAAM,IAAA,GAAO,KACV,WAAA,EAAY,CACZ,QAAQ,eAAA,EAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,YAAY,EAAE,CAAA,CACtB,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AAElB,EAAA,OAAO,IAAA,IAAQ,WAAW,KAAK,CAAA,CAAA;AACjC;AAKO,SAAS,eAAe,QAAA,EAAsC;AACnE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEnC,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,MAAM,QAAkD,EAAC;AAEzD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,OAAmB,EAAE,GAAG,OAAA,EAAS,QAAA,EAAU,EAAC,EAAE;AAGpD,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAE,KAAA,IAAS,OAAA,CAAQ,KAAA,EAAO;AACzE,MAAA,KAAA,CAAM,GAAA,EAAI;AAAA,IACZ;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,OAAA;AACvC,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,WAAW,EAAC;AACzC,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC3B;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,OAAA,EAAS,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAA,CACd,QAAA,EACA,QAAA,EACA,QAAA,EACA;AACA,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAE3B,MAAA,MAAM,eAAe,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,QAAQ,CAAA;AAEhE,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,IAAe,CAAA,CAAE,MAAA,EAAQ;AACrC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,EAAG,QAAA,CAAS,SAAS,CAAC,CAAA;AAChE,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,CAAE,EAAE,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,SAAA,IAAa,EAAE,MAAA,EAAQ;AAC1C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,GAAG,CAAC,CAAA;AAC9C,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,CAAE,EAAE,CAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAClD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAa,CAAA;AAAA,EACpE,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AACnC;AC3KO,SAAS,GAAA,CAAI;AAAA,EAClB,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,EAAU,gBAAA;AAAA,EACV,QAAA,GAAW,OAAA;AAAA,EACX,MAAA,GAAS,CAAC,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAAA,EAC1B,KAAA,GAAQ,cAAA;AAAA,EACR,MAAA,GAAS,IAAA;AAAA,EACT,YAAA,GAAe,EAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,YAAA,GAAe,IAAA;AAAA,EACf,eAAA,GAAkB,IAAA;AAAA,EAClB,WAAA,GAAc,IAAA;AAAA,EACd,gBAAA,GAAmB,KAAA;AAAA,EACnB;AACF,CAAA,EAAa;AACX,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIL,SAAS,gBAAgB,CAAA;AAG/D,EAAA,MAAM,EAAE,QAAA,EAAU,eAAA,EAAiB,QAAA,EAAU,QAAA,KAAa,MAAA,CAAO;AAAA,IAC/D,UAAA,EAAY,UAAA,IAAc,EAAE,OAAA,EAAS,IAAA,EAAK;AAAA,IAC1C;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,WAAW,gBAAA,IAAoB,eAAA;AAGrC,EAAA,cAAA,CAAe,QAAA,EAAU,UAAU,QAAQ,CAAA;AAG3C,EAAA,MAAM,WAAA,GAAcG,WAAAA;AAAA,IAClB,CAAC,GAAwC,EAAA,KAAe;AACtD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS,EAAE,CAAA;AAAA,MACb,CAAA,MAAO;AACL,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,cAAA,CAAe,EAAE,CAAA;AAC1C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,cAAA,EAAe;AACvB,UAAA,MAAA,CAAO,QAAQ,SAAA,CAAU,IAAA,EAAM,EAAA,EAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAA;AAAA,QAC7C;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,UAAU,YAAY;AAAA,GACzB;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,eAAA;AAAA,IACA,iBAAiB,QAAQ,CAAA,CAAA;AAAA,IACzB,MAAA,IAAU,sBAAA;AAAA,IACV,WAAA,IAAe,yBAAA;AAAA,IACf;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,MAAM,QAAA,GAAgC;AAAA,IACpC,GAAG,KAAA;AAAA,IACH,GAAI,MAAA,IAAU,EAAE,GAAA,EAAK,YAAA;AAAa,GACpC;AAEA,EAAA,uBACEF,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,YAAY,KAAA,EAAO,QAAA,EAAU,cAAW,mBAAA,EACtD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC1C,+BACCA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,sBAAA;AAAA,UACV,OAAA,EAAS,MAAM,cAAA,CAAe,CAAC,WAAW,CAAA;AAAA,UAC1C,iBAAe,CAAC,WAAA;AAAA,UAChB,YAAA,EAAY,cAAc,0BAAA,GAA6B,4BAAA;AAAA,UAEvD,QAAA,kBAAAA,GAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,IAAA;AAAA,cACN,MAAA,EAAO,IAAA;AAAA,cACP,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,GAAA;AAAA,cACZ,KAAA,EAAO,EAAE,SAAA,EAAW,WAAA,GAAc,mBAAmB,MAAA,EAAO;AAAA,cAE5D,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB;AAAA;AAAA;AACpC;AAAA;AACF,KAAA,EAEJ,CAAA;AAAA,IAEC,CAAC,WAAA,oBACAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oBAAA,EACX,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACbA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,OAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,OAAA,EAAS;AAAA,OAAA;AAAA,MAJJ,OAAA,CAAQ;AAAA,KAMhB,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAKA,SAAS,OAAA,CAAQ;AAAA,EACf,OAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,QAAA,GAAW,eAAA,IAAmB,OAAA,CAAQ,EAAA,KAAO,QAAA;AAEnD,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,oBAAA;AAAA,IACA,CAAA,oBAAA,EAAuB,QAAQ,KAAK,CAAA,CAAA;AAAA,IACpC,QAAA,IAAY;AAAA,GACd,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACED,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,QACpB,SAAA,EAAU,oBAAA;AAAA,QACV,SAAS,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,QAAQ,EAAE,CAAA;AAAA,QACrC,cAAA,EAAc,WAAW,UAAA,GAAa,MAAA;AAAA,QAErC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,KACX;AAAA,IACC,QAAQ,QAAA,IAAY,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,qBAC7CA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBACX,QAAA,EAAA,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,0BACrBA,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QAEC,OAAA,EAAS,KAAA;AAAA,QACT,QAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAJK,KAAA,CAAM;AAAA,KAMd,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAKO,SAAS,UAAU,KAAA,EAAiB;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,SAAS,KAAK,CAAA;AAE1C,EAAA,uBACEC,IAAAA,CAAAG,QAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,oBAAAH,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,6BAAA;AAAA,QACV,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,QAC7B,YAAA,EAAW,wBAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,4BACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,4BACnCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,WAAA,EACvC,CAAA;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA,KAChB;AAAA,IAGC,MAAA,oBACCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,+BAAA,EAAgC,SAAS,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,CAAA;AAAA,sBAChFD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,QAAG,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,0BACZA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,4BAAA;AAAA,cACV,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,cAC9B,YAAA,EAAW,OAAA;AAAA,cAEX,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,gCACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,eAAA,EACtC;AAAA;AAAA;AACF,SAAA,EACF,CAAA;AAAA,wBACAA,IAAC,GAAA,EAAA,EAAK,GAAG,OAAO,MAAA,EAAQ,KAAA,EAAO,aAAa,KAAA,EAAO;AAAA,OAAA,EACrD;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC/NO,SAAS,QAAA,CAAS;AAAA,EACvB,IAAA,GAAO,UAAA;AAAA,EACP,WAAA,GAAc,IAAA;AAAA,EACd,cAAA,GAAiB,qEAAA;AAAA,EACjB,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY;AACd,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIF,SAAS,KAAK,CAAA;AAE9D,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,iBAAA;AAAA,IACA,mBAAmB,IAAI,CAAA,CAAA;AAAA,IACvB;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,YAAA;AAAA,MACX,YAAA,EAAc,MAAM,WAAA,IAAe,mBAAA,CAAoB,IAAI,CAAA;AAAA,MAC3D,YAAA,EAAc,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,MAC7C,OAAA,EAAS,MAAM,WAAA,IAAe,mBAAA,CAAoB,IAAI,CAAA;AAAA,MACtD,MAAA,EAAQ,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,MACvC,QAAA,EAAU,cAAc,CAAA,GAAI,EAAA;AAAA,MAC5B,IAAA,EAAM,cAAc,SAAA,GAAY,MAAA;AAAA,MAChC,kBAAA,EAAkB,cAAc,mBAAA,GAAsB,MAAA;AAAA,MAGtD,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,OAAO,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,IAAA,KAAS,OAAO,EAAA,GAAK,EAAA;AAAA,YACjD,QAAQ,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,IAAA,KAAS,OAAO,EAAA,GAAK,EAAA;AAAA,YAClD,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YACZ,SAAA,EAAU,sBAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAC,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,8BAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8BAAA,EAA+B,CAAA;AAAA,8BACvCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,iFAAA,EAAkF;AAAA;AAAA;AAAA,SAC5F;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAwB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,QAG5C,WAAA,IAAe,gBAAA,oBACdA,GAAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAG,mBAAA,EAAoB,SAAA,EAAU,yBAAA,EAA0B,IAAA,EAAK,SAAA,EAClE,QAAA,EAAA,cAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;AC/CO,SAAS,YAAA,CAAa,OAAA,GAA+B,EAAC,EAAuB;AAClF,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,oBAAA;AAAA,IACX,UAAA,GAAa,IAAA;AAAA,IACb,gBAAA,GAAmB,IAAA;AAAA,IACnB,WAAW;AAAC,GACd,GAAI,OAAA;AAGJ,EAAA,MAAM,UAAA,GAAaI,MAAAA,iBAAoB,IAAI,GAAA,EAAK,CAAA;AAGhD,EAAA,MAAM,KAAA,GAAQH,WAAAA;AAAA,IACZ,OAAO,KAAA,KAAyC;AAE9C,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAElE,MAAA,IAAI,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/B,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,OAAA,CAAQ,IAAI,GAAG,CAAA;AAE1B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAA0B;AAAA,UAC9B,GAAG,KAAA;AAAA,UACH,GAAI,cAAc,EAAE,GAAA,EAAK,MAAM,GAAA,IAAO,MAAA,CAAO,SAAS,IAAA,EAAK;AAAA,UAC3D,GAAI,gBAAA,IAAoB,EAAE,SAAA,EAAW,KAAA,CAAM,8BAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAE;AAAA,UACjF,UAAU,EAAE,GAAG,QAAA,EAAU,GAAG,MAAM,QAAA;AAAS,SAC7C;AAGA,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAC7E,UAAA,SAAA,CAAU,UAAA,CAAW,UAAU,IAAI,CAAA;AAAA,QACrC,CAAA,MAAO;AAEL,UAAA,MAAM,MAAM,QAAA,EAAU;AAAA,YACpB,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,YAC5B,SAAA,EAAW;AAAA,WACZ,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,MACnD,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,UAAA,EAAY,gBAAA,EAAkB,QAAQ;AAAA,GACnD;AAGA,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,OAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,OAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,OAAO,KAAA,CAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,aAAA,EAAc;AACtD;AAKO,SAAS,uBAAuB,QAAA,EAAkB;AACvD,EAAA,OAAO,eAAe,UAAA,CACpB,MAAA,EACA,SAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,MAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAK,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,MAAA;AAAA,MAC5D,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC;AAAA,KACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,UAAA,EAAY;AAC5D,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAC7E,QAAA,SAAA,CAAU,UAAA,CAAW,UAAU,IAAI,CAAA;AAAA,MACrC,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,WAAA,EAAa;AACvC,QAAA,MAAM,MAAM,QAAA,EAAU;AAAA,UACpB,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,UAC5B,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,IACnD;AAAA,EACF,CAAA;AACF;;;ACtHO,SAAS,iBAAiB,OAAA,EAAqC;AACpE,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,OAAA,CAAQ,YAAA,EAAc,IAAA,EAAK,EAAG;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,EAAM,CAAA;AACtC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AACjC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AAEzC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAQ;AAC9B,IAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,OAAA,CAAQ,WAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAM,MAAA,EAAQ;AACxB,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,OAAA,CAAQ,WAAW,CAAA,IAAA,CAAM,CAAA;AAAA,EAC7D;AAEA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,eAAA,GAAkB,OAAO,OAAA,CAAQ,OAAO,IAC1C,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA,GAC9B,OAAA,CAAQ,OAAA;AACZ,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AACvC,EAAA,MAAM,SAAA,GAAY,WAAW,QAAQ,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,qBAAqB,QAAQ,CAAA;AACjD,EAAA,MAAM,QAAA,GAAW,wBAAwB,QAAQ,CAAA;AAEjD,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,uBAAuB,OAAA,EAA6B;AAClE,EAAA,OAAO,gBAAA,CAAiB,OAAO,CAAA,CAAE,QAAA;AACnC;AAKA,SAAS,OAAO,GAAA,EAAsB;AACpC,EAAA,OAAO,iBAAA,CAAkB,KAAK,GAAG,CAAA;AACnC;AAKA,SAAS,wBAAwB,QAAA,EAAgC;AAC/D,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAC5C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AACvB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAC3B,MAAA,MAAM,EAAA,GAAK,YAAA,CAAa,IAAA,EAAM,KAAK,CAAA;AAEnC,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AACjC,MAAA,KAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,YAAA,CAAa,MAAc,KAAA,EAAuB;AACzD,EAAA,MAAM,OAAO,IAAA,CACV,WAAA,GACA,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAC3B,OAAA,CAAQ,MAAA,EAAQ,GAAG,EACnB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,YAAY,EAAE,CAAA;AAEzB,EAAA,OAAO,IAAA,IAAQ,WAAW,KAAK,CAAA,CAAA;AACjC;AAKO,SAAS,mBAAmB,OAAA,EAA6B;AAC9D,EAAA,MAAM,QAAA,GAAW,uBAAuB,OAAO,CAAA;AAC/C,EAAA,OAAO,SACJ,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,OAAA,CAAQ,oBAAoB,IAAI,CAAA,CAChC,OAAA,CAAQ,cAAA,EAAgB,IAAI,CAAA,CAC5B,OAAA,CAAQ,cAAc,IAAI,CAAA,CAC1B,QAAQ,wBAAA,EAA0B,IAAI,CAAA,CACtC,OAAA,CAAQ,2BAA2B,EAAE,CAAA,CACrC,QAAQ,aAAA,EAAe,EAAE,EACzB,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,WAAW,EAAE,CAAA,CACrB,QAAQ,SAAA,EAAW,MAAM,EACzB,IAAA,EAAK;AACV;;;AC3IO,SAAS,gBAAgB,MAAA,EAA+B;AAC7D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AACjC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAA,CAAO,eAAe,CAAA,CAAE,CAAA;AACxC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC9B,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,wEAAwE,CAAA;AAAA,EACrF;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAA,CAAO,OAAO,CAAA,CAAE,CAAA;AAC9C,EAAA,KAAA,CAAM,KAAK,+DAA+D,CAAA;AAC1E,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AACjC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,OAAA,EAAS;AACjC,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,CAAK,GAAA,EAAK,OAAO,GAAG,CAAA;AAEpD,MAAA,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAE3C,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACvC;AAEA,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACvC;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,MACrD;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAE,CAAA;AAC1C,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf;AAAA,EACF;AAGA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,EAC9B,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,oFAAoF,CAAA;AAAA,EACjG;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,gBAAA,CAAiB,GAAA,EAAa,GAAA,EAAa,KAAA,EAAuB;AACzE,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5C,EAAA,OAAO,GAAG,GAAG,CAAA,EAAG,SAAS,CAAA,EAAG,GAAG,IAAI,KAAK,CAAA,CAAA;AAC1C;AChCO,SAAS,qBAAqB,OAAA,EAAgC;AACnE,EAAA,OAAO,eAAe,QAAQ,OAAA,EAA6C;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,aAAA,EAAc;AAC/C,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,EAAW;AAEzC,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,UAAU,UAAA,CAAW,QAAA;AAAA,QACrB,iBAAiB,UAAA,CAAW,eAAA;AAAA,QAC5B,SAAS,UAAA,CAAW,OAAA;AAAA,QACpB,OAAA;AAAA,QACA,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,YAAY,OAAA,CAAQ;AAAA,OACtB;AAEA,MAAA,MAAM,OAAA,GAAU,gBAAgB,MAAM,CAAA;AAEtC,MAAA,OAAO,IAAI,aAAa,OAAA,EAAS;AAAA,QAC/B,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,2BAAA;AAAA,UAChB,eAAA,EAAiB,QAAQ,YAAA,IAAgB,sBAAA;AAAA,UACzC,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,IAAI,YAAA,CAAa,2BAAA,EAA6B,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtE;AAAA,EACF,CAAA;AACF;AAgBO,SAAS,yBAAyB,OAAA,EAAgC;AACvE,EAAA,OAAO,eAAe,OAAA,CACpB,GAAA,EACA,GAAA,EAIe;AACf,IAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,CAAI,oBAAoB,CAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,aAAA,EAAc;AAC/C,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,EAAW;AAEzC,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,UAAU,UAAA,CAAW,QAAA;AAAA,QACrB,iBAAiB,UAAA,CAAW,eAAA;AAAA,QAC5B,SAAS,UAAA,CAAW,OAAA;AAAA,QACpB,OAAA;AAAA,QACA,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,YAAY,OAAA,CAAQ;AAAA,OACtB;AAEA,MAAA,MAAM,OAAA,GAAU,gBAAgB,MAAM,CAAA;AAEtC,MAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,2BAA2B,CAAA;AACzD,MAAA,GAAA,CAAI,SAAA,CAAU,eAAA,EAAiB,OAAA,CAAQ,YAAA,IAAgB,sBAAsB,CAAA;AAC7E,MAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,SAAS,CAAA;AACvC,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,CAAI,2BAA2B,CAAA;AAAA,IACjD;AAAA,EACF,CAAA;AACF;ACtGO,SAAS,aAAa,OAAA,EAAiC;AAC5D,EAAA,OAAO,eAAe,WAAW,OAAA,EAAyD;AACxF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAG3C,IAAA,IAAI,aAAa,GAAA,EAAK;AACpB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA;AAEjD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,IAAII,YAAAA,CAAa,mBAAA,EAAqB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,MAC9D;AAEA,MAAA,MAAM,QAAA,GAAW,uBAAuB,OAAO,CAAA;AAE/C,MAAA,OAAO,IAAIA,aAAa,QAAA,EAAU;AAAA,QAChC,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,8BAAA;AAAA,UAChB,eAAA,EAAiB,QAAQ,YAAA,IAAgB,sBAAA;AAAA,UACzC,cAAA,EAAgB,SAAA;AAAA,UAChB,GAAI,QAAQ,IAAA,IAAQ;AAAA,YAClB,6BAAA,EAA+B,GAAA;AAAA,YAC/B,8BAAA,EAAgC;AAAA;AAClC;AACF,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,IAAIA,YAAAA,CAAa,2BAAA,EAA6B,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtE;AAAA,EACF,CAAA;AACF;AAuBO,SAAS,sBACd,OAAA,EAGA;AACA,EAAA,OAAO,eAAe,OAAA,CACpB,OAAA,EACA,EAAE,QAAO,EACc;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,EAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AAE7C,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,IAAIA,aAAa,mBAAA,EAAqB;AAAA,UAC3C,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,YAAA;AAAa,SACzC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAW,uBAAuB,OAAO,CAAA;AAE/C,MAAA,OAAO,IAAIA,aAAa,QAAA,EAAU;AAAA,QAChC,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,8BAAA;AAAA,UAChB,eAAA,EAAiB,QAAQ,YAAA,IAAgB,sBAAA;AAAA,UACzC,cAAA,EAAgB,SAAA;AAAA,UAChB,GAAI,QAAQ,IAAA,IAAQ;AAAA,YAClB,6BAAA,EAA+B,GAAA;AAAA,YAC/B,8BAAA,EAAgC;AAAA;AAClC;AACF,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,8BAA8B,KAAK,CAAA;AACjD,MAAA,OAAO,IAAIA,YAAAA,CAAa,2BAAA,EAA6B,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtE;AAAA,EACF,CAAA;AACF;AAKO,SAAS,YAAY,OAAA,EAA+B;AACzD,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC/B,EAAA,OAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,KAAM,GAAA;AACzC;ACjIO,SAAS,qBAAA,GAAiD;AAC/D,EAAA,MAAM,SAA2B,EAAC;AAElC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAO,KAAA,KAA0B;AACrC,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,MAAA,EAAQ,YAAY,CAAC,GAAG,MAAM,CAAA;AAAA,IAC9B,OAAO,YAAY;AACjB,MAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,IAClB;AAAA,GACF;AACF;AAuBO,SAAS,uBAAuB,OAAA,EAAkC;AAEvE,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAgD;AAE1E,EAAA,OAAO,eAAe,QAAQ,OAAA,EAA6C;AAEzE,IAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,MAAA,OAAO,IAAIA,aAAa,IAAA,EAAM;AAAA,QAC5B,MAAA,EAAQ,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,6BAAA,EAA+B,GAAA;AAAA,UAC/B,8BAAA,EAAgC,eAAA;AAAA,UAChC,8BAAA,EAAgC;AAAA;AAClC,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,MAAA,OAAO,IAAIA,YAAAA,CAAa,oBAAA,EAAsB,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC/D;AAGA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,IAAK,SAAA;AAC3D,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,QAAA,GAAW,GAAA;AAEjB,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,IAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,GAAA,GAAM,QAAA,EAAS;AAEtF,MAAA,IAAI,GAAA,GAAM,WAAW,OAAA,EAAS;AAC5B,QAAA,UAAA,CAAW,KAAA,GAAQ,CAAA;AACnB,QAAA,UAAA,CAAW,UAAU,GAAA,GAAM,QAAA;AAAA,MAC7B;AAEA,MAAA,UAAA,CAAW,KAAA,EAAA;AACX,MAAA,aAAA,CAAc,GAAA,CAAI,UAAU,UAAU,CAAA;AAEtC,MAAA,IAAI,UAAA,CAAW,KAAA,GAAQ,OAAA,CAAQ,SAAA,EAAW;AACxC,QAAA,OAAO,IAAIA,aAAa,qBAAA,EAAuB;AAAA,UAC7C,MAAA,EAAQ,GAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,aAAA,EAAe,KAAK,IAAA,CAAA,CAAM,UAAA,CAAW,UAAU,GAAA,IAAO,GAAI,EAAE,QAAA;AAAS;AACvE,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,IAAA,EAAK;AAChC,MAAA,MAAM,KAAA,GAAwB;AAAA,QAC5B,MAAA,EAAQ,KAAK,MAAA,IAAU,MAAA;AAAA,QACvB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,KAAK,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,OAAA,CAAQ,IAAI,SAAS,CAAA;AAAA,QAC9C,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,UAAU,IAAA,CAAK;AAAA,OACjB;AAEA,MAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAEhC,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,cAAA,EAAgB;AAAA,OAClB;AAEA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,6BAA6B,CAAA,GAAI,GAAA;AAAA,MAC3C;AAEA,MAAA,OAAOA,YAAAA,CAAa,KAAK,EAAE,OAAA,EAAS,MAAM,KAAA,EAAM,EAAG,EAAE,OAAA,EAAS,CAAA;AAAA,IAChE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,OAAOA,YAAAA,CAAa,IAAA,CAAK,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,uBAAA,EAAwB,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAC9F;AAAA,EACF,CAAA;AACF;AAKO,SAAS,2BAA2B,OAAA,EAAkC;AAC3E,EAAA,OAAO,eAAe,OAAA,CACpB,GAAA,EAKA,GAAA,EAOe;AACf,IAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,GAAA,CAAI,oBAAoB,CAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,MAAA,MAAM,KAAA,GAAwB;AAAA,QAC5B,MAAA,EAAS,MAAM,MAAA,IAAuC,MAAA;AAAA,QACtD,WAAW,IAAA,EAAM,SAAA;AAAA,QACjB,GAAA,EAAM,IAAA,EAAM,GAAA,IAAmB,GAAA,CAAI,OAAA,EAAS,OAAA;AAAA,QAC5C,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,UAAU,IAAA,EAAM;AAAA,OAClB;AAEA,MAAA,MAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAEhC,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,SAAA,CAAU,+BAA+B,GAAG,CAAA;AAAA,MAClD;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,CAAA;AAAA,IAC/C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,uBAAA,EAAyB,CAAA;AAAA,IACzE;AAAA,EACF,CAAA;AACF;AAKA,eAAsB,gBACpB,OAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,EAAO;AACpC,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAQ;AAC1B,MAAA,MAAA,CAAO,MAAM,MAAM,CAAA,EAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,eAAsB,mBAAA,CACpB,SACA,SAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,EAAO;AACpC,EAAA,OAAO,OAAO,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,cAAc,SAAS,CAAA;AAC/D","file":"index.js","sourcesContent":["/**\n * Clipboard Utilities\n * Cross-browser clipboard operations\n */\n\n/**\n * Copy text to clipboard\n * Uses modern Clipboard API with fallback for older browsers\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n // Try modern Clipboard API first\n if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch (err) {\n // Fall through to fallback\n console.warn('Clipboard API failed, using fallback:', err);\n }\n }\n\n // Fallback for older browsers or when Clipboard API fails\n return fallbackCopyToClipboard(text);\n}\n\n/**\n * Fallback copy method using execCommand\n */\nfunction fallbackCopyToClipboard(text: string): boolean {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n\n // Make the textarea invisible\n textarea.style.position = 'fixed';\n textarea.style.top = '-9999px';\n textarea.style.left = '-9999px';\n textarea.style.opacity = '0';\n textarea.style.pointerEvents = 'none';\n\n // Prevent zooming on iOS\n textarea.style.fontSize = '16px';\n\n document.body.appendChild(textarea);\n textarea.focus();\n textarea.select();\n\n try {\n const successful = document.execCommand('copy');\n document.body.removeChild(textarea);\n return successful;\n } catch (err) {\n console.error('Fallback copy failed:', err);\n document.body.removeChild(textarea);\n return false;\n }\n}\n\n/**\n * Check if clipboard is supported\n */\nexport function isClipboardSupported(): boolean {\n return !!(\n (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') ||\n document.queryCommandSupported?.('copy')\n );\n}\n\n/**\n * Read text from clipboard\n */\nexport async function readFromClipboard(): Promise<string | null> {\n if (navigator.clipboard && typeof navigator.clipboard.readText === 'function') {\n try {\n return await navigator.clipboard.readText();\n } catch (err) {\n console.warn('Failed to read from clipboard:', err);\n return null;\n }\n }\n return null;\n}\n","/**\n * Download Utilities\n * File download functionality\n */\n\nimport type { DownloadOptions } from '../types';\n\nconst defaultOptions: DownloadOptions = {\n filename: 'content',\n extension: 'md',\n includeMetadata: false,\n};\n\n/**\n * Download content as a file\n */\nexport function downloadAsFile(\n content: string,\n options: DownloadOptions = {}\n): void {\n const opts = { ...defaultOptions, ...options };\n const filename = sanitizeFilename(opts.filename || 'content');\n const fullFilename = `${filename}.${opts.extension}`;\n\n // Determine MIME type\n const mimeType = opts.extension === 'md' ? 'text/markdown' : 'text/plain';\n\n // Create blob and download\n const blob = new Blob([content], { type: `${mimeType};charset=utf-8` });\n const url = URL.createObjectURL(blob);\n\n const link = document.createElement('a');\n link.href = url;\n link.download = fullFilename;\n\n // Required for Firefox\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up\n URL.revokeObjectURL(url);\n}\n\n/**\n * Sanitize filename by removing/replacing invalid characters\n */\nexport function sanitizeFilename(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '') // Remove special characters\n .replace(/\\s+/g, '-') // Replace spaces with hyphens\n .replace(/-+/g, '-') // Replace multiple hyphens with single\n .replace(/^-+|-+$/g, '') // Trim hyphens from start/end\n .substring(0, 100); // Limit length\n}\n\n/**\n * Generate filename from title\n */\nexport function generateFilename(title: string): string {\n const base = sanitizeFilename(title);\n const date = new Date().toISOString().split('T')[0];\n return `${base}-${date}`;\n}\n","/**\n * HTML to Markdown Converter\n * Converts HTML content to clean markdown format\n */\n\nimport type { HTMLToMarkdownOptions } from '../types';\n\nconst defaultOptions: HTMLToMarkdownOptions = {\n preserveLineBreaks: true,\n convertImages: true,\n convertLinks: true,\n stripScripts: true,\n customHandlers: {},\n};\n\n/**\n * Convert HTML string to Markdown\n */\nexport function htmlToMarkdown(\n html: string,\n options: HTMLToMarkdownOptions = {}\n): string {\n const opts = { ...defaultOptions, ...options };\n\n // Create a temporary DOM element to parse HTML\n if (typeof window === 'undefined') {\n // Server-side: use basic regex conversion\n return serverSideConvert(html, opts);\n }\n\n // Client-side: use DOM parsing\n const doc = new DOMParser().parseFromString(html, 'text/html');\n return convertNode(doc.body, opts);\n}\n\n/**\n * Server-side HTML to Markdown conversion (regex-based)\n */\nfunction serverSideConvert(html: string, opts: HTMLToMarkdownOptions): string {\n let markdown = html;\n\n // Strip scripts and styles\n if (opts.stripScripts) {\n markdown = markdown.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n markdown = markdown.replace(/<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi, '');\n }\n\n // Headings\n markdown = markdown.replace(/<h1[^>]*>(.*?)<\\/h1>/gi, '\\n# $1\\n');\n markdown = markdown.replace(/<h2[^>]*>(.*?)<\\/h2>/gi, '\\n## $1\\n');\n markdown = markdown.replace(/<h3[^>]*>(.*?)<\\/h3>/gi, '\\n### $1\\n');\n markdown = markdown.replace(/<h4[^>]*>(.*?)<\\/h4>/gi, '\\n#### $1\\n');\n markdown = markdown.replace(/<h5[^>]*>(.*?)<\\/h5>/gi, '\\n##### $1\\n');\n markdown = markdown.replace(/<h6[^>]*>(.*?)<\\/h6>/gi, '\\n###### $1\\n');\n\n // Bold and italic\n markdown = markdown.replace(/<(strong|b)[^>]*>(.*?)<\\/\\1>/gi, '**$2**');\n markdown = markdown.replace(/<(em|i)[^>]*>(.*?)<\\/\\1>/gi, '*$2*');\n\n // Links\n if (opts.convertLinks) {\n markdown = markdown.replace(/<a[^>]*href=[\"']([^\"']*)[\"'][^>]*>(.*?)<\\/a>/gi, '[$2]($1)');\n }\n\n // Images\n if (opts.convertImages) {\n markdown = markdown.replace(\n /<img[^>]*src=[\"']([^\"']*)[\"'][^>]*alt=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n '![$2]($1)'\n );\n markdown = markdown.replace(\n /<img[^>]*alt=[\"']([^\"']*)[\"'][^>]*src=[\"']([^\"']*)[\"'][^>]*\\/?>/gi,\n '![$1]($2)'\n );\n markdown = markdown.replace(/<img[^>]*src=[\"']([^\"']*)[\"'][^>]*\\/?>/gi, '![]($1)');\n }\n\n // Lists\n markdown = markdown.replace(/<ul[^>]*>/gi, '\\n');\n markdown = markdown.replace(/<\\/ul>/gi, '\\n');\n markdown = markdown.replace(/<ol[^>]*>/gi, '\\n');\n markdown = markdown.replace(/<\\/ol>/gi, '\\n');\n markdown = markdown.replace(/<li[^>]*>(.*?)<\\/li>/gi, '- $1\\n');\n\n // Blockquotes\n markdown = markdown.replace(/<blockquote[^>]*>(.*?)<\\/blockquote>/gis, (_, content) => {\n return '\\n> ' + content.trim().replace(/\\n/g, '\\n> ') + '\\n';\n });\n\n // Code blocks\n markdown = markdown.replace(/<pre[^>]*><code[^>]*>(.*?)<\\/code><\\/pre>/gis, '\\n```\\n$1\\n```\\n');\n markdown = markdown.replace(/<code[^>]*>(.*?)<\\/code>/gi, '`$1`');\n\n // Paragraphs and line breaks\n markdown = markdown.replace(/<p[^>]*>(.*?)<\\/p>/gis, '\\n$1\\n');\n markdown = markdown.replace(/<br\\s*\\/?>/gi, '\\n');\n\n // Horizontal rules\n markdown = markdown.replace(/<hr[^>]*\\/?>/gi, '\\n---\\n');\n\n // Strip remaining HTML tags\n markdown = markdown.replace(/<[^>]+>/g, '');\n\n // Decode HTML entities\n markdown = decodeHTMLEntities(markdown);\n\n // Clean up whitespace\n markdown = markdown.replace(/\\n{3,}/g, '\\n\\n');\n markdown = markdown.trim();\n\n return markdown;\n}\n\n/**\n * Client-side DOM-based conversion\n */\nfunction convertNode(node: Node, opts: HTMLToMarkdownOptions): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || '';\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n\n // Check for custom handler\n if (opts.customHandlers?.[tagName]) {\n return opts.customHandlers[tagName](element);\n }\n\n // Skip scripts and styles\n if (opts.stripScripts && (tagName === 'script' || tagName === 'style')) {\n return '';\n }\n\n const childContent = Array.from(element.childNodes)\n .map((child) => convertNode(child, opts))\n .join('');\n\n switch (tagName) {\n case 'h1':\n return `\\n# ${childContent.trim()}\\n`;\n case 'h2':\n return `\\n## ${childContent.trim()}\\n`;\n case 'h3':\n return `\\n### ${childContent.trim()}\\n`;\n case 'h4':\n return `\\n#### ${childContent.trim()}\\n`;\n case 'h5':\n return `\\n##### ${childContent.trim()}\\n`;\n case 'h6':\n return `\\n###### ${childContent.trim()}\\n`;\n case 'p':\n return `\\n${childContent.trim()}\\n`;\n case 'br':\n return opts.preserveLineBreaks ? '\\n' : ' ';\n case 'strong':\n case 'b':\n return `**${childContent}**`;\n case 'em':\n case 'i':\n return `*${childContent}*`;\n case 'u':\n return `_${childContent}_`;\n case 's':\n case 'strike':\n case 'del':\n return `~~${childContent}~~`;\n case 'a':\n if (opts.convertLinks) {\n const href = element.getAttribute('href') || '';\n return `[${childContent}](${href})`;\n }\n return childContent;\n case 'img':\n if (opts.convertImages) {\n const src = element.getAttribute('src') || '';\n const alt = element.getAttribute('alt') || '';\n return `![${alt}](${src})`;\n }\n return '';\n case 'ul':\n return `\\n${childContent}\\n`;\n case 'ol':\n return `\\n${childContent}\\n`;\n case 'li':\n return `- ${childContent.trim()}\\n`;\n case 'blockquote':\n return `\\n> ${childContent.trim().replace(/\\n/g, '\\n> ')}\\n`;\n case 'pre':\n const codeElement = element.querySelector('code');\n const lang = codeElement?.className.match(/language-(\\w+)/)?.[1] || '';\n const code = codeElement?.textContent || childContent;\n return `\\n\\`\\`\\`${lang}\\n${code.trim()}\\n\\`\\`\\`\\n`;\n case 'code':\n // Check if inside pre\n if (element.parentElement?.tagName.toLowerCase() === 'pre') {\n return childContent;\n }\n return `\\`${childContent}\\``;\n case 'hr':\n return '\\n---\\n';\n case 'table':\n return convertTable(element);\n case 'div':\n case 'section':\n case 'article':\n case 'main':\n case 'aside':\n case 'header':\n case 'footer':\n case 'nav':\n return childContent;\n default:\n return childContent;\n }\n}\n\n/**\n * Convert HTML table to Markdown table\n */\nfunction convertTable(table: Element): string {\n const rows = table.querySelectorAll('tr');\n if (rows.length === 0) return '';\n\n let markdown = '\\n';\n let headerProcessed = false;\n\n rows.forEach((row, index) => {\n const cells = row.querySelectorAll('th, td');\n const rowContent = Array.from(cells)\n .map((cell) => cell.textContent?.trim() || '')\n .join(' | ');\n\n markdown += `| ${rowContent} |\\n`;\n\n // Add separator after header row\n if (!headerProcessed && (row.querySelector('th') || index === 0)) {\n const separator = Array.from(cells)\n .map(() => '---')\n .join(' | ');\n markdown += `| ${separator} |\\n`;\n headerProcessed = true;\n }\n });\n\n return markdown + '\\n';\n}\n\n/**\n * Decode HTML entities\n */\nfunction decodeHTMLEntities(text: string): string {\n const entities: Record<string, string> = {\n '&amp;': '&',\n '&lt;': '<',\n '&gt;': '>',\n '&quot;': '\"',\n '&#39;': \"'\",\n '&apos;': \"'\",\n '&nbsp;': ' ',\n '&mdash;': '—',\n '&ndash;': '–',\n '&hellip;': '…',\n '&copy;': '©',\n '&reg;': '®',\n '&trade;': '™',\n };\n\n let result = text;\n for (const [entity, char] of Object.entries(entities)) {\n result = result.replace(new RegExp(entity, 'g'), char);\n }\n\n // Decode numeric entities\n result = result.replace(/&#(\\d+);/g, (_, num) => String.fromCharCode(parseInt(num, 10)));\n result = result.replace(/&#x([0-9a-f]+);/gi, (_, hex) =>\n String.fromCharCode(parseInt(hex, 16))\n );\n\n return result;\n}\n\n/**\n * Calculate word count from text\n */\nexport function countWords(text: string): number {\n return text\n .replace(/[^\\w\\s]/g, '')\n .split(/\\s+/)\n .filter((word) => word.length > 0).length;\n}\n\n/**\n * Calculate reading time in minutes\n */\nexport function calculateReadingTime(text: string, wordsPerMinute = 200): number {\n const words = countWords(text);\n return Math.ceil(words / wordsPerMinute);\n}\n\n/**\n * Extract headings from HTML for TOC\n */\nexport function extractHeadings(\n html: string,\n levels: string[] = ['h2', 'h3', 'h4']\n): Array<{ id: string; text: string; level: number }> {\n const headings: Array<{ id: string; text: string; level: number }> = [];\n const levelPattern = levels.join('|');\n const regex = new RegExp(\n `<(${levelPattern})[^>]*(?:id=[\"']([^\"']*)[\"'])?[^>]*>(.*?)<\\\\/\\\\1>`,\n 'gi'\n );\n\n let match;\n let index = 0;\n while ((match = regex.exec(html)) !== null) {\n const level = parseInt(match[1].charAt(1), 10);\n const id = match[2] || `heading-${index}`;\n const text = match[3].replace(/<[^>]+>/g, '').trim();\n\n headings.push({ id, text, level });\n index++;\n }\n\n return headings;\n}\n","'use client';\n\n/**\n * useLLMCopy Hook\n * Headless hook for copy/view/download functionality\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport type { LLMContent, UseLLMCopyOptions, UseLLMCopyReturn, CopyAction } from '../types';\nimport { copyToClipboard } from '../utils/clipboard';\nimport { downloadAsFile, generateFilename } from '../utils/download';\nimport { htmlToMarkdown, countWords, calculateReadingTime } from '../utils/html-to-markdown';\n\n/**\n * Generate markdown from LLMContent or string\n */\nfunction generateMarkdownFromContent(content: LLMContent | string): string {\n if (typeof content === 'string') {\n return content;\n }\n\n const parts: string[] = [];\n\n // Prompt prefix\n if (content.promptPrefix?.trim()) {\n parts.push(content.promptPrefix.trim());\n parts.push('');\n }\n\n // Title\n parts.push(`# ${content.title}`);\n parts.push('');\n\n // Excerpt\n if (content.excerpt) {\n parts.push(`> ${content.excerpt}`);\n parts.push('');\n }\n\n // Metadata\n parts.push('---');\n parts.push(`- **Source**: ${content.url}`);\n\n if (content.date) {\n parts.push(`- **Date**: ${content.date}`);\n }\n\n if (content.author) {\n parts.push(`- **Author**: ${content.author}`);\n }\n\n if (content.categories?.length) {\n parts.push(`- **Categories**: ${content.categories.join(', ')}`);\n }\n\n if (content.tags?.length) {\n parts.push(`- **Tags**: ${content.tags.join(', ')}`);\n }\n\n parts.push('---');\n parts.push('');\n\n // Content\n if (content.content) {\n const contentMarkdown =\n content.content.includes('<') && content.content.includes('>')\n ? htmlToMarkdown(content.content)\n : content.content;\n parts.push(contentMarkdown);\n }\n\n return parts.join('\\n').trim();\n}\n\n/**\n * Hook for LLM copy/view/download operations\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { copy, view, download, markdown, isCopying, isSuccess } = useLLMCopy({\n * content: {\n * title: 'My Article',\n * content: '<p>Article content...</p>',\n * url: 'https://example.com/article',\n * },\n * onSuccess: () => console.log('Copied!'),\n * });\n *\n * return (\n * <div>\n * <button onClick={copy} disabled={isCopying}>\n * {isSuccess ? 'Copied!' : 'Copy'}\n * </button>\n * <button onClick={download}>Download</button>\n * <pre>{view()}</pre>\n * </div>\n * );\n * }\n * ```\n */\nexport function useLLMCopy(options: UseLLMCopyOptions): UseLLMCopyReturn {\n const [isCopying, setIsCopying] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Generate markdown once\n const markdown = useMemo(() => {\n return generateMarkdownFromContent(options.content);\n }, [options.content]);\n\n // Track analytics event\n const trackEvent = useCallback(\n (action: CopyAction) => {\n if (options.onAnalytics) {\n const contentId =\n typeof options.content === 'string' ? undefined : options.content.url;\n\n options.onAnalytics({\n action,\n contentId,\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n timestamp: new Date().toISOString(),\n });\n }\n },\n [options]\n );\n\n // Copy to clipboard\n const copy = useCallback(async (): Promise<boolean> => {\n setIsCopying(true);\n setError(null);\n\n try {\n const success = await copyToClipboard(markdown);\n\n if (success) {\n setIsSuccess(true);\n trackEvent('copy');\n options.onSuccess?.('copy');\n\n // Reset success state after 2 seconds\n setTimeout(() => setIsSuccess(false), 2000);\n return true;\n } else {\n throw new Error('Failed to copy to clipboard');\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Copy failed');\n setError(error);\n options.onError?.(error);\n return false;\n } finally {\n setIsCopying(false);\n }\n }, [markdown, options, trackEvent]);\n\n // View markdown (returns the string)\n const view = useCallback((): string => {\n trackEvent('view');\n options.onSuccess?.('view');\n return markdown;\n }, [markdown, options, trackEvent]);\n\n // Download as file\n const download = useCallback(\n (filename?: string): void => {\n const title =\n typeof options.content === 'string' ? 'content' : options.content.title;\n\n downloadAsFile(markdown, {\n filename: filename || generateFilename(title),\n extension: 'md',\n });\n\n trackEvent('download');\n options.onSuccess?.('download');\n },\n [markdown, options, trackEvent]\n );\n\n return {\n copy,\n view,\n download,\n markdown,\n isCopying,\n isSuccess,\n error,\n };\n}\n\n/**\n * Get word count and reading time from content\n */\nexport function useContentStats(content: LLMContent | string) {\n return useMemo(() => {\n const markdown = generateMarkdownFromContent(content);\n const wordCount = countWords(markdown);\n const readingTime = calculateReadingTime(markdown);\n\n return { wordCount, readingTime };\n }, [content]);\n}\n","'use client';\n\n/**\n * CopyButton Component\n * Simple copy button with optional tooltip\n */\n\nimport React, { useState, useCallback } from 'react';\nimport type { CopyButtonProps, CopyAction } from '../types';\nimport { useLLMCopy } from '../hooks/use-llm-copy';\n\n/**\n * Simple copy button component\n *\n * @example\n * ```tsx\n * <CopyButton\n * content={{\n * title: \"My Article\",\n * content: \"<p>Article content...</p>\",\n * url: \"https://example.com/article\",\n * }}\n * text=\"Copy for AI\"\n * />\n * ```\n */\nexport function CopyButton({\n content,\n text = 'Copy',\n position = 'inline',\n keyboardShortcut = true,\n className = '',\n toastMessage = 'Copied!',\n toastDuration = 2000,\n onCopy,\n onError,\n onAnalytics,\n style,\n disabled = false,\n}: CopyButtonProps) {\n const [showToast, setShowToast] = useState(false);\n\n const { copy, isCopying, isSuccess, error } = useLLMCopy({\n content,\n onSuccess: (action: CopyAction) => {\n setShowToast(true);\n setTimeout(() => setShowToast(false), toastDuration);\n onCopy?.(action);\n },\n onError,\n onAnalytics,\n });\n\n // Handle keyboard shortcut\n React.useEffect(() => {\n if (!keyboardShortcut) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n const modKey = isMac ? e.metaKey : e.ctrlKey;\n\n if (modKey && e.shiftKey && e.key.toLowerCase() === 'c') {\n e.preventDefault();\n copy();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [keyboardShortcut, copy]);\n\n const buttonClasses = [\n 'llm-ready-copy-btn',\n `llm-ready-position-${position}`,\n isCopying && 'llm-ready-copying',\n isSuccess && 'llm-ready-success',\n error && 'llm-ready-error',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className=\"llm-ready-container\" style={style}>\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={copy}\n disabled={disabled || isCopying}\n aria-label={text}\n title={keyboardShortcut ? `${text} (${navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+Shift+C)` : text}\n >\n {/* Copy icon */}\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"llm-ready-icon\"\n >\n {isSuccess ? (\n <polyline points=\"20 6 9 17 4 12\" />\n ) : (\n <>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </>\n )}\n </svg>\n <span className=\"llm-ready-btn-text\">{isSuccess ? toastMessage : text}</span>\n </button>\n\n {/* Toast notification */}\n {showToast && (\n <div className=\"llm-ready-toast llm-ready-toast--visible\" role=\"status\" aria-live=\"polite\">\n {toastMessage}\n </div>\n )}\n </div>\n );\n}\n\nexport default CopyButton;\n","'use client';\n\n/**\n * CopyDropdown Component\n * Split button with dropdown menu for copy/view/download\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport type { CopyDropdownProps, DropdownMenuItem, CopyAction } from '../types';\nimport { useLLMCopy } from '../hooks/use-llm-copy';\n\nconst defaultMenuItems: DropdownMenuItem[] = [\n {\n id: 'copy',\n label: 'Copy to clipboard',\n action: 'copy',\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n ),\n shortcut: '⌘+Shift+C',\n },\n {\n id: 'view',\n label: 'View markdown',\n action: 'view',\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n ),\n },\n {\n id: 'download',\n label: 'Download .md file',\n action: 'download',\n icon: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n ),\n },\n];\n\n/**\n * Split button with dropdown for copy/view/download actions\n *\n * @example\n * ```tsx\n * <CopyDropdown\n * content={{\n * title: \"My Article\",\n * content: \"<p>Article content...</p>\",\n * url: \"https://example.com/article\",\n * }}\n * text=\"Copy for AI\"\n * />\n * ```\n */\nexport function CopyDropdown({\n content,\n text = 'Copy',\n menuItems = defaultMenuItems,\n position = 'inline',\n keyboardShortcut = true,\n className = '',\n toastMessage = 'Copied!',\n toastDuration = 2000,\n onCopy,\n onError,\n onAnalytics,\n style,\n disabled = false,\n}: CopyDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [showToast, setShowToast] = useState(false);\n const [showModal, setShowModal] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const { copy, view, download, markdown, isCopying, isSuccess } = useLLMCopy({\n content,\n onSuccess: (action: CopyAction) => {\n if (action === 'copy') {\n setShowToast(true);\n setTimeout(() => setShowToast(false), toastDuration);\n }\n onCopy?.(action);\n },\n onError,\n onAnalytics,\n });\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('click', handleClickOutside);\n return () => document.removeEventListener('click', handleClickOutside);\n }, []);\n\n // Handle keyboard shortcut\n useEffect(() => {\n if (!keyboardShortcut) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Close dropdown on Escape\n if (e.key === 'Escape' && isOpen) {\n setIsOpen(false);\n return;\n }\n\n // Ctrl/Cmd + Shift + C\n const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n const modKey = isMac ? e.metaKey : e.ctrlKey;\n\n if (modKey && e.shiftKey && e.key.toLowerCase() === 'c') {\n e.preventDefault();\n copy();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [keyboardShortcut, copy, isOpen]);\n\n // Handle menu item click\n const handleItemClick = useCallback(\n (item: DropdownMenuItem) => {\n setIsOpen(false);\n\n if (typeof item.action === 'function') {\n item.action();\n return;\n }\n\n switch (item.action) {\n case 'copy':\n copy();\n break;\n case 'view':\n view();\n setShowModal(true);\n break;\n case 'download':\n download();\n break;\n }\n },\n [copy, view, download]\n );\n\n // Keyboard navigation in dropdown\n const handleDropdownKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) return;\n\n const items = dropdownRef.current?.querySelectorAll('button');\n if (!items) return;\n\n const currentIndex = Array.from(items).indexOf(document.activeElement as HTMLButtonElement);\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n const nextIndex = currentIndex < items.length - 1 ? currentIndex + 1 : 0;\n items[nextIndex]?.focus();\n break;\n case 'ArrowUp':\n e.preventDefault();\n const prevIndex = currentIndex > 0 ? currentIndex - 1 : items.length - 1;\n items[prevIndex]?.focus();\n break;\n case 'Escape':\n setIsOpen(false);\n break;\n }\n },\n [isOpen]\n );\n\n const containerClasses = [\n 'llm-ready-container',\n `llm-ready-position-${position}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <>\n <div ref={containerRef} className={containerClasses} style={style}>\n <div className=\"llm-ready-btn-group\">\n {/* Main copy button */}\n <button\n type=\"button\"\n className={`llm-ready-copy-btn ${isCopying ? 'llm-ready-copying' : ''} ${isSuccess ? 'llm-ready-success' : ''}`}\n onClick={copy}\n disabled={disabled || isCopying}\n aria-label={text}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"llm-ready-icon\"\n >\n {isSuccess ? (\n <polyline points=\"20 6 9 17 4 12\" />\n ) : (\n <>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </>\n )}\n </svg>\n <span className=\"llm-ready-btn-text\">{isSuccess ? toastMessage : text}</span>\n </button>\n\n {/* Dropdown toggle */}\n <button\n type=\"button\"\n className=\"llm-ready-dropdown-btn\"\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n aria-label=\"More options\"\n disabled={disabled}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n </div>\n\n {/* Dropdown menu */}\n <div\n ref={dropdownRef}\n className={`llm-ready-dropdown ${isOpen ? 'llm-ready-dropdown--open' : ''}`}\n role=\"menu\"\n aria-hidden={!isOpen}\n onKeyDown={handleDropdownKeyDown}\n >\n {menuItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n className=\"llm-ready-dropdown-item\"\n role=\"menuitem\"\n onClick={() => handleItemClick(item)}\n tabIndex={isOpen ? 0 : -1}\n >\n {item.icon && <span className=\"llm-ready-dropdown-icon\">{item.icon}</span>}\n <span className=\"llm-ready-dropdown-label\">{item.label}</span>\n {item.shortcut && (\n <span className=\"llm-ready-dropdown-shortcut\">{item.shortcut}</span>\n )}\n </button>\n ))}\n </div>\n\n {/* Toast */}\n {showToast && (\n <div className=\"llm-ready-toast llm-ready-toast--visible\" role=\"status\">\n {toastMessage}\n </div>\n )}\n </div>\n\n {/* Markdown viewer modal */}\n {showModal && (\n <MarkdownModal\n content={markdown}\n onClose={() => setShowModal(false)}\n onCopy={copy}\n onDownload={download}\n />\n )}\n </>\n );\n}\n\n/**\n * Simple markdown viewer modal\n */\nfunction MarkdownModal({\n content,\n onClose,\n onCopy,\n onDownload,\n}: {\n content: string;\n onClose: () => void;\n onCopy: () => Promise<boolean>;\n onDownload: () => void;\n}) {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Close on escape\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n // Trap focus\n useEffect(() => {\n const modal = modalRef.current;\n if (!modal) return;\n\n const focusable = modal.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n first?.focus();\n\n const handleTab = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last?.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first?.focus();\n }\n };\n\n modal.addEventListener('keydown', handleTab);\n return () => modal.removeEventListener('keydown', handleTab);\n }, []);\n\n return (\n <div className=\"llm-ready-modal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Markdown content\">\n <div className=\"llm-ready-modal-backdrop\" onClick={onClose} />\n <div ref={modalRef} className=\"llm-ready-modal-content\">\n <div className=\"llm-ready-modal-header\">\n <h2 className=\"llm-ready-modal-title\">Markdown Content</h2>\n <button\n type=\"button\"\n className=\"llm-ready-modal-close\"\n onClick={onClose}\n aria-label=\"Close modal\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n <div className=\"llm-ready-modal-body\">\n <pre className=\"llm-ready-markdown-content\">{content}</pre>\n </div>\n <div className=\"llm-ready-modal-footer\">\n <button type=\"button\" className=\"llm-ready-btn-secondary\" onClick={onClose}>\n Close\n </button>\n <button type=\"button\" className=\"llm-ready-btn-secondary\" onClick={onDownload}>\n Download\n </button>\n <button type=\"button\" className=\"llm-ready-btn-primary\" onClick={onCopy}>\n Copy\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default CopyDropdown;\n","'use client';\n\n/**\n * useTOC Hook\n * Headless hook for Table of Contents functionality\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport type { TOCHeading, HeadingLevel, UseTOCOptions, UseTOCReturn } from '../types';\n\n/**\n * Hook for Table of Contents functionality\n *\n * @example\n * ```tsx\n * function ArticlePage() {\n * const contentRef = useRef<HTMLDivElement>(null);\n * const { headings, activeId, scrollTo } = useTOC({\n * contentRef,\n * levels: ['h2', 'h3'],\n * });\n *\n * return (\n * <div>\n * <nav>\n * {headings.map(h => (\n * <a\n * key={h.id}\n * href={`#${h.id}`}\n * onClick={(e) => { e.preventDefault(); scrollTo(h.id); }}\n * className={activeId === h.id ? 'active' : ''}\n * >\n * {h.text}\n * </a>\n * ))}\n * </nav>\n * <div ref={contentRef}>\n * <h2 id=\"intro\">Introduction</h2>\n * <p>Content...</p>\n * </div>\n * </div>\n * );\n * }\n * ```\n */\nexport function useTOC(options: UseTOCOptions): UseTOCReturn {\n const {\n contentRef,\n levels = ['h2', 'h3', 'h4'],\n rootMargin = '-100px 0px -80% 0px',\n threshold = 0,\n } = options;\n\n const [headings, setHeadings] = useState<TOCHeading[]>([]);\n const [activeId, setActiveId] = useState<string | null>(null);\n\n // Extract headings from content\n useEffect(() => {\n if (!contentRef?.current) return;\n\n const container = contentRef.current;\n const selector = levels.join(', ');\n const elements = container.querySelectorAll(selector);\n\n const extracted: TOCHeading[] = [];\n let index = 0;\n\n elements.forEach((el) => {\n const tagName = el.tagName.toLowerCase() as HeadingLevel;\n const level = parseInt(tagName.charAt(1), 10);\n const text = el.textContent?.trim() || '';\n\n // Generate or use existing ID\n let id = el.id;\n if (!id) {\n id = generateHeadingId(text, index);\n el.id = id;\n }\n\n extracted.push({ id, text, level });\n index++;\n });\n\n setHeadings(extracted);\n }, [contentRef, levels]);\n\n // Track active heading with Intersection Observer\n useEffect(() => {\n if (!contentRef?.current || headings.length === 0) return;\n\n const container = contentRef.current;\n const observerOptions = {\n root: null,\n rootMargin,\n threshold,\n };\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id);\n }\n });\n }, observerOptions);\n\n // Observe all headings\n headings.forEach((heading) => {\n const element = container.querySelector(`#${CSS.escape(heading.id)}`);\n if (element) {\n observer.observe(element);\n }\n });\n\n return () => observer.disconnect();\n }, [contentRef, headings, rootMargin, threshold]);\n\n // Scroll to heading\n const scrollTo = useCallback((id: string) => {\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n setActiveId(id);\n\n // Update URL hash without scrolling\n if (typeof window !== 'undefined') {\n window.history.pushState(null, '', `#${id}`);\n }\n }\n }, []);\n\n return { headings, activeId, scrollTo };\n}\n\n/**\n * Generate URL-friendly heading ID\n */\nfunction generateHeadingId(text: string, index: number): string {\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 50);\n\n return slug || `heading-${index}`;\n}\n\n/**\n * Build nested TOC structure from flat headings\n */\nexport function buildNestedTOC(headings: TOCHeading[]): TOCHeading[] {\n if (headings.length === 0) return [];\n\n const result: TOCHeading[] = [];\n const stack: { heading: TOCHeading; level: number }[] = [];\n\n for (const heading of headings) {\n const item: TOCHeading = { ...heading, children: [] };\n\n // Pop items from stack until we find parent\n while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n result.push(item);\n } else {\n const parent = stack[stack.length - 1].heading;\n if (!parent.children) parent.children = [];\n parent.children.push(item);\n }\n\n stack.push({ heading: item, level: heading.level });\n }\n\n return result;\n}\n\n/**\n * Hook for keyboard navigation in TOC\n */\nexport function useTOCKeyboard(\n headings: TOCHeading[],\n activeId: string | null,\n scrollTo: (id: string) => void\n) {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (headings.length === 0) return;\n\n const currentIndex = headings.findIndex((h) => h.id === activeId);\n\n if (e.key === 'ArrowDown' && e.altKey) {\n e.preventDefault();\n const nextIndex = Math.min(currentIndex + 1, headings.length - 1);\n scrollTo(headings[nextIndex].id);\n } else if (e.key === 'ArrowUp' && e.altKey) {\n e.preventDefault();\n const prevIndex = Math.max(currentIndex - 1, 0);\n scrollTo(headings[prevIndex].id);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [headings, activeId, scrollTo]);\n}\n","'use client';\n\n/**\n * TOC (Table of Contents) Component\n * Sticky navigation for article headings\n */\n\nimport React, { useState, useCallback } from 'react';\nimport type { TOCProps, TOCHeading } from '../types';\nimport { useTOC, buildNestedTOC, useTOCKeyboard } from '../hooks/use-toc';\n\n/**\n * Table of Contents component\n *\n * @example\n * ```tsx\n * function Article() {\n * const contentRef = useRef<HTMLDivElement>(null);\n *\n * return (\n * <div className=\"article-layout\">\n * <TOC\n * contentRef={contentRef}\n * position=\"right\"\n * levels={['h2', 'h3']}\n * sticky\n * />\n * <article ref={contentRef}>\n * <h2 id=\"intro\">Introduction</h2>\n * <p>Content...</p>\n * </article>\n * </div>\n * );\n * }\n * ```\n */\nexport function TOC({\n content,\n contentRef,\n headings: providedHeadings,\n position = 'right',\n levels = ['h2', 'h3', 'h4'],\n title = 'On This Page',\n sticky = true,\n stickyOffset = 80,\n className = '',\n smoothScroll = true,\n highlightActive = true,\n collapsible = true,\n defaultCollapsed = false,\n style,\n}: TOCProps) {\n const [isCollapsed, setIsCollapsed] = useState(defaultCollapsed);\n\n // Use hook for dynamic headings, or use provided headings\n const { headings: dynamicHeadings, activeId, scrollTo } = useTOC({\n contentRef: contentRef || { current: null },\n levels,\n });\n\n // Use provided headings if available, otherwise use dynamic\n const headings = providedHeadings || dynamicHeadings;\n\n // Enable keyboard navigation\n useTOCKeyboard(headings, activeId, scrollTo);\n\n // Handle click on heading link\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLAnchorElement>, id: string) => {\n e.preventDefault();\n if (smoothScroll) {\n scrollTo(id);\n } else {\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView();\n window.history.pushState(null, '', `#${id}`);\n }\n }\n },\n [scrollTo, smoothScroll]\n );\n\n if (headings.length === 0) {\n return null;\n }\n\n const tocClasses = [\n 'llm-ready-toc',\n `llm-ready-toc-${position}`,\n sticky && 'llm-ready-toc-sticky',\n isCollapsed && 'llm-ready-toc-collapsed',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const tocStyle: React.CSSProperties = {\n ...style,\n ...(sticky && { top: stickyOffset }),\n };\n\n return (\n <nav className={tocClasses} style={tocStyle} aria-label=\"Table of contents\">\n <div className=\"llm-ready-toc-header\">\n <h3 className=\"llm-ready-toc-title\">{title}</h3>\n {collapsible && (\n <button\n type=\"button\"\n className=\"llm-ready-toc-toggle\"\n onClick={() => setIsCollapsed(!isCollapsed)}\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? 'Expand table of contents' : 'Collapse table of contents'}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{ transform: isCollapsed ? 'rotate(180deg)' : 'none' }}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n )}\n </div>\n\n {!isCollapsed && (\n <ul className=\"llm-ready-toc-list\">\n {headings.map((heading) => (\n <TOCItem\n key={heading.id}\n heading={heading}\n activeId={activeId}\n highlightActive={highlightActive}\n onClick={handleClick}\n />\n ))}\n </ul>\n )}\n </nav>\n );\n}\n\n/**\n * Individual TOC item with nested children support\n */\nfunction TOCItem({\n heading,\n activeId,\n highlightActive,\n onClick,\n}: {\n heading: TOCHeading;\n activeId: string | null;\n highlightActive: boolean;\n onClick: (e: React.MouseEvent<HTMLAnchorElement>, id: string) => void;\n}) {\n const isActive = highlightActive && heading.id === activeId;\n\n const itemClasses = [\n 'llm-ready-toc-item',\n `llm-ready-toc-level-${heading.level}`,\n isActive && 'llm-ready-toc-active',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <li className={itemClasses}>\n <a\n href={`#${heading.id}`}\n className=\"llm-ready-toc-link\"\n onClick={(e) => onClick(e, heading.id)}\n aria-current={isActive ? 'location' : undefined}\n >\n {heading.text}\n </a>\n {heading.children && heading.children.length > 0 && (\n <ul className=\"llm-ready-toc-nested\">\n {heading.children.map((child) => (\n <TOCItem\n key={child.id}\n heading={child}\n activeId={activeId}\n highlightActive={highlightActive}\n onClick={onClick}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n/**\n * Mobile TOC with slide-up panel\n */\nexport function TOCMobile(props: TOCProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <>\n {/* Floating toggle button */}\n <button\n type=\"button\"\n className=\"llm-ready-toc-mobile-toggle\"\n onClick={() => setIsOpen(true)}\n aria-label=\"Open table of contents\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n <span>Contents</span>\n </button>\n\n {/* Slide-up panel */}\n {isOpen && (\n <div className=\"llm-ready-toc-mobile-panel\">\n <div className=\"llm-ready-toc-mobile-backdrop\" onClick={() => setIsOpen(false)} />\n <div className=\"llm-ready-toc-mobile-content\">\n <div className=\"llm-ready-toc-mobile-header\">\n <h3>Contents</h3>\n <button\n type=\"button\"\n className=\"llm-ready-toc-mobile-close\"\n onClick={() => setIsOpen(false)}\n aria-label=\"Close\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n <TOC {...props} sticky={false} collapsible={false} />\n </div>\n </div>\n )}\n </>\n );\n}\n\nexport default TOC;\n","'use client';\n\n/**\n * LLMBadge Component\n * Visual indicator that content is AI-ready\n */\n\nimport React, { useState } from 'react';\nimport type { LLMBadgeProps } from '../types';\n\n/**\n * Badge showing content is LLM-ready\n *\n * @example\n * ```tsx\n * <LLMBadge\n * text=\"AI Ready\"\n * showTooltip\n * size=\"sm\"\n * />\n * ```\n */\nexport function LLMBadge({\n text = 'AI Ready',\n showTooltip = true,\n tooltipContent = 'This content is optimized for AI assistants like ChatGPT and Claude',\n size = 'md',\n className = '',\n}: LLMBadgeProps) {\n const [isTooltipVisible, setIsTooltipVisible] = useState(false);\n\n const badgeClasses = [\n 'llm-ready-badge',\n `llm-ready-badge-${size}`,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={badgeClasses}\n onMouseEnter={() => showTooltip && setIsTooltipVisible(true)}\n onMouseLeave={() => setIsTooltipVisible(false)}\n onFocus={() => showTooltip && setIsTooltipVisible(true)}\n onBlur={() => setIsTooltipVisible(false)}\n tabIndex={showTooltip ? 0 : -1}\n role={showTooltip ? 'tooltip' : undefined}\n aria-describedby={showTooltip ? 'llm-badge-tooltip' : undefined}\n >\n {/* AI/LLM icon */}\n <svg\n width={size === 'sm' ? 12 : size === 'lg' ? 18 : 14}\n height={size === 'sm' ? 12 : size === 'lg' ? 18 : 14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"llm-ready-badge-icon\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M12 2v4m0 12v4M2 12h4m12 0h4\" />\n <path d=\"m4.93 4.93 2.83 2.83m8.48 8.48 2.83 2.83m0-14.14-2.83 2.83m-8.48 8.48-2.83 2.83\" />\n </svg>\n <span className=\"llm-ready-badge-text\">{text}</span>\n\n {/* Tooltip */}\n {showTooltip && isTooltipVisible && (\n <div id=\"llm-badge-tooltip\" className=\"llm-ready-badge-tooltip\" role=\"tooltip\">\n {tooltipContent}\n </div>\n )}\n </div>\n );\n}\n\nexport default LLMBadge;\n","'use client';\n\n/**\n * useAnalytics Hook\n * Track LLM copy/view/download events\n */\n\nimport { useCallback, useRef } from 'react';\nimport type { AnalyticsEvent, CopyAction, UseAnalyticsOptions, UseAnalyticsReturn } from '../types';\n\n/**\n * Hook for analytics tracking\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { track, trackCopy, trackView, trackDownload } = useAnalytics({\n * endpoint: '/api/analytics',\n * metadata: { contentId: 'article-123' },\n * });\n *\n * return (\n * <button onClick={trackCopy}>Copy</button>\n * );\n * }\n * ```\n */\nexport function useAnalytics(options: UseAnalyticsOptions = {}): UseAnalyticsReturn {\n const {\n endpoint = '/api/llm-analytics',\n includeUrl = true,\n includeTimestamp = true,\n metadata = {},\n } = options;\n\n // Track pending requests to avoid duplicates\n const pendingRef = useRef<Set<string>>(new Set());\n\n // Generic track function\n const track = useCallback(\n async (event: AnalyticsEvent): Promise<void> => {\n // Create unique key for deduplication\n const key = `${event.action}-${event.contentId || ''}-${Date.now()}`;\n\n if (pendingRef.current.has(key)) {\n return;\n }\n\n pendingRef.current.add(key);\n\n try {\n const payload: AnalyticsEvent = {\n ...event,\n ...(includeUrl && { url: event.url || window.location.href }),\n ...(includeTimestamp && { timestamp: event.timestamp || new Date().toISOString() }),\n metadata: { ...metadata, ...event.metadata },\n };\n\n // Use sendBeacon for reliability (won't be cancelled on page unload)\n if (navigator.sendBeacon) {\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\n navigator.sendBeacon(endpoint, blob);\n } else {\n // Fallback to fetch\n await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n }\n } catch (error) {\n console.error('Analytics tracking failed:', error);\n } finally {\n pendingRef.current.delete(key);\n }\n },\n [endpoint, includeUrl, includeTimestamp, metadata]\n );\n\n // Convenience methods for each action type\n const trackCopy = useCallback(() => {\n return track({ action: 'copy' });\n }, [track]);\n\n const trackView = useCallback(() => {\n return track({ action: 'view' });\n }, [track]);\n\n const trackDownload = useCallback(() => {\n return track({ action: 'download' });\n }, [track]);\n\n return { track, trackCopy, trackView, trackDownload };\n}\n\n/**\n * Create a simple analytics tracker function (non-hook version)\n */\nexport function createAnalyticsTracker(endpoint: string) {\n return async function trackEvent(\n action: CopyAction,\n contentId?: string,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n const payload: AnalyticsEvent = {\n action,\n contentId,\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n timestamp: new Date().toISOString(),\n metadata,\n };\n\n try {\n if (typeof navigator !== 'undefined' && navigator.sendBeacon) {\n const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });\n navigator.sendBeacon(endpoint, blob);\n } else if (typeof fetch !== 'undefined') {\n await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n }\n } catch (error) {\n console.error('Analytics tracking failed:', error);\n }\n };\n}\n","/**\n * Server-side Markdown Generation\n * Generate LLM-ready markdown from content\n */\n\nimport type { LLMContent, MarkdownOutput, TOCHeading } from '../types';\nimport { htmlToMarkdown, countWords, calculateReadingTime } from '../utils/html-to-markdown';\n\n/**\n * Generate complete markdown output from LLM content\n */\nexport function generateMarkdown(content: LLMContent): MarkdownOutput {\n const parts: string[] = [];\n\n // Add custom prompt prefix if set\n if (content.promptPrefix?.trim()) {\n parts.push(content.promptPrefix.trim());\n parts.push('');\n }\n\n // Title\n parts.push(`# ${content.title}`);\n parts.push('');\n\n // Excerpt as blockquote\n if (content.excerpt) {\n parts.push(`> ${content.excerpt}`);\n parts.push('');\n }\n\n // Metadata section\n parts.push('---');\n parts.push(`- **Source**: ${content.url}`);\n\n if (content.date) {\n parts.push(`- **Date**: ${content.date}`);\n }\n\n if (content.modifiedDate) {\n parts.push(`- **Modified**: ${content.modifiedDate}`);\n }\n\n if (content.author) {\n parts.push(`- **Author**: ${content.author}`);\n }\n\n if (content.categories?.length) {\n parts.push(`- **Categories**: ${content.categories.join(', ')}`);\n }\n\n if (content.tags?.length) {\n parts.push(`- **Tags**: ${content.tags.join(', ')}`);\n }\n\n if (content.readingTime) {\n parts.push(`- **Reading Time**: ${content.readingTime} min`);\n }\n\n parts.push('---');\n parts.push('');\n\n // Main content (convert HTML to markdown if needed)\n if (content.content) {\n const contentMarkdown = isHTML(content.content)\n ? htmlToMarkdown(content.content)\n : content.content;\n parts.push(contentMarkdown);\n }\n\n const markdown = parts.join('\\n').trim();\n const wordCount = countWords(markdown);\n const readingTime = calculateReadingTime(markdown);\n const headings = extractMarkdownHeadings(markdown);\n\n return {\n markdown,\n wordCount,\n readingTime,\n headings,\n };\n}\n\n/**\n * Generate markdown string only (without metadata)\n */\nexport function generateMarkdownString(content: LLMContent): string {\n return generateMarkdown(content).markdown;\n}\n\n/**\n * Check if string contains HTML\n */\nfunction isHTML(str: string): boolean {\n return /<[a-z][\\s\\S]*>/i.test(str);\n}\n\n/**\n * Extract headings from markdown for TOC\n */\nfunction extractMarkdownHeadings(markdown: string): TOCHeading[] {\n const headings: TOCHeading[] = [];\n const lines = markdown.split('\\n');\n let index = 0;\n\n for (const line of lines) {\n const match = line.match(/^(#{1,6})\\s+(.+)$/);\n if (match) {\n const level = match[1].length;\n const text = match[2].trim();\n const id = generateSlug(text, index);\n\n headings.push({ id, text, level });\n index++;\n }\n }\n\n return headings;\n}\n\n/**\n * Generate URL-friendly slug from text\n */\nfunction generateSlug(text: string, index: number): string {\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n return slug || `heading-${index}`;\n}\n\n/**\n * Convert LLMContent to plain text (for previews, etc.)\n */\nexport function contentToPlainText(content: LLMContent): string {\n const markdown = generateMarkdownString(content);\n return markdown\n .replace(/^#+\\s+/gm, '') // Remove headings\n .replace(/\\*\\*([^*]+)\\*\\*/g, '$1') // Remove bold\n .replace(/\\*([^*]+)\\*/g, '$1') // Remove italic\n .replace(/`([^`]+)`/g, '$1') // Remove inline code\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1') // Remove links\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '') // Remove images\n .replace(/^[-*+]\\s+/gm, '') // Remove list markers\n .replace(/^>\\s+/gm, '') // Remove blockquotes\n .replace(/^---$/gm, '') // Remove horizontal rules\n .replace(/\\n{2,}/g, '\\n\\n') // Normalize line breaks\n .trim();\n}\n","/**\n * LLMs.txt Generator\n * Generate sitemap-style content listing for AI crawlers\n * Follows the llms.txt specification\n */\n\nimport type { LLMsTxtConfig, LLMsTxtItem } from '../types';\n\n/**\n * Generate llms.txt content\n */\nexport function generateLLMsTxt(config: LLMsTxtConfig): string {\n const parts: string[] = [];\n\n // Header\n parts.push(`# ${config.siteName}`);\n parts.push('');\n\n if (config.siteDescription) {\n parts.push(`> ${config.siteDescription}`);\n parts.push('');\n }\n\n // Custom header text or default\n if (config.headerText) {\n parts.push(config.headerText);\n } else {\n parts.push('This file provides LLM-friendly access to the content on this website.');\n }\n parts.push('');\n\n // Site info\n parts.push('---');\n parts.push(`- **Site URL**: ${config.siteUrl}`);\n parts.push('- **Format**: Append `?llm=1` to any page URL to get markdown');\n parts.push('---');\n parts.push('');\n\n // Content listing\n if (config.content.length > 0) {\n parts.push('## Available Content');\n parts.push('');\n\n for (const item of config.content) {\n const llmUrl = appendQueryParam(item.url, 'llm', '1');\n\n parts.push(`### [${item.title}](${llmUrl})`);\n\n if (item.type) {\n parts.push(`- **Type**: ${item.type}`);\n }\n\n if (item.date) {\n parts.push(`- **Date**: ${item.date}`);\n }\n\n if (item.description) {\n parts.push(`- **Description**: ${item.description}`);\n }\n\n parts.push(`- **Markdown URL**: ${llmUrl}`);\n parts.push('');\n }\n }\n\n // Footer\n parts.push('---');\n parts.push('');\n\n if (config.footerText) {\n parts.push(config.footerText);\n } else {\n parts.push('*Generated by [next-llm-ready](https://seoengine.ai) - Make your content AI-ready*');\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Append query parameter to URL\n */\nfunction appendQueryParam(url: string, key: string, value: string): string {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${key}=${value}`;\n}\n\n/**\n * Sort content items by date (newest first)\n */\nexport function sortByDate(items: LLMsTxtItem[]): LLMsTxtItem[] {\n return [...items].sort((a, b) => {\n if (!a.date) return 1;\n if (!b.date) return -1;\n return new Date(b.date).getTime() - new Date(a.date).getTime();\n });\n}\n\n/**\n * Filter content by type\n */\nexport function filterByType(items: LLMsTxtItem[], types: string[]): LLMsTxtItem[] {\n const typeSet = new Set(types.map((t) => t.toLowerCase()));\n return items.filter((item) => !item.type || typeSet.has(item.type.toLowerCase()));\n}\n\n/**\n * Create LLMsTxtItem from minimal data\n */\nexport function createLLMsTxtItem(\n title: string,\n url: string,\n options?: Partial<Omit<LLMsTxtItem, 'title' | 'url'>>\n): LLMsTxtItem {\n return {\n title,\n url,\n ...options,\n };\n}\n","/**\n * LLMs.txt API Route Handler\n * Creates an API route handler for serving /llms.txt\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport type { LLMsTxtConfig, LLMsTxtItem } from '../types';\nimport { generateLLMsTxt } from '../server/generate-llms-txt';\n\nexport interface LLMsTxtHandlerOptions {\n /** Function to get site configuration */\n getSiteConfig: () => Promise<{\n siteName: string;\n siteDescription?: string;\n siteUrl: string;\n }>;\n /** Function to get all content items */\n getContent: () => Promise<LLMsTxtItem[]>;\n /** Cache control header (default: 1 hour) */\n cacheControl?: string;\n /** Custom header text */\n headerText?: string;\n /** Custom footer text */\n footerText?: string;\n}\n\n/**\n * Create an API route handler for /llms.txt\n *\n * @example\n * ```ts\n * // app/llms.txt/route.ts\n * import { createLLMsTxtHandler } from 'next-llm-ready/api';\n *\n * export const GET = createLLMsTxtHandler({\n * getSiteConfig: async () => ({\n * siteName: 'My Site',\n * siteDescription: 'A great website',\n * siteUrl: 'https://example.com',\n * }),\n * getContent: async () => {\n * const posts = await getAllPosts();\n * return posts.map(post => ({\n * title: post.title,\n * url: `https://example.com/blog/${post.slug}`,\n * type: 'post',\n * date: post.date,\n * }));\n * },\n * });\n * ```\n */\nexport function createLLMsTxtHandler(options: LLMsTxtHandlerOptions) {\n return async function handler(request: NextRequest): Promise<NextResponse> {\n try {\n const siteConfig = await options.getSiteConfig();\n const content = await options.getContent();\n\n const config: LLMsTxtConfig = {\n siteName: siteConfig.siteName,\n siteDescription: siteConfig.siteDescription,\n siteUrl: siteConfig.siteUrl,\n content,\n headerText: options.headerText,\n footerText: options.footerText,\n };\n\n const llmsTxt = generateLLMsTxt(config);\n\n return new NextResponse(llmsTxt, {\n status: 200,\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Cache-Control': options.cacheControl || 'public, max-age=3600',\n 'X-Robots-Tag': 'noindex',\n },\n });\n } catch (error) {\n console.error('Error generating llms.txt:', error);\n return new NextResponse('Error generating llms.txt', { status: 500 });\n }\n };\n}\n\n/**\n * Create a Pages Router API handler for /api/llms.txt\n *\n * @example\n * ```ts\n * // pages/api/llms.txt.ts\n * import { createLLMsTxtPageHandler } from 'next-llm-ready/api';\n *\n * export default createLLMsTxtPageHandler({\n * getSiteConfig: async () => ({ ... }),\n * getContent: async () => { ... },\n * });\n * ```\n */\nexport function createLLMsTxtPageHandler(options: LLMsTxtHandlerOptions) {\n return async function handler(\n req: { method?: string },\n res: {\n status: (code: number) => { end: (body?: string) => void; json: (body: unknown) => void };\n setHeader: (name: string, value: string) => void;\n }\n ): Promise<void> {\n if (req.method !== 'GET') {\n res.status(405).end('Method Not Allowed');\n return;\n }\n\n try {\n const siteConfig = await options.getSiteConfig();\n const content = await options.getContent();\n\n const config: LLMsTxtConfig = {\n siteName: siteConfig.siteName,\n siteDescription: siteConfig.siteDescription,\n siteUrl: siteConfig.siteUrl,\n content,\n headerText: options.headerText,\n footerText: options.footerText,\n };\n\n const llmsTxt = generateLLMsTxt(config);\n\n res.setHeader('Content-Type', 'text/plain; charset=utf-8');\n res.setHeader('Cache-Control', options.cacheControl || 'public, max-age=3600');\n res.setHeader('X-Robots-Tag', 'noindex');\n res.status(200).end(llmsTxt);\n } catch (error) {\n console.error('Error generating llms.txt:', error);\n res.status(500).end('Error generating llms.txt');\n }\n };\n}\n","/**\n * Markdown API Route Handler\n * Serves markdown content for ?llm=1 requests\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport type { LLMContent, MarkdownHandlerOptions } from '../types';\nimport { generateMarkdownString } from '../server/generate-markdown';\n\n/**\n * Create middleware to handle ?llm=1 query parameter\n *\n * @example\n * ```ts\n * // middleware.ts\n * import { withLLMParam } from 'next-llm-ready/api';\n *\n * export default withLLMParam({\n * getContent: async (pathname) => {\n * // Extract slug and fetch content\n * const slug = pathname.split('/').pop();\n * const post = await getPostBySlug(slug);\n * if (!post) return null;\n * return {\n * title: post.title,\n * content: post.content,\n * url: `https://example.com${pathname}`,\n * date: post.date,\n * };\n * },\n * });\n * ```\n */\nexport function withLLMParam(options: MarkdownHandlerOptions) {\n return async function middleware(request: NextRequest): Promise<NextResponse | undefined> {\n const url = new URL(request.url);\n const llmParam = url.searchParams.get('llm');\n\n // Only handle if ?llm=1 is present\n if (llmParam !== '1') {\n return undefined; // Continue to next middleware/page\n }\n\n try {\n const pathname = url.pathname;\n const content = await options.getContent(pathname);\n\n if (!content) {\n return new NextResponse('Content not found', { status: 404 });\n }\n\n const markdown = generateMarkdownString(content);\n\n return new NextResponse(markdown, {\n status: 200,\n headers: {\n 'Content-Type': 'text/markdown; charset=utf-8',\n 'Cache-Control': options.cacheControl || 'public, max-age=3600',\n 'X-Robots-Tag': 'noindex',\n ...(options.cors && {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET',\n }),\n },\n });\n } catch (error) {\n console.error('Error generating markdown:', error);\n return new NextResponse('Error generating markdown', { status: 500 });\n }\n };\n}\n\n/**\n * Create an API route handler for markdown endpoints\n *\n * @example\n * ```ts\n * // app/api/content/[slug]/route.ts\n * import { createMarkdownHandler } from 'next-llm-ready/api';\n *\n * export const GET = createMarkdownHandler({\n * getContent: async (slug) => {\n * const post = await getPostBySlug(slug);\n * if (!post) return null;\n * return {\n * title: post.title,\n * content: post.content,\n * url: `https://example.com/blog/${slug}`,\n * };\n * },\n * });\n * ```\n */\nexport function createMarkdownHandler(\n options: Omit<MarkdownHandlerOptions, 'getContent'> & {\n getContent: (slug: string) => Promise<LLMContent | null>;\n }\n) {\n return async function handler(\n request: NextRequest,\n { params }: { params: { slug?: string } }\n ): Promise<NextResponse> {\n try {\n const slug = params?.slug || '';\n const content = await options.getContent(slug);\n\n if (!content) {\n return new NextResponse('Content not found', {\n status: 404,\n headers: { 'Content-Type': 'text/plain' },\n });\n }\n\n const markdown = generateMarkdownString(content);\n\n return new NextResponse(markdown, {\n status: 200,\n headers: {\n 'Content-Type': 'text/markdown; charset=utf-8',\n 'Cache-Control': options.cacheControl || 'public, max-age=3600',\n 'X-Robots-Tag': 'noindex',\n ...(options.cors && {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET',\n }),\n },\n });\n } catch (error) {\n console.error('Error generating markdown:', error);\n return new NextResponse('Error generating markdown', { status: 500 });\n }\n };\n}\n\n/**\n * Helper to check if request has ?llm=1 parameter\n */\nexport function hasLLMParam(request: NextRequest): boolean {\n const url = new URL(request.url);\n return url.searchParams.get('llm') === '1';\n}\n","/**\n * Analytics API Route Handler\n * Tracks copy/view/download events\n */\n\nimport { NextRequest, NextResponse } from 'next/server';\nimport type { AnalyticsEvent, AnalyticsHandlerOptions, AnalyticsStorageAdapter } from '../types';\n\n/**\n * In-memory analytics storage (for development/testing)\n */\nexport function createInMemoryStorage(): AnalyticsStorageAdapter {\n const events: AnalyticsEvent[] = [];\n\n return {\n save: async (event: AnalyticsEvent) => {\n events.push(event);\n },\n getAll: async () => [...events],\n clear: async () => {\n events.length = 0;\n },\n };\n}\n\n/**\n * Create an API route handler for analytics tracking\n *\n * @example\n * ```ts\n * // app/api/analytics/route.ts\n * import { createAnalyticsHandler, createInMemoryStorage } from 'next-llm-ready/api';\n *\n * const storage = createInMemoryStorage();\n *\n * export const POST = createAnalyticsHandler({\n * storage,\n * rateLimit: 100,\n * });\n *\n * export const GET = async () => {\n * const events = await storage.getAll();\n * return NextResponse.json({ events });\n * };\n * ```\n */\nexport function createAnalyticsHandler(options: AnalyticsHandlerOptions) {\n // Simple rate limiting state\n const requestCounts = new Map<string, { count: number; resetAt: number }>();\n\n return async function handler(request: NextRequest): Promise<NextResponse> {\n // CORS preflight\n if (request.method === 'OPTIONS') {\n return new NextResponse(null, {\n status: 204,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n },\n });\n }\n\n if (request.method !== 'POST') {\n return new NextResponse('Method Not Allowed', { status: 405 });\n }\n\n // Rate limiting\n if (options.rateLimit) {\n const clientIp = request.headers.get('x-forwarded-for') || 'unknown';\n const now = Date.now();\n const windowMs = 60000; // 1 minute window\n\n const clientData = requestCounts.get(clientIp) || { count: 0, resetAt: now + windowMs };\n\n if (now > clientData.resetAt) {\n clientData.count = 0;\n clientData.resetAt = now + windowMs;\n }\n\n clientData.count++;\n requestCounts.set(clientIp, clientData);\n\n if (clientData.count > options.rateLimit) {\n return new NextResponse('Rate limit exceeded', {\n status: 429,\n headers: {\n 'Retry-After': Math.ceil((clientData.resetAt - now) / 1000).toString(),\n },\n });\n }\n }\n\n try {\n const body = await request.json();\n const event: AnalyticsEvent = {\n action: body.action || 'copy',\n contentId: body.contentId,\n url: body.url || request.headers.get('referer'),\n timestamp: new Date().toISOString(),\n metadata: body.metadata,\n };\n\n await options.storage.save(event);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (options.cors) {\n headers['Access-Control-Allow-Origin'] = '*';\n }\n\n return NextResponse.json({ success: true, event }, { headers });\n } catch (error) {\n console.error('Analytics tracking error:', error);\n return NextResponse.json({ success: false, error: 'Failed to track event' }, { status: 500 });\n }\n };\n}\n\n/**\n * Create a Pages Router API handler for analytics\n */\nexport function createAnalyticsPageHandler(options: AnalyticsHandlerOptions) {\n return async function handler(\n req: {\n method?: string;\n body?: unknown;\n headers?: { [key: string]: string | string[] | undefined };\n },\n res: {\n status: (code: number) => {\n end: (body?: string) => void;\n json: (body: unknown) => void;\n };\n setHeader: (name: string, value: string) => void;\n }\n ): Promise<void> {\n if (req.method !== 'POST') {\n res.status(405).end('Method Not Allowed');\n return;\n }\n\n try {\n const body = req.body as Record<string, unknown>;\n const event: AnalyticsEvent = {\n action: (body?.action as AnalyticsEvent['action']) || 'copy',\n contentId: body?.contentId as string,\n url: (body?.url as string) || (req.headers?.referer as string),\n timestamp: new Date().toISOString(),\n metadata: body?.metadata as Record<string, unknown>,\n };\n\n await options.storage.save(event);\n\n if (options.cors) {\n res.setHeader('Access-Control-Allow-Origin', '*');\n }\n\n res.status(200).json({ success: true, event });\n } catch (error) {\n console.error('Analytics tracking error:', error);\n res.status(500).json({ success: false, error: 'Failed to track event' });\n }\n };\n}\n\n/**\n * Aggregate analytics events by action type\n */\nexport async function aggregateEvents(\n storage: AnalyticsStorageAdapter\n): Promise<Record<string, number>> {\n const events = await storage.getAll();\n const counts: Record<string, number> = {\n copy: 0,\n view: 0,\n download: 0,\n };\n\n for (const event of events) {\n if (event.action in counts) {\n counts[event.action]++;\n }\n }\n\n return counts;\n}\n\n/**\n * Get events for a specific content ID\n */\nexport async function getEventsForContent(\n storage: AnalyticsStorageAdapter,\n contentId: string\n): Promise<AnalyticsEvent[]> {\n const events = await storage.getAll();\n return events.filter((event) => event.contentId === contentId);\n}\n"]}