open-chat-studio-widget 0.4.7 → 0.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/app-globals-V2Kpy_OQ.js +8 -0
- package/dist/cjs/app-globals-V2Kpy_OQ.js.map +1 -0
- package/dist/cjs/{index-c9203be6.js → index-AhSI5tER.js} +329 -238
- package/dist/cjs/index-AhSI5tER.js.map +1 -0
- package/dist/cjs/index.cjs.js +1 -0
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +4 -5
- package/dist/cjs/loader.cjs.js.map +1 -1
- package/dist/cjs/open-chat-studio-widget.cjs.entry.js +3941 -3904
- package/dist/cjs/open-chat-studio-widget.cjs.entry.js.map +1 -1
- package/dist/cjs/open-chat-studio-widget.cjs.js +8 -7
- package/dist/cjs/open-chat-studio-widget.cjs.js.map +1 -1
- package/dist/cjs/open-chat-studio-widget.entry.cjs.js.map +1 -0
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/ocs-chat/ocs-chat.css +36 -0
- package/dist/collection/components/ocs-chat/ocs-chat.js +41 -20
- package/dist/collection/components/ocs-chat/ocs-chat.js.map +1 -1
- package/dist/components/index.js +2 -1
- package/dist/components/open-chat-studio-widget.js +3939 -3900
- package/dist/components/open-chat-studio-widget.js.map +1 -1
- package/dist/esm/app-globals-DQuL1Twl.js +6 -0
- package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
- package/dist/esm/{index-0349ca51.js → index-DkJ7OJTS.js} +327 -216
- package/dist/esm/index-DkJ7OJTS.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/loader.js +5 -4
- package/dist/esm/loader.js.map +1 -1
- package/dist/esm/open-chat-studio-widget.entry.js +3942 -3903
- package/dist/esm/open-chat-studio-widget.entry.js.map +1 -1
- package/dist/esm/open-chat-studio-widget.js +7 -5
- package/dist/esm/open-chat-studio-widget.js.map +1 -1
- package/dist/open-chat-studio-widget/index.esm.js.map +1 -1
- package/dist/open-chat-studio-widget/loader.esm.js.map +1 -0
- package/dist/open-chat-studio-widget/open-chat-studio-widget.entry.esm.js.map +1 -0
- package/dist/open-chat-studio-widget/open-chat-studio-widget.esm.js +1 -1
- package/dist/open-chat-studio-widget/open-chat-studio-widget.esm.js.map +1 -1
- package/dist/open-chat-studio-widget/p-DQuL1Twl.js +2 -0
- package/dist/open-chat-studio-widget/p-DQuL1Twl.js.map +1 -0
- package/dist/open-chat-studio-widget/p-DkJ7OJTS.js +3 -0
- package/dist/open-chat-studio-widget/p-DkJ7OJTS.js.map +1 -0
- package/dist/open-chat-studio-widget/p-bde68fbd.entry.js +4 -0
- package/dist/open-chat-studio-widget/p-bde68fbd.entry.js.map +1 -0
- package/dist/types/components/ocs-chat/ocs-chat.d.ts +5 -0
- package/dist/types/components.d.ts +20 -0
- package/dist/types/stencil-public-runtime.d.ts +35 -6
- package/package.json +2 -2
- package/dist/cjs/app-globals-3a1e7e63.js +0 -7
- package/dist/cjs/app-globals-3a1e7e63.js.map +0 -1
- package/dist/cjs/index-c9203be6.js.map +0 -1
- package/dist/esm/app-globals-0f993ce5.js +0 -5
- package/dist/esm/app-globals-0f993ce5.js.map +0 -1
- package/dist/esm/index-0349ca51.js.map +0 -1
- package/dist/open-chat-studio-widget/p-3dc66a9a.js +0 -3
- package/dist/open-chat-studio-widget/p-3dc66a9a.js.map +0 -1
- package/dist/open-chat-studio-widget/p-6b9a332c.entry.js +0 -4
- package/dist/open-chat-studio-widget/p-6b9a332c.entry.js.map +0 -1
- package/dist/open-chat-studio-widget/p-e1255160.js +0 -2
- package/dist/open-chat-studio-widget/p-e1255160.js.map +0 -1
- package/loader/package.json +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ocs-chat.js","sourceRoot":"","sources":["../../../src/components/ocs-chat/ocs-chat.tsx"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,OAAO,EAAC,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAC,MAAM,eAAe,CAAC;AAC9E,OAAO,EACL,SAAS,EACT,oBAAoB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,oBAAoB,EACrF,aAAa,EAAE,iBAAiB,EAAE,KAAK,EACxC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqEhD,MAAM,OAAO,OAAO;IALpB;QA6BE;;WAEG;QACK,eAAU,GAAY,6BAA6B,CAAC;QAY5D;;WAEG;QACK,gBAAW,GAAuB,QAAQ,CAAC;QAOnD;;WAEG;QACK,+BAA0B,GAAY,qEAAqE,CAAC;QAEpH;;WAEG;QACsB,YAAO,GAAY,KAAK,CAAC;QAElD;;WAEG;QACsB,aAAQ,GAAgC,OAAO,CAAC;QAoBzE;;WAEG;QACK,sBAAiB,GAAY,IAAI,CAAC;QAE1C;;;WAGG;QACK,4BAAuB,GAAW,EAAE,GAAG,EAAE,CAAC;QAElD;;WAEG;QACK,oBAAe,GAAY,IAAI,CAAC;QAExC;;WAEG;QACK,qBAAgB,GAAY,KAAK,CAAC;QAE1C;;WAEG;QACK,wBAAmB,GAAY,oBAAoB,CAAC;QAEnD,UAAK,GAAW,EAAE,CAAC;QACnB,aAAQ,GAAkB,EAAE,CAAC;QAE7B,cAAS,GAAY,KAAK,CAAC;QAC3B,aAAQ,GAAY,KAAK,CAAC;QAC1B,iBAAY,GAAW,EAAE,CAAC;QAC1B,sBAAiB,GAAW,EAAE,CAAC;QAC/B,eAAU,GAAY,KAAK,CAAC;QAC5B,eAAU,GAA6B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACtD,mBAAc,GAA6B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1D,uBAAkB,GAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7C,0BAAqB,GAAa,EAAE,CAAC;QACrC,2BAAsB,GAAa,EAAE,CAAC;QAEtC,iBAAY,GAAY,KAAK,CAAC;QAC9B,4BAAuB,GAAY,KAAK,CAAC;QAEzC,kBAAa,GAAmB,EAAE,CAAC;QACnC,qBAAgB,GAAY,KAAK,CAAC;QAOnC,qBAAgB,GAAW,GAAG,CAAC;QAC/B,oBAAe,GAAW,GAAG,CAAC;QAC9B,8BAAyB,GAAW,IAAI,CAAC;QACzC,wBAAmB,GAAY,KAAK,CAAC;QAktBrC,oBAAe,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACpD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,iBAAiB;gBAAE,OAAO;YAChF,IAAK,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAE5D,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC,CAAC;QAEM,oBAAe,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACpD,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC,CAAC;QAEM,kBAAa,GAAG,GAAS,EAAE;YACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC;QAEM,qBAAgB,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACrD,IAAK,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO;YAC5D,IAAI,CAAC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC,CAAC;QAEM,oBAAe,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACpD,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACjC,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC,CAAC;QAEM,mBAAc,GAAG,GAAS,EAAE;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC;QAEM,uBAAkB,GAAG,GAAS,EAAE;YACtC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC,CAAC;KA2dH;IA3tCC,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC;YACtC,OAAO;QACT,CAAC;QACD,mEAAmE;QACnE,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YAC7D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9D,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,gBAAgB;QACd,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,aAAa,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC;QAC/E,MAAM,cAAc,GAAG,aAAa,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;QAC7E,MAAM,kBAAkB,GAAG,aAAa,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,CAAC;QAC5F,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChG,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5F,IAAI,CAAC,yBAAyB,GAAG,WAAW,CAAC,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACpH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;QAED,2DAA2D;QAC3D,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,sCAAsC;YACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7D,CAAC;IAED,oBAAoB;QAClB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAChE,CAAC;IAEO,eAAe,CAAC,SAAiB;QACvC,MAAM,YAAY,GAAgB;YAChC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,cAAc,SAAS,qBAAqB;YACrD,WAAW,EAAE,EAAE;SAChB,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAEO,WAAW,CAAC,SAAiB;QACnC,yBAAyB;QACzB,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhC,kCAAkC;QAClC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEO,aAAa,CAAC,SAA6B,EAAE,QAAgB;QACnE,IAAI,CAAC;YACH,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;gBAAC,WAAM,CAAC;oBACP,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAChD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,mBAAmB,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAC5F,CAAC;IAEO,qBAAqB;QAC3B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAC/F,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IACnD,CAAC;IAEO,aAAa;QACnB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC;QACrC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE1C,MAAM,WAAW,GAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,SAAS;gBAC1B,YAAY,EAAE;oBACZ,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;iBAC/B;gBACD,qBAAqB,EAAE,MAAM;aAC9B,CAAC;YAEF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,WAAW,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,kBAAkB,EAAE;gBACtE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE;gBAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,IAAI,CAAC,WAAW,CAAC,4BAA4B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAA6B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;YACjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAE5B,iCAAiC;YACjC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAE,yCAAyC;gBAChE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC;gBACnD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChC,CAAC;YAED,6BAA6B;YAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,yBAAyB,CAAC,YAAoB;QACpD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC/C,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAC9B,uCAAY,EAAE,KAAE,KAAK,EAAE,YAAY,IAAG;YACxC,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAEhC,6BAA6B;YAC7B,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC9C,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;oBAClD,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC9C,CAAC;qBAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;oBACjC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC1C,QAAQ,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;YAED,qCAAqC;YACrC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,IAAI,CAAC,SAAS,UAAU,EAAE;oBACzF,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxC,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,IAAI,wBAAwB,CAAC;oBACjE,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;oBAC7C,OAAO,WAAW,CAAC;gBACrB,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,4CAA4C;gBAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;oBAC/C,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;wBAC9B,uCAAY,EAAE,KAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,IAAG;oBACtD,CAAC;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;YACvF,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;YAC7C,OAAO,WAAW,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,OAAe;QACvC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,OAAO;QAE/C,IAAI,CAAC;YACH,IAAI,aAAa,GAAa,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3D,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;gBAEzC,sDAAsD;gBACtD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC1D,IAAI,SAAS,EAAE,CAAC;oBACd,yDAAyD;oBACzD,IAAI,CAAC,WAAW,CAAC,+DAA+D,CAAC,CAAC;oBAClF,OAAO;gBACT,CAAC;YACH,CAAC;YAED,oEAAoE;YACpE,iDAAiD;YACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,eAAe,GAAkB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC5F,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;oBACtG,IAAI,EAAE,WAAoB;oBAC1B,OAAO,EAAE,UAAU;oBACnB,WAAW,EAAE,EAAE;iBAChB,CAAC,CAAC,CAAC;gBACJ,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,eAAe,CAAC,CAAC;YACzD,CAAC;YAED,qDAAqD;YACrD,MAAM,WAAW,GAAgB;gBAC/B,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACpC,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;gBACvB,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa;qBACpD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC;qBACtC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACV,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;oBAClB,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;oBAC1B,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;iBACnB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;aACX,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAChD,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,qCAAqC;YAChE,CAAC;YACD,IAAI,CAAC,cAAc,EAAE,CAAC;YAEtB,+DAA+D;YAC/D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,MAAM,WAAW,GAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,gBAAgB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtD,WAAW,CAAC,cAAc,GAAG,aAAa,CAAC;YAC7C,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,IAAI,CAAC,SAAS,WAAW,EAAE;gBAC1F,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE;gBAC7B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,MAAM,IAAI,GAA4B,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE5D,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAC;YAC1D,CAAC;YAED,+EAA+E;YAC/E,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC;YACtC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;YACpF,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,0BAA0B,CAAC,QAAgB;QACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAEvD,oDAAoD;QACpD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,iBAAiB;gBAAE,OAAO;YAEvD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,QAAQ,CAAC,CAAC;gBAEnH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;gBACjE,CAAC;gBAED,MAAM,IAAI,GAAyB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEzD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;gBAED,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC/C,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACjD,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;oBACtB,2EAA2E;oBAC3E,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;oBACtB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;oBAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,OAAO;gBACT,CAAC;gBAED,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,IAAI,QAAQ,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC;oBACjF,QAAQ,EAAE,CAAC;oBACX,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBACrD,CAAC;qBAAM,IAAI,QAAQ,IAAI,OAAO,CAAC,yBAAyB,EAAE,CAAC;oBACzD,kEAAkE;oBAClE,MAAM,cAAc,GAAgB;wBAClC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACpC,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,4HAA4H;wBACrI,WAAW,EAAE,EAAE;qBAChB,CAAC;oBACF,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;oBACnD,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;oBAEtB,oDAAoD;oBACpD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;oBACtB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;oBAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC;gBACpF,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;gBAC5B,kCAAkC;gBAClC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAEpC,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC/C,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC1C,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,wDAAwD;QACxD,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAC;YAChF,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE7C,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,CAAC,4BAA4B;YAEtD,MAAM,IAAI,GAAqB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAErD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrD,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,WAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC;YACnE,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9B,CAAC;IAEO,UAAU;QAChB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,CAAC;IAEO,cAAc,CAAC,KAAoB;QACzC,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAY;QACpC,IAAI,CAAC,YAAY,GAAI,KAAK,CAAC,MAA8B,CAAC,KAAK,CAAC;IAClE,CAAC;IAEO,gBAAgB,CAAC,KAAY;;QACnC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAEnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErD,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,GAAG,IAAG,MAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,0CAAE,WAAW,EAAE,CAAA,CAAC;YAC5D,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,KAAK,EAAE,aAAa,GAAG,gBAAgB;iBACxC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC7C,IAAI,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC1C,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,KAAK,EAAE,gBAAgB,OAAO,CAAC,gBAAgB,UAAU;iBAC1D,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC9C,IAAI,WAAW,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI;oBACJ,KAAK,EAAE,sBAAsB,OAAO,CAAC,iBAAiB,UAAU;iBACjE,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC1D,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACtC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;IACxE,CAAC;IAEO,cAAc,CAAC,KAAa;QAClC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC;QAEf,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,4BAA4B;YAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,UAAkB;QACnC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IAEH,KAAK,CAAC,iBAAiB,CAAC,OAAgB;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC;aAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,QAAqC;QAC/C,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,kBAAkB;QAChB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,wBAAwB,CAAC;QAClC,CAAC;QACD,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,WAAW,GAAG,aAAa,CAAC;IACrC,CAAC;IAEO,mBAAmB;QACzB,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACtC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAEtD,OAAO,CAAC,GAAG,CAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,CAAE,CAAA;QACjE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAChE,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAErD,OAAO;gBACL,IAAI,EAAE,GAAG,MAAM,IAAI;gBACnB,GAAG,EAAE,KAAK;gBACV,SAAS,EAAE,MAAM;aAClB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI;YAClC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI;SAClC,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAEhC,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;QACtC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;QACxC,MAAM,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QAC/F,MAAM,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAEzD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,MAAM;gBACT,IAAI,CAAC,cAAc,GAAG;oBACpB,CAAC,EAAE,OAAO,CAAC,aAAa;oBACxB,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,aAAa;iBAChE,CAAC;gBACF,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,cAAc,GAAG;oBACpB,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,aAAa;oBAClD,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,aAAa;iBAChE,CAAC;gBACF,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,cAAc,GAAG;oBACpB,CAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC;oBAChC,CAAC,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;iBAC9C,CAAC;gBACF,MAAM;QACV,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,KAA8B;QAC1D,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5D,CAAC;aAAM,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,SAAS,CAAC,OAAqB;QACrC,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAEhC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,qDAAqD;YACrD,IAAI,CAAC,UAAU,GAAG;gBAChB,CAAC,EAAE,OAAO,CAAC,OAAO;gBAClB,CAAC,EAAE,OAAO,CAAC,OAAO;aACnB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;YACxD,IAAI,CAAC,UAAU,GAAG;gBAChB,CAAC,EAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;gBAC9B,CAAC,EAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;aAC9B,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,OAAqB;QAC9C,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE7B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,gDAAgD;YAChD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAEjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,kBAAkB,GAAG;gBACxB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;aACrD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAEjD,8BAA8B;YAC9B,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;YACtC,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;YACxC,MAAM,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;YAC/F,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;YAEnD,IAAI,CAAC,cAAc,GAAG;gBACpB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;gBACvD,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC,CAAC;aAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEO,iBAAiB;QACvB,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7D,CAAC;IAEO,oBAAoB;QAC1B,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAChE,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAChE,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAChE,CAAC;IAsDO,iBAAiB;QACvB,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,qCAAqC,CAAC;IACtE,CAAC;IAEO,gBAAgB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAEO,YAAY;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxE,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CACL,cACE,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,gBAChC,eAAe,IAAI,CAAC,UAAU,EAAE,EAC5C,KAAK,EAAE,IAAI,CAAC,UAAU;gBAEtB,WAAK,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,EAAE,GAAG;gBAC5B,gBAAO,IAAI,CAAC,UAAU,CAAQ,CACvB,CACV,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CACL,cACE,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,gBACjC,WAAW,EACtB,KAAK,EAAC,WAAW;gBAEjB,WAAK,GAAG,EAAE,OAAO,EAAE,GAAG,EAAC,MAAM,GAAG,CACzB,CACV,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,OAAO;YACL,SAAS,EAAE,oBAAoB,IAAI,CAAC,SAAS,EAAE;YAC/C,QAAQ,EAAE,qBAAqB,IAAI,CAAC,SAAS,EAAE;YAC/C,YAAY,EAAE,qBAAqB,IAAI,CAAC,SAAS,EAAE;SACpD,CAAC;IACJ,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,uBAAuB,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7D,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;oBAChD,MAAM,oBAAoB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;oBACrF,IAAI,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;wBACxD,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBAC3B,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAC,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;YAEhE,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAI,QAAQ,GAAkB,EAAE,CAAC;YAEjC,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBAChD,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,CAAC;gBAAC,OAAO,UAAU,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,UAAU,CAAC,CAAC;oBACxE,QAAQ,GAAG,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;YAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,sEAAsE,EAAE,KAAK,CAAC,CAAC;YAC5F,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,eAAe,CAAC;QAC9B,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC;QACjC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,YAAY,EAAE,CAAC;QACtD,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAE5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,mBAAmB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAEO,uBAAuB;QAC7B,IAAI,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;YAC5D,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;IACtC,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;QACvC,0CAA0C;QAC1C,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACrC,CAAC;IAED,MAAM;QACJ,qFAAqF;QACrF,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,OAAO,CACL,EAAC,IAAI;gBACH,SAAG,KAAK,EAAC,eAAe,IAAE,IAAI,CAAC,KAAK,CAAK,CACpC,CACR,CAAC;QACJ,CAAC;QAED,OAAO,CACL,EAAC,IAAI;YACF,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,OAAO,IAAI,CACf,WACE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,EACpC,EAAE,EAAC,iBAAiB,EACpB,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAChC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE;gBAG/B,WACE,KAAK,EAAE,eAAe,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,uBAAuB,EAAE,EAC1F,WAAW,EAAE,IAAI,CAAC,eAAe,EACjC,YAAY,EAAE,IAAI,CAAC,gBAAgB;oBAGnC,WAAK,KAAK,EAAC,gBAAgB;wBACzB,WAAK,KAAK,EAAC,yBAAyB;4BAClC,EAAC,oBAAoB,OAAE,CACnB,CACF;oBACN,WAAK,KAAK,EAAC,aAAa,IAAE,IAAI,CAAC,UAAU,CAAO;oBAChD,WAAK,KAAK,EAAC,gBAAgB;wBAExB,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3B,cACE,KAAK,EAAC,eAAe,EACrB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAC5C,KAAK,EAAC,gBAAgB,gBACX,gBAAgB;4BAE3B,EAAC,kBAAkB,OAAE,CACd,CACV;wBAEA,IAAI,CAAC,eAAe,IAAI,cACvB,KAAK,EAAC,iCAAiC,EACvC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EACtC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,gBACrD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,IAErE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAC,oBAAoB,OAAE,CAAC,CAAC,CAAC,EAAC,qBAAqB,OAAE,CAChE;wBACT,cACE,KAAK,EAAC,eAAe,EACrB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,gBACxB,OAAO;4BAElB,EAAC,SAAS,OAAE,CACL,CACL,CACF;gBAEL,IAAI,CAAC,uBAAuB,IAAI,CAC/B,WAAK,KAAK,EAAC,sBAAsB;oBAC/B,WAAK,KAAK,EAAC,qBAAqB;wBAC9B,WAAK,KAAK,EAAC,sBAAsB;4BAC/B,UAAI,KAAK,EAAC,oBAAoB,qBAAoB;4BAClD,SAAG,KAAK,EAAC,sBAAsB,IAC5B,IAAI,CAAC,0BAA0B,CAC9B;4BACJ,WAAK,KAAK,EAAC,sBAAsB;gCAC/B,cACE,KAAK,EAAC,gDAAgD,EACtD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,aAGrC;gCACT,cACE,KAAK,EAAC,iDAAiD,EACvD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,eAG7B,CACL,CACF,CACF,CACF,CACP;gBAGD,WAAK,KAAK,EAAC,cAAc;oBAEtB,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CACpC,WAAK,KAAK,EAAC,mBAAmB;wBAC5B,WAAK,KAAK,EAAC,iBAAiB,GAAO;wBACnC,YAAM,KAAK,EAAC,cAAc,uBAAwB,CAC9C,CACP;oBAGA,CACC,WACE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,EACrC,KAAK,EAAC,oBAAoB;wBAEzB,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,IAAI,CACtE,WAAK,KAAK,EAAC,kBAAkB,IAE1B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAClD,WAAK,GAAG,EAAE,WAAW,KAAK,EAAE,EAAE,KAAK,EAAC,mCAAmC;4BACrE,WAAK,KAAK,EAAC,yCAAyC;gCAClD,WACE,KAAK,EAAC,eAAe,EACrB,SAAS,EAAE,sBAAsB,CAAC,OAAO,CAAC,GACrC,CACH,CACF,CACP,CAAC,CACE,CACP;wBAEA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CACrC,WACE,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,eACL,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,uBACjD,EAAE;4BAEF,WACE,KAAK,EAAE,kBACL,OAAO,CAAC,IAAI,KAAK,MAAM;oCACrB,CAAC,CAAC,qBAAqB;oCACvB,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;wCAC9B,CAAC,CAAC,0BAA0B;wCAC5B,CAAC,CAAC,uBACN,EAAE;gCAEF,WACE,KAAK,EAAC,eAAe,EACrB,SAAS,EAAE,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,GAC7C;gCACN,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CACxD,WAAK,KAAK,EAAC,qBAAqB,IAC7B,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,eAAe,EAAE,EAAE,CAAC,CACxD,WAAK,GAAG,EAAE,eAAe,EAAE,KAAK,EAAC,+BAA+B;oCAC9D,YAAM,KAAK,EAAC,yBAAyB;wCACnC,EAAC,aAAa,OAAG,CACZ;oCACP,YAAM,KAAK,EAAC,yBAAyB,IAAE,UAAU,CAAC,IAAI,CAAQ,CAC1D,CACP,CAAC,CACE,CACP;gCACD,WAAK,KAAK,EAAC,mBAAmB,IAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAChC,CACF,CACF,CACP,CAAC;wBAED,IAAI,CAAC,QAAQ,IAAI,CAChB;4BACE,WAAK,KAAK,EAAC,kBAAkB;gCAC3B,WAAK,KAAK,EAAC,iBAAiB,GAAO,CAC/B;4BACN,WAAK,KAAK,EAAC,aAAa;gCACtB,gBAAO,IAAI,CAAC,mBAAmB,CAAQ;gCACvC,YAAM,KAAK,EAAC,aAAa,GAAQ,CAC7B,CACF,CACP,CACG,CACP;oBAGA,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,IAAI,CACvE,WAAK,KAAK,EAAC,mBAAmB,IAC3B,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CACpD,WAAK,GAAG,EAAE,WAAW,KAAK,EAAE,EAAE,KAAK,EAAC,sBAAsB;wBACxD,cACE,KAAK,EAAC,kBAAkB,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,IAEvD,QAAQ,CACF,CACL,CACP,CAAC,CACE,CACP;oBAGA,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CACzD,WAAK,KAAK,EAAC,0BAA0B;wBACnC,WAAK,KAAK,EAAC,kBAAkB,IAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAC/C,WAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAC,oBAAoB;4BACzC,WAAK,KAAK,EAAC,+BAA+B;gCACxC,YAAM,KAAK,EAAC,oBAAoB;oCAC9B,EAAC,aAAa,OAAE,CACX;gCACP,gBAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAQ;gCACrC,YAAM,KAAK,EAAC,oBAAoB;;oCAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;wCAAS;gCACtF,YAAY,CAAC,KAAK,IAAI,CACrB,YAAM,KAAK,EAAC,qBAAqB,IAAE,YAAY,CAAC,KAAK,CAAQ,CAC9D;gCACA,YAAY,CAAC,QAAQ,IAAI,CACxB,YAAM,KAAK,EAAC,4BAA4B;oCAAC,EAAC,iBAAiB,OAAG,CAAO,CACtE,CACG;4BACN,cACE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAC7C,KAAK,EAAC,6BAA6B,gBACxB,aAAa;gCACzB,EAAC,KAAK,OAAG,CACD,CACL,CACP,CAAC,CACE,CACF,CACP;oBAGA,IAAI,CAAC,SAAS,IAAI,CACjB,WAAK,KAAK,EAAC,YAAY;wBACrB,WAAK,KAAK,EAAC,iBAAiB;4BAC1B,gBACE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,EAClC,KAAK,EAAC,kBAAkB,EACxB,IAAI,EAAE,CAAC,EACP,WAAW,EAAC,sBAAsB,EAClC,KAAK,EAAE,IAAI,CAAC,YAAY,EACxB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EACzC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,GACtC;4BAEX,IAAI,CAAC,gBAAgB,IAAI,CACxB,aACE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;oCACR,8EAA8E;oCAC9E,IAAI,EAAE,EAAE,CAAC;wCAAA,IAAI,CAAC,YAAY,GAAG,EAAE,CAAA;oCAAA,CAAC;gCAClC,CAAC,EAEH,EAAE,EAAC,gBAAgB,EACnB,IAAI,EAAC,MAAM,EACX,QAAQ,QACR,MAAM,EAAE,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,EACnD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EACzC,KAAK,EAAC,QAAQ,GACd,CACH;4BACA,IAAI,CAAC,gBAAgB,IAAI,CACxB,cACE,KAAK,EAAC,wBAAwB,EAC9B,OAAO,EAAE,GAAG,EAAE,WAAC,OAAA,MAAA,IAAI,CAAC,YAAY,0CAAE,KAAK,EAAE,CAAA,EAAA,EACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAChD,KAAK,EAAC,cAAc,gBACT,cAAc;gCAEzB,EAAC,aAAa,OAAG,CACV,CACV;4BACD,cACE,KAAK,EAAE,eACL,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;oCAC1C,CAAC,CAAC,qBAAqB;oCACvB,CAAC,CAAC,sBACN,EAAE,EACF,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,EAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAE5E,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CACzC,CACL,CACF,CACP;oBACD,WAAK,KAAK,EAAC,yFAAyF;wBAClG;;4BAAc,SAAG,KAAK,EAAC,WAAW,EAAC,IAAI,EAAC,wBAAwB,EAAC,MAAM,EAAC,QAAQ,aAAW,CAAI,CAC3F,CACF,CACF,CACP,CACI,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAp2CuB,iCAAyB,GAAG,GAAG,AAAN,CAAO;AAChC,gCAAwB,GAAG,IAAI,AAAP,CAAQ;AAChC,mCAA2B,GAAG,KAAK,AAAR,CAAS;AAEpC,uBAAe,GAAG,GAAG,AAAN,CAAO;AACtB,sBAAc,GAAG,GAAG,AAAN,CAAO;AAErB,yBAAiB,GAAG,GAAG,AAAN,CAAO;AACxB,qBAAa,GAAG,EAAE,AAAL,CAAM;AAEnB,6BAAqB,GAAG,cAAc,AAAjB,CAAkB;AAEvC,wBAAgB,GAAG,EAAE,AAAL,CAAM;AACtB,yBAAiB,GAAG,EAAE,AAAL,CAAM;AACvB,iCAAyB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAC5H,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAE,AADlC,CACmC","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport {Component, Host, h, Prop, State, Element, Watch} from '@stencil/core';\nimport {\n XMarkIcon,\n GripDotsVerticalIcon, PlusWithCircleIcon, ArrowsPointingOutIcon, ArrowsPointingInIcon,\n PaperClipIcon, CheckDocumentIcon, XIcon\n} from './heroicons';\nimport { renderMarkdownSync as renderMarkdownComplete } from '../../utils/markdown';\nimport { getCSRFToken } from '../../utils/cookies';\nimport { varToPixels } from '../../utils/utils';\n\ninterface ChatMessage {\n created_at: string;\n role: 'system' | 'user' | 'assistant';\n content: string;\n metadata?: any;\n attachments?: ChatAttachment[];\n}\n\ninterface ChatAttachment {\n name: string;\n content_type: string;\n size: number;\n}\n\ninterface UploadedFile {\n id: number;\n name: string;\n size: number;\n content_type: string;\n}\n\ninterface SelectedFile {\n file: File;\n uploaded?: UploadedFile;\n error?: string;\n}\n\ninterface ChatStartSessionResponse {\n session_id: string;\n chatbot: any;\n participant: any;\n seed_message_task_id?: string;\n}\n\ninterface ChatSendMessageResponse {\n task_id: string;\n status: 'processing' | 'completed' | 'error';\n error?: string;\n}\n\ninterface ChatTaskPollResponse {\n message?: ChatMessage;\n status: 'processing' | 'complete';\n error?: string;\n}\n\ninterface ChatPollResponse {\n messages: ChatMessage[];\n has_more: boolean;\n session_status: 'active' | 'ended';\n}\n\ninterface PointerEvent {\n clientX: number;\n clientY: number;\n}\n\ninterface SessionStorageData {\n sessionId?: string;\n messages: ChatMessage[];\n}\n\n@Component({\n tag: 'open-chat-studio-widget',\n styleUrl: 'ocs-chat.css',\n shadow: true,\n})\nexport class OcsChat {\n\n private static readonly TASK_POLLING_MAX_ATTEMPTS = 120;\n private static readonly TASK_POLLING_INTERVAL_MS = 1000;\n private static readonly MESSAGE_POLLING_INTERVAL_MS = 30000;\n\n private static readonly SCROLL_DELAY_MS = 100;\n private static readonly FOCUS_DELAY_MS = 100;\n\n private static readonly MOBILE_BREAKPOINT = 640;\n private static readonly WINDOW_MARGIN = 20;\n\n private static readonly LOCALSTORAGE_TEST_KEY = '__ocs_test__';\n\n private static readonly MAX_FILE_SIZE_MB = 50;\n private static readonly MAX_TOTAL_SIZE_MB = 50;\n private static readonly SUPPORTED_FILE_EXTENSIONS = ['.txt', '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.csv', '.jpg', '.jpeg',\n '.png', '.gif', '.bmp', '.webp', '.svg', '.mp4', '.mov', '.avi', '.mp3', '.wav' ];\n\n /**\n * The ID of the chatbot to connect to.\n */\n @Prop() chatbotId!: string;\n\n /**\n * The base URL for the API (defaults to current origin).\n */\n @Prop() apiBaseUrl?: string = \"https://chatbots.dimagi.com\";\n\n /**\n * The text to display on the button.\n */\n @Prop() buttonText?: string;\n\n /**\n * URL of the icon to display on the button. If not provided, uses the default OCS logo.\n */\n @Prop() iconUrl?: string;\n\n /**\n * The shape of the chat button. 'round' makes it circular, 'square' keeps it rectangular.\n */\n @Prop() buttonShape: 'round' | 'square' = 'square';\n\n /**\n * The text to place in the header.\n */\n @Prop() headerText: '';\n\n /**\n * The message to display in the new chat confirmation dialog.\n */\n @Prop() newChatConfirmationMessage?: string = \"Starting a new chat will clear your current conversation. Continue?\";\n\n /**\n * Whether the chat widget is visible on load.\n */\n @Prop({ mutable: true }) visible: boolean = false;\n\n /**\n * The initial position of the chat widget on the screen.\n */\n @Prop({ mutable: true }) position: 'left' | 'center' | 'right' = 'right';\n\n /**\n * Welcome messages to display above starter questions (JSON array of strings)\n */\n @Prop() welcomeMessages?: string;\n\n /**\n * Array of starter questions that users can click to send (JSON array of strings)\n */\n @Prop() starterQuestions?: string;\n\n /**\n * Used to associate chat sessions with a specific user across multiple visits/sessions\n */\n @Prop() userId?: string;\n /**\n * Display name for the user.\n */\n @Prop() userName?: string;\n /**\n * Whether to persist session data to local storage to allow resuming previous conversations after page reload.\n */\n @Prop() persistentSession: boolean = true;\n\n /**\n * Minutes since the most recent message after which the session data in local storage will expire. Set this to\n * `0` to never expire.\n */\n @Prop() persistentSessionExpire: number = 60 * 24;\n\n /**\n * Allow the user to make the chat window full screen.\n */\n @Prop() allowFullScreen: boolean = true;\n\n /**\n * Allow the user to attach files to their messages.\n */\n @Prop() allowAttachments: boolean = false;\n\n /**\n * The text to display while the assistant is typing/preparing a response.\n */\n @Prop() typingIndicatorText?: string = \"Preparing response\";\n\n @State() error: string = \"\";\n @State() messages: ChatMessage[] = [];\n @State() sessionId?: string;\n @State() isLoading: boolean = false;\n @State() isTyping: boolean = false;\n @State() messageInput: string = \"\";\n @State() currentPollTaskId: string = \"\";\n @State() isDragging: boolean = false;\n @State() dragOffset: { x: number; y: number } = { x: 0, y: 0 };\n @State() windowPosition: { x: number; y: number } = { x: 0, y: 0 };\n @State() fullscreenPosition: { x: number } = { x: 0 };\n @State() parsedWelcomeMessages: string[] = [];\n @State() parsedStarterQuestions: string[] = [];\n @State() generatedUserId?: string;\n @State() isFullscreen: boolean = false;\n @State() showNewChatConfirmation: boolean = false;\n\n @State() selectedFiles: SelectedFile[] = [];\n @State() isUploadingFiles: boolean = false;\n\n private pollingIntervalRef?: any;\n private messageListRef?: HTMLDivElement;\n private textareaRef?: HTMLTextAreaElement;\n private chatWindowRef?: HTMLDivElement;\n private fileInputRef?: HTMLInputElement;\n private chatWindowHeight: number = 600;\n private chatWindowWidth: number = 450;\n private chatWindowFullscreenWidth: number = 1024;\n private positionInitialized: boolean = false;\n @Element() host: HTMLElement;\n\n\n componentWillLoad() {\n if (!this.chatbotId) {\n this.error = 'Chatbot ID is required';\n return;\n }\n // Always try to load existing session if localStorage is available\n if (this.persistentSession && this.isLocalStorageAvailable()) {\n const { sessionId, messages } = this.loadSessionFromStorage();\n if (sessionId && messages) {\n this.sessionId = sessionId;\n this.messages = messages;\n }\n }\n this.parseWelcomeMessages();\n this.parseStarterQuestions();\n }\n\n componentDidLoad() {\n const computedStyle = getComputedStyle(this.host);\n const windowHeightVar = computedStyle.getPropertyValue('--chat-window-height');\n const windowWidthVar = computedStyle.getPropertyValue('--chat-window-width');\n const fullscreenWidthVar = computedStyle.getPropertyValue('--chat-window-fullscreen-width');\n this.chatWindowHeight = varToPixels(windowHeightVar, window.innerHeight, this.chatWindowHeight);\n this.chatWindowWidth = varToPixels(windowWidthVar, window.innerWidth, this.chatWindowWidth);\n this.chatWindowFullscreenWidth = varToPixels(fullscreenWidthVar, window.innerWidth, this.chatWindowFullscreenWidth);\n if (this.visible) {\n this.initializePosition();\n }\n\n // Only auto-start session if we don't have an existing one\n if (this.visible && !this.sessionId) {\n this.startSession();\n } else if (this.visible && this.sessionId) {\n // Resume polling for existing session\n this.startPolling();\n }\n window.addEventListener('resize', this.handleWindowResize);\n }\n\n disconnectedCallback() {\n this.cleanup();\n this.removeEventListeners();\n window.removeEventListener('resize', this.handleWindowResize);\n }\n\n private addErrorMessage(errorText: string): void {\n const errorMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: `**Error:** ${errorText}\\nPlease try again.`,\n attachments: []\n };\n\n this.messages = [...this.messages, errorMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n }\n\n private handleError(errorText: string): void {\n // show as system message\n this.addErrorMessage(errorText);\n\n // Clear any loading/typing states\n this.isLoading = false;\n this.isTyping = false;\n this.isUploadingFiles = false;\n this.currentPollTaskId = '';\n }\n\n private parseJSONProp(propValue: string | undefined, propName: string): string[] {\n try {\n if (propValue) {\n try {\n return JSON.parse(propValue);\n } catch {\n const fixedValue = propValue.replace(/'/g, '\"');\n return JSON.parse(fixedValue);\n }\n }\n } catch (error) {\n console.warn(`Failed to parse ${propName}:`, error);\n }\n return [];\n }\n\n private parseWelcomeMessages() {\n this.parsedWelcomeMessages = this.parseJSONProp(this.welcomeMessages, 'welcome messages');\n }\n\n private parseStarterQuestions() {\n this.parsedStarterQuestions = this.parseJSONProp(this.starterQuestions, 'starter questions');\n }\n\n private cleanup() {\n if (this.pollingIntervalRef) {\n clearInterval(this.pollingIntervalRef);\n this.pollingIntervalRef = undefined;\n }\n this.currentPollTaskId = '';\n }\n\n private getApiBaseUrl(): string {\n return this.apiBaseUrl || window.location.origin;\n }\n\n private getApiHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const csrfToken = getCSRFToken(this.getApiBaseUrl());\n if (csrfToken) {\n headers['X-CSRFToken'] = csrfToken;\n }\n\n return headers;\n }\n\n private async startSession(): Promise<void> {\n try {\n this.isLoading = true;\n\n const userId = this.getOrGenerateUserId();\n\n const requestBody: any = {\n chatbot_id: this.chatbotId,\n session_data: {\n source: 'widget',\n page_url: window.location.href\n },\n participant_remote_id: userId\n };\n\n if (this.userName) {\n requestBody.participant_name = this.userName;\n }\n\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/start/`, {\n method: 'POST',\n headers: this.getApiHeaders(),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n this.handleError(`Failed to start session: ${response.statusText}`);\n return;\n }\n\n const data: ChatStartSessionResponse = await response.json();\n this.sessionId = data.session_id;\n this.saveSessionToStorage();\n\n // Handle seed message if present\n if (data.seed_message_task_id) {\n this.isTyping = true; // Show typing indicator for seed message\n this.currentPollTaskId = data.seed_message_task_id;\n await this.pollTaskResponse();\n }\n\n // Start polling for messages\n this.startPolling();\n } catch (error) {\n this.handleError('Failed to start chat session');\n } finally {\n this.isLoading = false;\n }\n }\n\n private markPendingFilesWithError(errorMessage: string): void {\n this.selectedFiles = this.selectedFiles.map(sf => {\n if (!sf.error && !sf.uploaded) {\n return { ...sf, error: errorMessage };\n }\n return sf;\n });\n }\n\n private async uploadFiles(): Promise<number[]> {\n if (this.selectedFiles.length === 0 || !this.sessionId || !this.allowAttachments) {\n return [];\n }\n\n this.isUploadingFiles = true;\n const uploadedIds: number[] = [];\n\n try {\n const formData = new FormData();\n\n // Add all files to form data\n for (const selectedFile of this.selectedFiles) {\n if (!selectedFile.error && !selectedFile.uploaded) {\n formData.append('files', selectedFile.file);\n } else if (selectedFile.uploaded) {\n uploadedIds.push(selectedFile.uploaded.id);\n }\n }\n\n // Add user ID and name to the form data\n const userId = this.getOrGenerateUserId();\n formData.append('participant_remote_id', userId);\n if (this.userName) {\n formData.append('participant_name', this.userName);\n }\n\n // Only upload if there are new files\n if (formData.has('files')) {\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/upload/`, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n const errorMessage = errorData.error || 'Failed to upload files';\n this.markPendingFilesWithError(errorMessage);\n return uploadedIds;\n }\n\n const data = await response.json();\n\n // Update selected files with upload results\n let fileIndex = 0;\n this.selectedFiles = this.selectedFiles.map(sf => {\n if (!sf.error && !sf.uploaded) {\n return { ...sf, uploaded: data.files[fileIndex++] };\n }\n return sf;\n });\n uploadedIds.push(...data.files.map((f: UploadedFile) => f.id));\n }\n\n return uploadedIds;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to upload files';\n this.markPendingFilesWithError(errorMessage);\n return uploadedIds;\n } finally {\n this.isUploadingFiles = false;\n }\n }\n\n private async sendMessage(message: string): Promise<void> {\n if (!this.sessionId || !message.trim()) return;\n\n try {\n let attachmentIds: number[] = [];\n if (this.allowAttachments && this.selectedFiles.length > 0) {\n attachmentIds = await this.uploadFiles();\n\n // Check if any files have errors after upload attempt\n const hasErrors = this.selectedFiles.some(sf => sf.error);\n if (hasErrors) {\n // Don't send the message, let user fix file issues first\n this.handleError('Please remove or fix file errors before sending your message.');\n return;\n }\n }\n\n // If this is the first user message and there are welcome messages,\n // add them to chat history as assistant messages\n if (this.messages.length === 0 && this.parsedWelcomeMessages.length > 0) {\n const now = new Date();\n const welcomeMessages: ChatMessage[] = this.parsedWelcomeMessages.map((welcomeMsg, index) => ({\n created_at: new Date(now.getTime() - (this.parsedWelcomeMessages.length - index) * 1000).toISOString(),\n role: 'assistant' as const,\n content: welcomeMsg,\n attachments: []\n }));\n this.messages = [...this.messages, ...welcomeMessages];\n }\n\n // Add user message immediately with attachments info\n const userMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'user',\n content: message.trim(),\n attachments: this.allowAttachments ? this.selectedFiles\n .filter(sf => !sf.error && sf.uploaded)\n .map(sf => ({\n name: sf.file.name,\n content_type: sf.file.type,\n size: sf.file.size,\n })) : []\n };\n this.messages = [...this.messages, userMessage];\n this.saveSessionToStorage();\n this.messageInput = '';\n if (this.allowAttachments) {\n this.selectedFiles = []; // Clear selected files after sending\n }\n this.scrollToBottom();\n\n // Start typing indicator - it will stay on during task polling\n this.isTyping = true;\n\n const requestBody: any = { message: message.trim() };\n if (this.allowAttachments && attachmentIds.length > 0) {\n requestBody.attachment_ids = attachmentIds;\n }\n\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/message/`, {\n method: 'POST',\n headers: this.getApiHeaders(),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send message: ${response.statusText}`);\n }\n\n const data: ChatSendMessageResponse = await response.json();\n\n if (data.status === 'error') {\n throw new Error(data.error || 'Failed to send message');\n }\n\n // Poll for the response - typing indicator will be managed in pollTaskResponse\n this.currentPollTaskId = data.task_id;\n await this.pollTaskResponse();\n } catch (error) {\n const errorText = error instanceof Error ? error.message : 'Failed to send message';\n this.handleError(errorText);\n }\n }\n\n private handleStarterQuestionClick(question: string): void {\n this.sendMessage(question);\n }\n\n private async pollTaskResponse(): Promise<void> {\n if (!this.sessionId || !this.currentPollTaskId) return;\n\n // Stop message polling while task polling is active\n this.pauseMessagePolling();\n\n let attempts = 0;\n\n const poll = async (): Promise<void> => {\n if (!this.sessionId || !this.currentPollTaskId) return;\n\n try {\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/${this.currentPollTaskId}/poll/`);\n\n if (!response.ok) {\n throw new Error(`Failed to poll task: ${response.statusText}`);\n }\n\n const data: ChatTaskPollResponse = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n if (data.status === 'complete' && data.message) {\n this.messages = [...this.messages, data.message];\n this.saveSessionToStorage();\n this.scrollToBottom();\n // Task polling complete, clear typing indicator and resume message polling\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n this.focusInput();\n return;\n }\n\n if (data.status === 'processing' && attempts < OcsChat.TASK_POLLING_MAX_ATTEMPTS) {\n attempts++;\n setTimeout(poll, OcsChat.TASK_POLLING_INTERVAL_MS);\n } else if (attempts >= OcsChat.TASK_POLLING_MAX_ATTEMPTS) {\n // Task polling timed out - add timeout message and resume polling\n const timeoutMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: 'The response is taking longer than expected. The system may be experiencing delays. Please try sending your message again.',\n attachments: []\n };\n this.messages = [...this.messages, timeoutMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n\n // Clear typing indicator and resume message polling\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n this.focusInput();\n }\n } catch (error) {\n const errorText = error instanceof Error ? error.message : 'Failed to get response';\n this.handleError(errorText);\n // Clear states and resume polling\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n }\n };\n\n await poll();\n }\n\n private startPolling(): void {\n if (this.pollingIntervalRef) return;\n\n this.pollingIntervalRef = setInterval(async () => {\n // Only poll for messages if not currently polling for a task\n if (!this.currentPollTaskId) {\n await this.pollForMessages();\n }\n }, OcsChat.MESSAGE_POLLING_INTERVAL_MS);\n }\n\n private pauseMessagePolling(): void {\n if (this.pollingIntervalRef) {\n clearInterval(this.pollingIntervalRef);\n this.pollingIntervalRef = undefined;\n }\n }\n\n private resumeMessagePolling(): void {\n // Resume message polling after task polling is complete\n this.startPolling();\n }\n\n private async pollForMessages(): Promise<void> {\n if (!this.sessionId) return;\n\n try {\n const url = new URL(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/poll/`);\n if (this.messages && this.messages.length > 0) {\n url.searchParams.set('since', this.messages.at(-1).created_at);\n }\n\n const response = await fetch(url.toString());\n\n if (!response.ok) return; // Silently fail for polling\n\n const data: ChatPollResponse = await response.json();\n\n if (data.messages.length > 0) {\n this.messages = [...this.messages, ...data.messages];\n this.saveSessionToStorage();\n this.scrollToBottom();\n this.focusInput();\n }\n } catch {\n // Silently fail for polling\n }\n }\n\n private scrollToBottom(): void {\n setTimeout(() => {\n if (this.messageListRef) {\n this.messageListRef.scrollTop = this.messageListRef.scrollHeight;\n }\n }, OcsChat.SCROLL_DELAY_MS);\n }\n\n private focusInput(): void {\n setTimeout(() => {\n if (this.textareaRef && !this.isTyping) {\n this.textareaRef.focus();\n }\n }, OcsChat.FOCUS_DELAY_MS);\n }\n\n private handleKeyPress(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage(this.messageInput);\n }\n }\n\n private handleInputChange(event: Event): void {\n this.messageInput = (event.target as HTMLTextAreaElement).value;\n }\n\n private handleFileSelect(event: Event): void {\n if (!this.allowAttachments) return;\n\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const newFiles: SelectedFile[] = [];\n let totalSize = this.selectedFiles.reduce((sum, f) => sum + f.file.size, 0);\n\n for (let i = 0; i < input.files.length; i++) {\n const file = input.files[i];\n const ext = '.' + file.name.split('.').pop()?.toLowerCase();\n if (!OcsChat.SUPPORTED_FILE_EXTENSIONS.includes(ext)) {\n newFiles.push({\n file,\n error: `File type ${ext} not supported`\n });\n continue;\n }\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > OcsChat.MAX_FILE_SIZE_MB) {\n newFiles.push({\n file,\n error: `File exceeds ${OcsChat.MAX_FILE_SIZE_MB}MB limit`\n });\n continue;\n }\n totalSize += file.size;\n const totalSizeMB = totalSize / (1024 * 1024);\n if (totalSizeMB > OcsChat.MAX_TOTAL_SIZE_MB) {\n newFiles.push({\n file,\n error: `Total size exceeds ${OcsChat.MAX_TOTAL_SIZE_MB}MB limit`\n });\n continue;\n }\n\n newFiles.push({ file });\n }\n this.selectedFiles = [...this.selectedFiles, ...newFiles];\n input.value = '';\n }\n\n private removeSelectedFile(index: number): void {\n if (!this.allowAttachments) return;\n this.selectedFiles = this.selectedFiles.filter((_, i) => i !== index);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 KB';\n const k = 1024;\n\n if (bytes < k * k) {\n // Less than 1MB, show in KB\n return Math.round(bytes / k * 100) / 100 + ' KB';\n } else {\n return Math.round(bytes / (k * k) * 100) / 100 + ' MB';\n }\n }\n\n private formatTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n\n private toggleWindowVisibility() {\n this.visible = !this.visible;\n }\n\n /**\n * Watch for changes to the `visible` attribute and update accordingly.\n *\n * @param visible - The new value for the field.\n */\n @Watch('visible')\n async visibilityHandler(visible: boolean) {\n if (visible) {\n this.initializePosition();\n }\n if (visible && !this.sessionId) {\n await this.startSession();\n } else if (!visible) {\n this.pauseMessagePolling()\n } else {\n this.resumeMessagePolling();\n }\n }\n\n setPosition(position: 'left' | 'center' | 'right') {\n if (position === this.position) return;\n this.position = position;\n }\n\n getPositionClasses() {\n if (this.isFullscreen) {\n return 'chat-window-fullscreen';\n }\n const baseClasses = 'chat-window-normal';\n const draggingClass = this.isDragging ? ' chat-window-dragging' : '';\n return baseClasses + draggingClass;\n }\n\n private getFullscreenBounds() {\n const windowWidth = window.innerWidth;\n const actualChatWidth = Math.min(windowWidth, this.chatWindowFullscreenWidth);\n const centeredX = (windowWidth - actualChatWidth) / 2;\n const maxOffset = (windowWidth - actualChatWidth) / 2;\n\n console.log( windowWidth, actualChatWidth, centeredX, maxOffset )\n return { windowWidth, actualChatWidth, centeredX, maxOffset };\n }\n\n getPositionStyles() {\n if (this.isFullscreen) {\n const { centeredX } = this.getFullscreenBounds();\n const finalX = centeredX + this.fullscreenPosition.x;\n\n return {\n left: `${finalX}px`,\n top: '0px',\n transform: 'none',\n };\n }\n return {\n left: `${this.windowPosition.x}px`,\n top: `${this.windowPosition.y}px`,\n };\n }\n\n private initializePosition(): void {\n if (this.positionInitialized) {\n return;\n }\n this.positionInitialized = true;\n\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const isMobile = windowWidth < OcsChat.MOBILE_BREAKPOINT;\n\n if (isMobile) {\n this.windowPosition = { x: 0, y: 0 };\n return;\n }\n\n switch (this.position) {\n case 'left':\n this.windowPosition = {\n x: OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'right':\n this.windowPosition = {\n x: windowWidth - chatWidth - OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'center':\n this.windowPosition = {\n x: (windowWidth - chatWidth) / 2,\n y: (windowHeight - this.chatWindowHeight) / 2\n };\n break;\n }\n }\n\n private getPointerCoordinates(event: MouseEvent | TouchEvent): PointerEvent | null {\n if (event instanceof MouseEvent) {\n return { clientX: event.clientX, clientY: event.clientY };\n } else if (event instanceof TouchEvent && event.touches.length === 1) {\n const touch = event.touches[0];\n return { clientX: touch.clientX, clientY: touch.clientY };\n }\n return null;\n }\n\n private startDrag(pointer: PointerEvent): void {\n if (!this.chatWindowRef) return;\n\n this.isDragging = true;\n\n if (this.isFullscreen) {\n // For fullscreen, track relative to current position\n this.dragOffset = {\n x: pointer.clientX,\n y: pointer.clientY\n };\n } else {\n const rect = this.chatWindowRef.getBoundingClientRect();\n this.dragOffset = {\n x: pointer.clientX - rect.left,\n y: pointer.clientY - rect.top\n };\n }\n }\n\n private updateDragPosition(pointer: PointerEvent): void {\n if (!this.isDragging) return;\n\n if (this.isFullscreen) {\n // In fullscreen, only allow horizontal dragging\n const { maxOffset } = this.getFullscreenBounds();\n\n const deltaX = pointer.clientX - this.dragOffset.x;\n this.fullscreenPosition = {\n x: Math.max(-maxOffset, Math.min(maxOffset, deltaX))\n };\n } else {\n const newX = pointer.clientX - this.dragOffset.x;\n const newY = pointer.clientY - this.dragOffset.y;\n\n // Constrain chatbox to window\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const chatHeight = this.chatWindowRef.offsetHeight;\n\n this.windowPosition = {\n x: Math.max(0, Math.min(newX, windowWidth - chatWidth)),\n y: Math.max(0, Math.min(newY, windowHeight - chatHeight))\n };\n }\n }\n\n private endDrag(): void {\n this.isDragging = false;\n this.removeEventListeners();\n }\n\n private addEventListeners(): void {\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n document.addEventListener('touchmove', this.handleTouchMove, { passive: false });\n document.addEventListener('touchend', this.handleTouchEnd);\n }\n\n private removeEventListeners(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.removeEventListener('touchmove', this.handleTouchMove);\n document.removeEventListener('touchend', this.handleTouchEnd);\n }\n\n private handleMouseDown = (event: MouseEvent): void => {\n if (!this.isFullscreen && window.innerWidth < OcsChat.MOBILE_BREAKPOINT) return;\n if ((event.target as HTMLElement).closest('button')) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleMouseMove = (event: MouseEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n };\n\n private handleMouseUp = (): void => {\n this.endDrag();\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n if ((event.target as HTMLElement).closest('button')) return;\n if (!this.chatWindowRef) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleTouchMove = (event: TouchEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n event.preventDefault();\n };\n\n private handleTouchEnd = (): void => {\n this.endDrag();\n };\n\n private handleWindowResize = (): void => {\n this.positionInitialized = false;\n this.initializePosition();\n };\n\n private getDefaultIconUrl(): string {\n return `${this.getApiBaseUrl()}/static/images/favicons/favicon.svg`;\n }\n\n private getButtonClasses(): string {\n const hasText = this.buttonText && this.buttonText.trim();\n const baseClass = hasText ? 'chat-btn-text' : 'chat-btn-icon';\n const shapeClass = this.buttonShape === 'round' ? 'round' : '';\n return `${baseClass} ${shapeClass}`.trim();\n }\n\n private renderButton() {\n const hasText = this.buttonText && this.buttonText.trim();\n const hasCustomIcon = this.iconUrl && this.iconUrl.trim();\n const iconSrc = hasCustomIcon ? this.iconUrl : this.getDefaultIconUrl();\n const buttonClasses = this.getButtonClasses();\n\n if (hasText) {\n return (\n <button\n class={buttonClasses}\n onClick={() => this.toggleWindowVisibility()}\n aria-label={`Open chat - ${this.buttonText}`}\n title={this.buttonText}\n >\n <img src={iconSrc} alt=\"\" />\n <span>{this.buttonText}</span>\n </button>\n );\n } else {\n return (\n <button\n class={buttonClasses}\n onClick={() => this.toggleWindowVisibility()}\n aria-label=\"Open chat\"\n title=\"Open chat\"\n >\n <img src={iconSrc} alt=\"Chat\" />\n </button>\n );\n }\n }\n\n private getStorageKeys() {\n return {\n sessionId: `ocs-chat-session-${this.chatbotId}`,\n messages: `ocs-chat-messages-${this.chatbotId}`,\n lastActivity: `ocs-chat-activity-${this.chatbotId}`\n };\n }\n\n private saveSessionToStorage(): void {\n if (!this.persistentSession) {\n return\n }\n const keys = this.getStorageKeys();\n try {\n if (this.sessionId) {\n localStorage.setItem(keys.sessionId, this.sessionId);\n localStorage.setItem(keys.lastActivity, new Date().toISOString());\n }\n localStorage.setItem(keys.messages, JSON.stringify(this.messages));\n } catch (error) {\n console.warn('Failed to save chat session to localStorage:', error);\n }\n }\n\n private loadSessionFromStorage(): SessionStorageData {\n const keys = this.getStorageKeys();\n try {\n if (this.persistentSessionExpire > 0) {\n const lastActivity = localStorage.getItem(keys.lastActivity);\n if (lastActivity) {\n const lastActivityDate = new Date(lastActivity);\n const minutesSinceActivity = (Date.now() - lastActivityDate.getTime()) / (1000 * 60);\n if (minutesSinceActivity > this.persistentSessionExpire) {\n this.clearSessionStorage();\n return {messages: []};\n }\n }\n }\n\n const storedSessionId = localStorage.getItem(keys.sessionId);\n const sessionId = storedSessionId ? storedSessionId : undefined;\n\n const messagesJson = localStorage.getItem(keys.messages);\n let messages: ChatMessage[] = [];\n\n if (messagesJson) {\n try {\n const parsedMessages = JSON.parse(messagesJson);\n messages = Array.isArray(parsedMessages) ? parsedMessages : [];\n } catch (parseError) {\n console.warn('Failed to parse messages from localStorage:', parseError);\n messages = [];\n }\n }\n\n return { sessionId, messages };\n } catch (error) {\n // fall back to starting a new session\n console.warn('Failed to load chat session from localStorage, starting new session:', error);\n return { messages: [] };\n }\n }\n\n private getOrGenerateUserId(): string {\n if (this.userId) {\n return this.userId;\n }\n\n if (this.generatedUserId) {\n return this.generatedUserId;\n }\n\n const storageKey = `ocs-user-id`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.generatedUserId = stored;\n return stored;\n }\n\n const array = new Uint8Array(9);\n window.crypto.getRandomValues(array);\n const randomString = Array.from(array, byte => byte.toString(36)).join('').substr(0, 9);\n const newUserId = `ocs:${Date.now()}_${randomString}`;\n this.generatedUserId = newUserId;\n localStorage.setItem(storageKey, newUserId);\n\n return newUserId;\n }\n\n private clearSessionStorage(): void {\n const keys = this.getStorageKeys();\n try {\n localStorage.removeItem(keys.sessionId);\n localStorage.removeItem(keys.messages);\n localStorage.removeItem(keys.lastActivity);\n } catch (error) {\n console.warn('Failed to clear chat session from localStorage:', error);\n }\n }\n\n private isLocalStorageAvailable(): boolean {\n try {\n localStorage.setItem(OcsChat.LOCALSTORAGE_TEST_KEY, 'test');\n localStorage.removeItem(OcsChat.LOCALSTORAGE_TEST_KEY);\n return true;\n } catch {\n return false;\n }\n }\n\n private showConfirmationDialog(): void {\n this.showNewChatConfirmation = true;\n }\n\n private hideConfirmationDialog(): void {\n this.showNewChatConfirmation = false;\n }\n\n private async confirmNewChat(): Promise<void> {\n this.hideConfirmationDialog();\n await this.actuallyStartNewChat();\n }\n\n private async actuallyStartNewChat(): Promise<void> {\n this.clearSessionStorage();\n this.sessionId = undefined;\n this.messages = [];\n this.isTyping = false;\n this.currentPollTaskId = '';\n if (this.allowAttachments) {\n this.selectedFiles = [];\n }\n this.cleanup();\n\n await this.startSession();\n }\n\n private toggleFullscreen(): void {\n this.isFullscreen = !this.isFullscreen;\n // Reset fullscreen position when toggling\n this.fullscreenPosition = { x: 0 };\n }\n\n render() {\n // Only show error state for critical errors that prevent the widget from functioning\n if (this.error && !this.sessionId) {\n return (\n <Host>\n <p class=\"error-message\">{this.error}</p>\n </Host>\n );\n }\n\n return (\n <Host>\n {this.renderButton()}\n {this.visible && (\n <div\n ref={(el) => this.chatWindowRef = el}\n id=\"ocs-chat-window\"\n class={this.getPositionClasses()}\n style={this.getPositionStyles()}\n >\n {/* Header */}\n <div\n class={`chat-header ${this.isDragging ? 'chat-header-dragging' : 'chat-header-draggable'}`}\n onMouseDown={this.handleMouseDown}\n onTouchStart={this.handleTouchStart}\n >\n {/* Drag indicator */}\n <div class=\"drag-indicator\">\n <div class=\"drag-dots header-button\">\n <GripDotsVerticalIcon/>\n </div>\n </div>\n <div class=\"header-text\">{this.headerText}</div>\n <div class=\"header-buttons\">\n {/* New Chat button */}\n {this.messages.length > 0 && (\n <button\n class=\"header-button\"\n onClick={() => this.showConfirmationDialog()}\n title=\"Start new chat\"\n aria-label=\"Start new chat\"\n >\n <PlusWithCircleIcon/>\n </button>\n )}\n {/* Fullscreen toggle button */}\n {this.allowFullScreen && <button\n class=\"header-button fullscreen-button\"\n onClick={() => this.toggleFullscreen()}\n title={this.isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n aria-label={this.isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n >\n {this.isFullscreen ? <ArrowsPointingInIcon/> : <ArrowsPointingOutIcon/>}\n </button>}\n <button\n class=\"header-button\"\n onClick={() => this.visible = false}\n aria-label=\"Close\"\n >\n <XMarkIcon/>\n </button>\n </div>\n </div>\n\n {this.showNewChatConfirmation && (\n <div class=\"confirmation-overlay\">\n <div class=\"confirmation-dialog\">\n <div class=\"confirmation-content\">\n <h3 class=\"confirmation-title\">Start New Chat</h3>\n <p class=\"confirmation-message\">\n {this.newChatConfirmationMessage}\n </p>\n <div class=\"confirmation-buttons\">\n <button\n class=\"confirmation-button confirmation-button-cancel\"\n onClick={() => this.hideConfirmationDialog()}\n >\n Cancel\n </button>\n <button\n class=\"confirmation-button confirmation-button-confirm\"\n onClick={() => this.confirmNewChat()}\n >\n Continue\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chat Content */}\n <div class=\"chat-content\">\n {/* Loading State */}\n {this.isLoading && !this.sessionId && (\n <div class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <span class=\"loading-text\">Starting chat...</span>\n </div>\n )}\n\n {/* Messages */}\n {(\n <div\n ref={(el) => this.messageListRef = el}\n class=\"messages-container\"\n >\n {this.messages.length === 0 && this.parsedWelcomeMessages.length > 0 && (\n <div class=\"welcome-messages\">\n {/* Welcome Messages */}\n {this.parsedWelcomeMessages.map((message, index) => (\n <div key={`welcome-${index}`} class=\"message-row message-row-assistant\">\n <div class=\"message-bubble message-bubble-assistant\">\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message)}\n ></div>\n </div>\n </div>\n ))}\n </div>\n )}\n {/* Regular Chat Messages */}\n {this.messages.map((message, index) => (\n <div\n key={index}\n class={`message-row ${\n message.role === 'user' ? 'message-row-user' : 'message-row-assistant'\n }`}\n >\n <div\n class={`message-bubble ${\n message.role === 'user'\n ? 'message-bubble-user'\n : message.role === 'assistant'\n ? 'message-bubble-assistant'\n : 'message-bubble-system'\n }`}\n >\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message.content)}\n ></div>\n {message.attachments && message.attachments.length > 0 && (\n <div class=\"message-attachments\">\n {message.attachments.map((attachment, attachmentIndex) => (\n <div key={attachmentIndex} class=\"flex items-center gap-[0.5em]\">\n <span class=\"message-attachment-icon\">\n <PaperClipIcon />\n </span>\n <span class=\"message-attachment-name\">{attachment.name}</span>\n </div>\n ))}\n </div>\n )}\n <div class=\"message-timestamp\">\n {this.formatTime(message.created_at)}\n </div>\n </div>\n </div>\n ))}\n {/* Typing Indicator */}\n {this.isTyping && (\n <div>\n <div class=\"typing-indicator\">\n <div class=\"typing-progress\"></div>\n </div>\n <div class=\"typing-text\">\n <span>{this.typingIndicatorText}</span>\n <span class=\"typing-dots\"></span>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Starter Questions */}\n {this.messages.length === 0 && this.parsedStarterQuestions.length > 0 && (\n <div class=\"starter-questions\">\n {this.parsedStarterQuestions.map((question, index) => (\n <div key={`starter-${index}`} class=\"starter-question-row\">\n <button\n class=\"starter-question\"\n onClick={() => this.handleStarterQuestionClick(question)}\n >\n {question}\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Selected Files Display */}\n {this.allowAttachments && this.selectedFiles.length > 0 && (\n <div class=\"selected-files-container\">\n <div class=\"space-y-[0.25em]\">\n {this.selectedFiles.map((selectedFile, index) => (\n <div key={index} class=\"selected-file-item\">\n <div class=\"flex items-center gap-[0.5em]\">\n <span class=\"selected-file-icon\">\n <PaperClipIcon/>\n </span>\n <span>{selectedFile.file.name}</span>\n <span class=\"selected-file-size\">({this.formatFileSize(selectedFile.file.size)})</span>\n {selectedFile.error && (\n <span class=\"selected-file-error\">{selectedFile.error}</span>\n )}\n {selectedFile.uploaded && (\n <span class=\"selected-file-success-icon\"><CheckDocumentIcon /></span>\n )}\n </div>\n <button\n onClick={() => this.removeSelectedFile(index)}\n class=\"selected-file-remove-button\"\n aria-label=\"Remove file\"\n ><XIcon />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Input Area */}\n {this.sessionId && (\n <div class=\"input-area\">\n <div class=\"input-container\">\n <textarea\n ref={(el) => this.textareaRef = el}\n class=\"message-textarea\"\n rows={1}\n placeholder=\"Type your message...\"\n value={this.messageInput}\n onInput={(e) => this.handleInputChange(e)}\n onKeyPress={(e) => this.handleKeyPress(e)}\n disabled={this.isTyping || this.isUploadingFiles}\n ></textarea>\n {/* File Upload Button */}\n {this.allowAttachments && (\n <input\n ref={(el) => {\n // Unclear why but after removing all attachments this is being set to `null`.\n if (el) {this.fileInputRef = el}\n }\n }\n id=\"ocs-file-input\"\n type=\"file\"\n multiple\n accept={OcsChat.SUPPORTED_FILE_EXTENSIONS.join(',')}\n onChange={(e) => this.handleFileSelect(e)}\n class=\"hidden\"\n />\n )}\n {this.allowAttachments && (\n <button\n class=\"file-attachment-button\"\n onClick={() => this.fileInputRef?.click()}\n disabled={this.isTyping || this.isUploadingFiles}\n title=\"Attach files\"\n aria-label=\"Attach files\"\n >\n <PaperClipIcon />\n </button>\n )}\n <button\n class={`send-button ${\n !this.isTyping && !!this.messageInput.trim()\n ? 'send-button-enabled'\n : 'send-button-disabled'\n }`}\n onClick={() => this.sendMessage(this.messageInput)}\n disabled={this.isTyping || this.isUploadingFiles || !this.messageInput.trim()}\n >\n {this.isUploadingFiles ? 'Uploading...' : 'Send'}\n </button>\n </div>\n </div>\n )}\n <div class=\"flex items-center justify-center text-[0.8em] font-light w-full text-slate-500 py-[2px]\">\n <p>Powered by <a class=\"underline\" href=\"https://www.dimagi.com\" target=\"_blank\">Dimagi</a></p>\n </div>\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ocs-chat.js","sourceRoot":"","sources":["../../../src/components/ocs-chat/ocs-chat.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport {Component, Host, h, Prop, State, Element, Watch} from '@stencil/core';\nimport {\n XMarkIcon,\n GripDotsVerticalIcon, PlusWithCircleIcon, ArrowsPointingOutIcon, ArrowsPointingInIcon,\n PaperClipIcon, CheckDocumentIcon, XIcon\n} from './heroicons';\nimport { renderMarkdownSync as renderMarkdownComplete } from '../../utils/markdown';\nimport { getCSRFToken } from '../../utils/cookies';\nimport { varToPixels } from '../../utils/utils';\n\ninterface ChatMessage {\n created_at: string;\n role: 'system' | 'user' | 'assistant';\n content: string;\n metadata?: any;\n attachments?: ChatAttachment[];\n}\n\ninterface ChatAttachment {\n name: string;\n content_type: string;\n size: number;\n}\n\ninterface UploadedFile {\n id: number;\n name: string;\n size: number;\n content_type: string;\n}\n\ninterface SelectedFile {\n file: File;\n uploaded?: UploadedFile;\n error?: string;\n}\n\ninterface ChatStartSessionResponse {\n session_id: string;\n chatbot: any;\n participant: any;\n seed_message_task_id?: string;\n}\n\ninterface ChatSendMessageResponse {\n task_id: string;\n status: 'processing' | 'completed' | 'error';\n error?: string;\n}\n\ninterface ChatTaskPollResponse {\n message?: ChatMessage;\n status: 'processing' | 'complete';\n error?: string;\n}\n\ninterface ChatPollResponse {\n messages: ChatMessage[];\n has_more: boolean;\n session_status: 'active' | 'ended';\n}\n\ninterface PointerEvent {\n clientX: number;\n clientY: number;\n}\n\ninterface SessionStorageData {\n sessionId?: string;\n messages: ChatMessage[];\n}\n\n@Component({\n tag: 'open-chat-studio-widget',\n styleUrl: 'ocs-chat.css',\n shadow: true,\n})\nexport class OcsChat {\n\n private static readonly TASK_POLLING_MAX_ATTEMPTS = 120;\n private static readonly TASK_POLLING_INTERVAL_MS = 1000;\n private static readonly MESSAGE_POLLING_INTERVAL_MS = 30000;\n\n private static readonly SCROLL_DELAY_MS = 100;\n private static readonly FOCUS_DELAY_MS = 100;\n\n private static readonly MOBILE_BREAKPOINT = 640;\n private static readonly WINDOW_MARGIN = 20;\n\n private static readonly LOCALSTORAGE_TEST_KEY = '__ocs_test__';\n\n private static readonly MAX_FILE_SIZE_MB = 50;\n private static readonly MAX_TOTAL_SIZE_MB = 50;\n private static readonly SUPPORTED_FILE_EXTENSIONS = ['.txt', '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.csv', '.jpg', '.jpeg',\n '.png', '.gif', '.bmp', '.webp', '.svg', '.mp4', '.mov', '.avi', '.mp3', '.wav' ];\n\n /**\n * The ID of the chatbot to connect to.\n */\n @Prop() chatbotId!: string;\n\n /**\n * The base URL for the API (defaults to current origin).\n */\n @Prop() apiBaseUrl?: string = \"https://chatbots.dimagi.com\";\n\n /**\n * The text to display on the button.\n */\n @Prop() buttonText?: string;\n\n /**\n * URL of the icon to display on the button. If not provided, uses the default OCS logo.\n */\n @Prop() iconUrl?: string;\n\n /**\n * The shape of the chat button. 'round' makes it circular, 'square' keeps it rectangular.\n */\n @Prop() buttonShape: 'round' | 'square' = 'square';\n\n /**\n * The text to place in the header.\n */\n @Prop() headerText: '';\n\n /**\n * The message to display in the new chat confirmation dialog.\n */\n @Prop() newChatConfirmationMessage?: string = \"Starting a new chat will clear your current conversation. Continue?\";\n\n /**\n * Whether the chat widget is visible on load.\n */\n @Prop({ mutable: true }) visible: boolean = false;\n\n /**\n * The initial position of the chat widget on the screen.\n */\n @Prop({ mutable: true }) position: 'left' | 'center' | 'right' = 'right';\n\n /**\n * Welcome messages to display above starter questions (JSON array of strings)\n */\n @Prop() welcomeMessages?: string;\n\n /**\n * Array of starter questions that users can click to send (JSON array of strings)\n */\n @Prop() starterQuestions?: string;\n\n /**\n * Used to associate chat sessions with a specific user across multiple visits/sessions\n */\n @Prop() userId?: string;\n /**\n * Display name for the user.\n */\n @Prop() userName?: string;\n /**\n * Whether to persist session data to local storage to allow resuming previous conversations after page reload.\n */\n @Prop() persistentSession: boolean = true;\n\n /**\n * Minutes since the most recent message after which the session data in local storage will expire. Set this to\n * `0` to never expire.\n */\n @Prop() persistentSessionExpire: number = 60 * 24;\n\n /**\n * Allow the user to make the chat window full screen.\n */\n @Prop() allowFullScreen: boolean = true;\n\n /**\n * Allow the user to attach files to their messages.\n */\n @Prop() allowAttachments: boolean = false;\n\n /**\n * The text to display while the assistant is typing/preparing a response.\n */\n @Prop() typingIndicatorText?: string = \"Preparing response\";\n\n @State() error: string = \"\";\n @State() messages: ChatMessage[] = [];\n @State() sessionId?: string;\n @State() isLoading: boolean = false;\n @State() isTyping: boolean = false;\n @State() messageInput: string = \"\";\n @State() currentPollTaskId: string = \"\";\n @State() isDragging: boolean = false;\n @State() dragOffset: { x: number; y: number } = { x: 0, y: 0 };\n @State() windowPosition: { x: number; y: number } = { x: 0, y: 0 };\n @State() fullscreenPosition: { x: number } = { x: 0 };\n @State() parsedWelcomeMessages: string[] = [];\n @State() parsedStarterQuestions: string[] = [];\n @State() generatedUserId?: string;\n @State() isFullscreen: boolean = false;\n @State() showNewChatConfirmation: boolean = false;\n\n @State() selectedFiles: SelectedFile[] = [];\n @State() isUploadingFiles: boolean = false;\n\n private pollingIntervalRef?: any;\n private messageListRef?: HTMLDivElement;\n private textareaRef?: HTMLTextAreaElement;\n private chatWindowRef?: HTMLDivElement;\n private fileInputRef?: HTMLInputElement;\n private chatWindowHeight: number = 600;\n private chatWindowWidth: number = 450;\n private chatWindowFullscreenWidth: number = 1024;\n private positionInitialized: boolean = false;\n @Element() host: HTMLElement;\n\n\n componentWillLoad() {\n if (!this.chatbotId) {\n this.error = 'Chatbot ID is required';\n return;\n }\n // Always try to load existing session if localStorage is available\n if (this.persistentSession && this.isLocalStorageAvailable()) {\n const { sessionId, messages } = this.loadSessionFromStorage();\n if (sessionId && messages) {\n this.sessionId = sessionId;\n this.messages = messages;\n }\n }\n this.parseWelcomeMessages();\n this.parseStarterQuestions();\n }\n\n componentDidLoad() {\n const computedStyle = getComputedStyle(this.host);\n const windowHeightVar = computedStyle.getPropertyValue('--chat-window-height');\n const windowWidthVar = computedStyle.getPropertyValue('--chat-window-width');\n const fullscreenWidthVar = computedStyle.getPropertyValue('--chat-window-fullscreen-width');\n this.chatWindowHeight = varToPixels(windowHeightVar, window.innerHeight, this.chatWindowHeight);\n this.chatWindowWidth = varToPixels(windowWidthVar, window.innerWidth, this.chatWindowWidth);\n this.chatWindowFullscreenWidth = varToPixels(fullscreenWidthVar, window.innerWidth, this.chatWindowFullscreenWidth);\n if (this.visible) {\n this.initializePosition();\n }\n\n // Only auto-start session if we don't have an existing one\n if (this.visible && !this.sessionId) {\n this.startSession();\n } else if (this.visible && this.sessionId) {\n // Resume polling for existing session\n this.startPolling();\n }\n window.addEventListener('resize', this.handleWindowResize);\n }\n\n disconnectedCallback() {\n this.cleanup();\n this.removeEventListeners();\n window.removeEventListener('resize', this.handleWindowResize);\n }\n\n private addErrorMessage(errorText: string): void {\n const errorMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: `**Error:** ${errorText}\\nPlease try again.`,\n attachments: []\n };\n\n this.messages = [...this.messages, errorMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n }\n\n private handleError(errorText: string): void {\n // show as system message\n this.addErrorMessage(errorText);\n\n // Clear any loading/typing states\n this.isLoading = false;\n this.isTyping = false;\n this.isUploadingFiles = false;\n this.currentPollTaskId = '';\n }\n\n private parseJSONProp(propValue: string | undefined, propName: string): string[] {\n try {\n if (propValue) {\n try {\n return JSON.parse(propValue);\n } catch {\n const fixedValue = propValue.replace(/'/g, '\"');\n return JSON.parse(fixedValue);\n }\n }\n } catch (error) {\n console.warn(`Failed to parse ${propName}:`, error);\n }\n return [];\n }\n\n private parseWelcomeMessages() {\n this.parsedWelcomeMessages = this.parseJSONProp(this.welcomeMessages, 'welcome messages');\n }\n\n private parseStarterQuestions() {\n this.parsedStarterQuestions = this.parseJSONProp(this.starterQuestions, 'starter questions');\n }\n\n private cleanup() {\n if (this.pollingIntervalRef) {\n clearInterval(this.pollingIntervalRef);\n this.pollingIntervalRef = undefined;\n }\n this.currentPollTaskId = '';\n }\n\n private getApiBaseUrl(): string {\n return this.apiBaseUrl || window.location.origin;\n }\n\n private getApiHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const csrfToken = getCSRFToken(this.getApiBaseUrl());\n if (csrfToken) {\n headers['X-CSRFToken'] = csrfToken;\n }\n\n return headers;\n }\n\n private async startSession(): Promise<void> {\n try {\n this.isLoading = true;\n\n const userId = this.getOrGenerateUserId();\n\n const requestBody: any = {\n chatbot_id: this.chatbotId,\n session_data: {\n source: 'widget',\n page_url: window.location.href\n },\n participant_remote_id: userId\n };\n\n if (this.userName) {\n requestBody.participant_name = this.userName;\n }\n\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/start/`, {\n method: 'POST',\n headers: this.getApiHeaders(),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n this.handleError(`Failed to start session: ${response.statusText}`);\n return;\n }\n\n const data: ChatStartSessionResponse = await response.json();\n this.sessionId = data.session_id;\n this.saveSessionToStorage();\n\n // Handle seed message if present\n if (data.seed_message_task_id) {\n this.isTyping = true; // Show typing indicator for seed message\n this.currentPollTaskId = data.seed_message_task_id;\n await this.pollTaskResponse();\n }\n\n // Start polling for messages\n this.startPolling();\n } catch (error) {\n this.handleError('Failed to start chat session');\n } finally {\n this.isLoading = false;\n }\n }\n\n private markPendingFilesWithError(errorMessage: string): void {\n this.selectedFiles = this.selectedFiles.map(sf => {\n if (!sf.error && !sf.uploaded) {\n return { ...sf, error: errorMessage };\n }\n return sf;\n });\n }\n\n private async uploadFiles(): Promise<number[]> {\n if (this.selectedFiles.length === 0 || !this.sessionId || !this.allowAttachments) {\n return [];\n }\n\n this.isUploadingFiles = true;\n const uploadedIds: number[] = [];\n\n try {\n const formData = new FormData();\n\n // Add all files to form data\n for (const selectedFile of this.selectedFiles) {\n if (!selectedFile.error && !selectedFile.uploaded) {\n formData.append('files', selectedFile.file);\n } else if (selectedFile.uploaded) {\n uploadedIds.push(selectedFile.uploaded.id);\n }\n }\n\n // Add user ID and name to the form data\n const userId = this.getOrGenerateUserId();\n formData.append('participant_remote_id', userId);\n if (this.userName) {\n formData.append('participant_name', this.userName);\n }\n\n // Only upload if there are new files\n if (formData.has('files')) {\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/upload/`, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n const errorMessage = errorData.error || 'Failed to upload files';\n this.markPendingFilesWithError(errorMessage);\n return uploadedIds;\n }\n\n const data = await response.json();\n\n // Update selected files with upload results\n let fileIndex = 0;\n this.selectedFiles = this.selectedFiles.map(sf => {\n if (!sf.error && !sf.uploaded) {\n return { ...sf, uploaded: data.files[fileIndex++] };\n }\n return sf;\n });\n uploadedIds.push(...data.files.map((f: UploadedFile) => f.id));\n }\n\n return uploadedIds;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to upload files';\n this.markPendingFilesWithError(errorMessage);\n return uploadedIds;\n } finally {\n this.isUploadingFiles = false;\n }\n }\n\n private async sendMessage(message: string): Promise<void> {\n if (!this.sessionId || !message.trim()) return;\n\n try {\n let attachmentIds: number[] = [];\n if (this.allowAttachments && this.selectedFiles.length > 0) {\n attachmentIds = await this.uploadFiles();\n\n // Check if any files have errors after upload attempt\n const hasErrors = this.selectedFiles.some(sf => sf.error);\n if (hasErrors) {\n // Don't send the message, let user fix file issues first\n this.handleError('Please remove or fix file errors before sending your message.');\n return;\n }\n }\n\n // If this is the first user message and there are welcome messages,\n // add them to chat history as assistant messages\n if (this.messages.length === 0 && this.parsedWelcomeMessages.length > 0) {\n const now = new Date();\n const welcomeMessages: ChatMessage[] = this.parsedWelcomeMessages.map((welcomeMsg, index) => ({\n created_at: new Date(now.getTime() - (this.parsedWelcomeMessages.length - index) * 1000).toISOString(),\n role: 'assistant' as const,\n content: welcomeMsg,\n attachments: []\n }));\n this.messages = [...this.messages, ...welcomeMessages];\n }\n\n // Add user message immediately with attachments info\n const userMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'user',\n content: message.trim(),\n attachments: this.allowAttachments ? this.selectedFiles\n .filter(sf => !sf.error && sf.uploaded)\n .map(sf => ({\n name: sf.file.name,\n content_type: sf.file.type,\n size: sf.file.size,\n })) : []\n };\n this.messages = [...this.messages, userMessage];\n this.saveSessionToStorage();\n this.messageInput = '';\n if (this.allowAttachments) {\n this.selectedFiles = []; // Clear selected files after sending\n }\n this.scrollToBottom();\n\n // Start typing indicator - it will stay on during task polling\n this.isTyping = true;\n\n const requestBody: any = { message: message.trim() };\n if (this.allowAttachments && attachmentIds.length > 0) {\n requestBody.attachment_ids = attachmentIds;\n }\n\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/message/`, {\n method: 'POST',\n headers: this.getApiHeaders(),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send message: ${response.statusText}`);\n }\n\n const data: ChatSendMessageResponse = await response.json();\n\n if (data.status === 'error') {\n throw new Error(data.error || 'Failed to send message');\n }\n\n // Poll for the response - typing indicator will be managed in pollTaskResponse\n this.currentPollTaskId = data.task_id;\n await this.pollTaskResponse();\n } catch (error) {\n const errorText = error instanceof Error ? error.message : 'Failed to send message';\n this.handleError(errorText);\n }\n }\n\n private handleStarterQuestionClick(question: string): void {\n this.sendMessage(question);\n }\n\n private async pollTaskResponse(): Promise<void> {\n if (!this.sessionId || !this.currentPollTaskId) return;\n\n // Stop message polling while task polling is active\n this.pauseMessagePolling();\n\n let attempts = 0;\n\n const poll = async (): Promise<void> => {\n if (!this.sessionId || !this.currentPollTaskId) return;\n\n try {\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/${this.currentPollTaskId}/poll/`);\n\n if (!response.ok) {\n throw new Error(`Failed to poll task: ${response.statusText}`);\n }\n\n const data: ChatTaskPollResponse = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n if (data.status === 'complete' && data.message) {\n this.messages = [...this.messages, data.message];\n this.saveSessionToStorage();\n this.scrollToBottom();\n // Task polling complete, clear typing indicator and resume message polling\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n this.focusInput();\n return;\n }\n\n if (data.status === 'processing' && attempts < OcsChat.TASK_POLLING_MAX_ATTEMPTS) {\n attempts++;\n setTimeout(poll, OcsChat.TASK_POLLING_INTERVAL_MS);\n } else if (attempts >= OcsChat.TASK_POLLING_MAX_ATTEMPTS) {\n // Task polling timed out - add timeout message and resume polling\n const timeoutMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: 'The response is taking longer than expected. The system may be experiencing delays. Please try sending your message again.',\n attachments: []\n };\n this.messages = [...this.messages, timeoutMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n\n // Clear typing indicator and resume message polling\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n this.focusInput();\n }\n } catch (error) {\n const errorText = error instanceof Error ? error.message : 'Failed to get response';\n this.handleError(errorText);\n // Clear states and resume polling\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n }\n };\n\n await poll();\n }\n\n private startPolling(): void {\n if (this.pollingIntervalRef) return;\n\n this.pollingIntervalRef = setInterval(async () => {\n // Only poll for messages if not currently polling for a task\n if (!this.currentPollTaskId) {\n await this.pollForMessages();\n }\n }, OcsChat.MESSAGE_POLLING_INTERVAL_MS);\n }\n\n private pauseMessagePolling(): void {\n if (this.pollingIntervalRef) {\n clearInterval(this.pollingIntervalRef);\n this.pollingIntervalRef = undefined;\n }\n }\n\n private resumeMessagePolling(): void {\n // Resume message polling after task polling is complete\n this.startPolling();\n }\n\n private async pollForMessages(): Promise<void> {\n if (!this.sessionId) return;\n\n try {\n const url = new URL(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/poll/`);\n if (this.messages && this.messages.length > 0) {\n url.searchParams.set('since', this.messages.at(-1).created_at);\n }\n\n const response = await fetch(url.toString());\n\n if (!response.ok) return; // Silently fail for polling\n\n const data: ChatPollResponse = await response.json();\n\n if (data.messages.length > 0) {\n this.messages = [...this.messages, ...data.messages];\n this.saveSessionToStorage();\n this.scrollToBottom();\n this.focusInput();\n }\n } catch {\n // Silently fail for polling\n }\n }\n\n /**\n * Scroll the message container to the bottom.\n * @param forceEnd When `false`, scroll the top of the last message into view.\n * When `true`, scroll all the way to the end of the last message.\n */\n private scrollToBottom(forceEnd: boolean =false): void {\n setTimeout(() => {\n if (this.messageListRef) {\n const lastChild = this.messageListRef.lastElementChild;\n if (!forceEnd && lastChild) {\n // scroll so that the top of the last message is in the centre of the message container\n const parentRect = this.messageListRef.getBoundingClientRect();\n const childRect = lastChild.getBoundingClientRect();\n const currentScrollTop = this.messageListRef.scrollTop;\n const childTopRelativeToParent = childRect.top - parentRect.top;\n const targetScroll = currentScrollTop + childTopRelativeToParent - (parentRect.height / 2);\n this.messageListRef.scrollTo({\n top: targetScroll,\n behavior: 'smooth'\n });\n } else {\n this.messageListRef.scrollTop = this.messageListRef.scrollHeight;\n }\n }\n }, OcsChat.SCROLL_DELAY_MS);\n }\n\n private focusInput(): void {\n setTimeout(() => {\n if (this.textareaRef && !this.isTyping) {\n this.textareaRef.focus();\n }\n }, OcsChat.FOCUS_DELAY_MS);\n }\n\n private handleKeyPress(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage(this.messageInput);\n }\n }\n\n private handleInputChange(event: Event): void {\n this.messageInput = (event.target as HTMLTextAreaElement).value;\n }\n\n private handleFileSelect(event: Event): void {\n if (!this.allowAttachments) return;\n\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const newFiles: SelectedFile[] = [];\n let totalSize = this.selectedFiles.reduce((sum, f) => sum + f.file.size, 0);\n\n for (let i = 0; i < input.files.length; i++) {\n const file = input.files[i];\n const ext = '.' + file.name.split('.').pop()?.toLowerCase();\n if (!OcsChat.SUPPORTED_FILE_EXTENSIONS.includes(ext)) {\n newFiles.push({\n file,\n error: `File type ${ext} not supported`\n });\n continue;\n }\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > OcsChat.MAX_FILE_SIZE_MB) {\n newFiles.push({\n file,\n error: `File exceeds ${OcsChat.MAX_FILE_SIZE_MB}MB limit`\n });\n continue;\n }\n totalSize += file.size;\n const totalSizeMB = totalSize / (1024 * 1024);\n if (totalSizeMB > OcsChat.MAX_TOTAL_SIZE_MB) {\n newFiles.push({\n file,\n error: `Total size exceeds ${OcsChat.MAX_TOTAL_SIZE_MB}MB limit`\n });\n continue;\n }\n\n newFiles.push({ file });\n }\n this.selectedFiles = [...this.selectedFiles, ...newFiles];\n input.value = '';\n }\n\n private removeSelectedFile(index: number): void {\n if (!this.allowAttachments) return;\n this.selectedFiles = this.selectedFiles.filter((_, i) => i !== index);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 KB';\n const k = 1024;\n\n if (bytes < k * k) {\n // Less than 1MB, show in KB\n return Math.round(bytes / k * 100) / 100 + ' KB';\n } else {\n return Math.round(bytes / (k * k) * 100) / 100 + ' MB';\n }\n }\n\n private formatTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n\n private toggleWindowVisibility() {\n this.visible = !this.visible;\n }\n\n /**\n * Watch for changes to the `visible` attribute and update accordingly.\n *\n * @param visible - The new value for the field.\n */\n @Watch('visible')\n async visibilityHandler(visible: boolean) {\n if (visible) {\n this.initializePosition();\n }\n if (visible && !this.sessionId) {\n await this.startSession();\n } else if (!visible) {\n this.pauseMessagePolling()\n } else {\n this.scrollToBottom(true);\n this.resumeMessagePolling();\n }\n }\n\n setPosition(position: 'left' | 'center' | 'right') {\n if (position === this.position) return;\n this.position = position;\n }\n\n getPositionClasses() {\n if (this.isFullscreen) {\n return 'chat-window-fullscreen';\n }\n const baseClasses = 'chat-window-normal';\n const draggingClass = this.isDragging ? ' chat-window-dragging' : '';\n return baseClasses + draggingClass;\n }\n\n private getFullscreenBounds() {\n const windowWidth = window.innerWidth;\n const actualChatWidth = Math.min(windowWidth, this.chatWindowFullscreenWidth);\n const centeredX = (windowWidth - actualChatWidth) / 2;\n const maxOffset = (windowWidth - actualChatWidth) / 2;\n\n console.log( windowWidth, actualChatWidth, centeredX, maxOffset )\n return { windowWidth, actualChatWidth, centeredX, maxOffset };\n }\n\n getPositionStyles() {\n if (this.isFullscreen) {\n const { centeredX } = this.getFullscreenBounds();\n const finalX = centeredX + this.fullscreenPosition.x;\n\n return {\n left: `${finalX}px`,\n top: '0px',\n transform: 'none',\n };\n }\n return {\n left: `${this.windowPosition.x}px`,\n top: `${this.windowPosition.y}px`,\n };\n }\n\n private initializePosition(): void {\n if (this.positionInitialized) {\n return;\n }\n this.positionInitialized = true;\n\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const isMobile = windowWidth < OcsChat.MOBILE_BREAKPOINT;\n\n if (isMobile) {\n this.windowPosition = { x: 0, y: 0 };\n return;\n }\n\n switch (this.position) {\n case 'left':\n this.windowPosition = {\n x: OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'right':\n this.windowPosition = {\n x: windowWidth - chatWidth - OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'center':\n this.windowPosition = {\n x: (windowWidth - chatWidth) / 2,\n y: (windowHeight - this.chatWindowHeight) / 2\n };\n break;\n }\n }\n\n private getPointerCoordinates(event: MouseEvent | TouchEvent): PointerEvent | null {\n if (event instanceof MouseEvent) {\n return { clientX: event.clientX, clientY: event.clientY };\n } else if (event instanceof TouchEvent && event.touches.length === 1) {\n const touch = event.touches[0];\n return { clientX: touch.clientX, clientY: touch.clientY };\n }\n return null;\n }\n\n private startDrag(pointer: PointerEvent): void {\n if (!this.chatWindowRef) return;\n\n this.isDragging = true;\n\n if (this.isFullscreen) {\n // For fullscreen, track relative to current position\n this.dragOffset = {\n x: pointer.clientX,\n y: pointer.clientY\n };\n } else {\n const rect = this.chatWindowRef.getBoundingClientRect();\n this.dragOffset = {\n x: pointer.clientX - rect.left,\n y: pointer.clientY - rect.top\n };\n }\n }\n\n private updateDragPosition(pointer: PointerEvent): void {\n if (!this.isDragging) return;\n\n if (this.isFullscreen) {\n // In fullscreen, only allow horizontal dragging\n const { maxOffset } = this.getFullscreenBounds();\n\n const deltaX = pointer.clientX - this.dragOffset.x;\n this.fullscreenPosition = {\n x: Math.max(-maxOffset, Math.min(maxOffset, deltaX))\n };\n } else {\n const newX = pointer.clientX - this.dragOffset.x;\n const newY = pointer.clientY - this.dragOffset.y;\n\n // Constrain chatbox to window\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const chatHeight = this.chatWindowRef.offsetHeight;\n\n this.windowPosition = {\n x: Math.max(0, Math.min(newX, windowWidth - chatWidth)),\n y: Math.max(0, Math.min(newY, windowHeight - chatHeight))\n };\n }\n }\n\n private endDrag(): void {\n this.isDragging = false;\n this.removeEventListeners();\n }\n\n private addEventListeners(): void {\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n document.addEventListener('touchmove', this.handleTouchMove, { passive: false });\n document.addEventListener('touchend', this.handleTouchEnd);\n }\n\n private removeEventListeners(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.removeEventListener('touchmove', this.handleTouchMove);\n document.removeEventListener('touchend', this.handleTouchEnd);\n }\n\n private handleMouseDown = (event: MouseEvent): void => {\n if (!this.isFullscreen && window.innerWidth < OcsChat.MOBILE_BREAKPOINT) return;\n if ((event.target as HTMLElement).closest('button')) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleMouseMove = (event: MouseEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n };\n\n private handleMouseUp = (): void => {\n this.endDrag();\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n if ((event.target as HTMLElement).closest('button')) return;\n if (!this.chatWindowRef) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleTouchMove = (event: TouchEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n event.preventDefault();\n };\n\n private handleTouchEnd = (): void => {\n this.endDrag();\n };\n\n private handleWindowResize = (): void => {\n this.positionInitialized = false;\n this.initializePosition();\n };\n\n private getDefaultIconUrl(): string {\n return `${this.getApiBaseUrl()}/static/images/favicons/favicon.svg`;\n }\n\n private getButtonClasses(): string {\n const hasText = this.buttonText && this.buttonText.trim();\n const baseClass = hasText ? 'chat-btn-text' : 'chat-btn-icon';\n const shapeClass = this.buttonShape === 'round' ? 'round' : '';\n return `${baseClass} ${shapeClass}`.trim();\n }\n\n private renderButton() {\n const hasText = this.buttonText && this.buttonText.trim();\n const hasCustomIcon = this.iconUrl && this.iconUrl.trim();\n const iconSrc = hasCustomIcon ? this.iconUrl : this.getDefaultIconUrl();\n const buttonClasses = this.getButtonClasses();\n\n if (hasText) {\n return (\n <button\n class={buttonClasses}\n onClick={() => this.toggleWindowVisibility()}\n aria-label={`Open chat - ${this.buttonText}`}\n title={this.buttonText}\n >\n <img src={iconSrc} alt=\"\" />\n <span>{this.buttonText}</span>\n </button>\n );\n } else {\n return (\n <button\n class={buttonClasses}\n onClick={() => this.toggleWindowVisibility()}\n aria-label=\"Open chat\"\n title=\"Open chat\"\n >\n <img src={iconSrc} alt=\"Chat\" />\n </button>\n );\n }\n }\n\n private getStorageKeys() {\n return {\n sessionId: `ocs-chat-session-${this.chatbotId}`,\n messages: `ocs-chat-messages-${this.chatbotId}`,\n lastActivity: `ocs-chat-activity-${this.chatbotId}`\n };\n }\n\n private saveSessionToStorage(): void {\n if (!this.persistentSession) {\n return\n }\n const keys = this.getStorageKeys();\n try {\n if (this.sessionId) {\n localStorage.setItem(keys.sessionId, this.sessionId);\n localStorage.setItem(keys.lastActivity, new Date().toISOString());\n }\n localStorage.setItem(keys.messages, JSON.stringify(this.messages));\n } catch (error) {\n console.warn('Failed to save chat session to localStorage:', error);\n }\n }\n\n private loadSessionFromStorage(): SessionStorageData {\n const keys = this.getStorageKeys();\n try {\n if (this.persistentSessionExpire > 0) {\n const lastActivity = localStorage.getItem(keys.lastActivity);\n if (lastActivity) {\n const lastActivityDate = new Date(lastActivity);\n const minutesSinceActivity = (Date.now() - lastActivityDate.getTime()) / (1000 * 60);\n if (minutesSinceActivity > this.persistentSessionExpire) {\n this.clearSessionStorage();\n return {messages: []};\n }\n }\n }\n\n const storedSessionId = localStorage.getItem(keys.sessionId);\n const sessionId = storedSessionId ? storedSessionId : undefined;\n\n const messagesJson = localStorage.getItem(keys.messages);\n let messages: ChatMessage[] = [];\n\n if (messagesJson) {\n try {\n const parsedMessages = JSON.parse(messagesJson);\n messages = Array.isArray(parsedMessages) ? parsedMessages : [];\n } catch (parseError) {\n console.warn('Failed to parse messages from localStorage:', parseError);\n messages = [];\n }\n }\n\n return { sessionId, messages };\n } catch (error) {\n // fall back to starting a new session\n console.warn('Failed to load chat session from localStorage, starting new session:', error);\n return { messages: [] };\n }\n }\n\n private getOrGenerateUserId(): string {\n if (this.userId) {\n return this.userId;\n }\n\n if (this.generatedUserId) {\n return this.generatedUserId;\n }\n\n const storageKey = `ocs-user-id`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.generatedUserId = stored;\n return stored;\n }\n\n const array = new Uint8Array(9);\n window.crypto.getRandomValues(array);\n const randomString = Array.from(array, byte => byte.toString(36)).join('').substr(0, 9);\n const newUserId = `ocs:${Date.now()}_${randomString}`;\n this.generatedUserId = newUserId;\n localStorage.setItem(storageKey, newUserId);\n\n return newUserId;\n }\n\n private clearSessionStorage(): void {\n const keys = this.getStorageKeys();\n try {\n localStorage.removeItem(keys.sessionId);\n localStorage.removeItem(keys.messages);\n localStorage.removeItem(keys.lastActivity);\n } catch (error) {\n console.warn('Failed to clear chat session from localStorage:', error);\n }\n }\n\n private isLocalStorageAvailable(): boolean {\n try {\n localStorage.setItem(OcsChat.LOCALSTORAGE_TEST_KEY, 'test');\n localStorage.removeItem(OcsChat.LOCALSTORAGE_TEST_KEY);\n return true;\n } catch {\n return false;\n }\n }\n\n private showConfirmationDialog(): void {\n this.showNewChatConfirmation = true;\n }\n\n private hideConfirmationDialog(): void {\n this.showNewChatConfirmation = false;\n }\n\n private async confirmNewChat(): Promise<void> {\n this.hideConfirmationDialog();\n await this.actuallyStartNewChat();\n }\n\n private async actuallyStartNewChat(): Promise<void> {\n this.clearSessionStorage();\n this.sessionId = undefined;\n this.messages = [];\n this.isTyping = false;\n this.currentPollTaskId = '';\n if (this.allowAttachments) {\n this.selectedFiles = [];\n }\n this.cleanup();\n\n await this.startSession();\n }\n\n private toggleFullscreen(): void {\n this.isFullscreen = !this.isFullscreen;\n // Reset fullscreen position when toggling\n this.fullscreenPosition = { x: 0 };\n }\n\n render() {\n // Only show error state for critical errors that prevent the widget from functioning\n if (this.error && !this.sessionId) {\n return (\n <Host>\n <p class=\"error-message\">{this.error}</p>\n </Host>\n );\n }\n\n return (\n <Host>\n {this.renderButton()}\n {this.visible && (\n <div\n ref={(el) => this.chatWindowRef = el}\n id=\"ocs-chat-window\"\n class={this.getPositionClasses()}\n style={this.getPositionStyles()}\n >\n {/* Header */}\n <div\n class={`chat-header ${this.isDragging ? 'chat-header-dragging' : 'chat-header-draggable'}`}\n onMouseDown={this.handleMouseDown}\n onTouchStart={this.handleTouchStart}\n >\n {/* Drag indicator */}\n <div class=\"drag-indicator\">\n <div class=\"drag-dots header-button\">\n <GripDotsVerticalIcon/>\n </div>\n </div>\n <div class=\"header-text\">{this.headerText}</div>\n <div class=\"header-buttons\">\n {/* New Chat button */}\n {this.messages.length > 0 && (\n <button\n class=\"header-button\"\n onClick={() => this.showConfirmationDialog()}\n title=\"Start new chat\"\n aria-label=\"Start new chat\"\n >\n <PlusWithCircleIcon/>\n </button>\n )}\n {/* Fullscreen toggle button */}\n {this.allowFullScreen && <button\n class=\"header-button fullscreen-button\"\n onClick={() => this.toggleFullscreen()}\n title={this.isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n aria-label={this.isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n >\n {this.isFullscreen ? <ArrowsPointingInIcon/> : <ArrowsPointingOutIcon/>}\n </button>}\n <button\n class=\"header-button\"\n onClick={() => this.visible = false}\n aria-label=\"Close\"\n >\n <XMarkIcon/>\n </button>\n </div>\n </div>\n\n {this.showNewChatConfirmation && (\n <div class=\"confirmation-overlay\">\n <div class=\"confirmation-dialog\">\n <div class=\"confirmation-content\">\n <h3 class=\"confirmation-title\">Start New Chat</h3>\n <p class=\"confirmation-message\">\n {this.newChatConfirmationMessage}\n </p>\n <div class=\"confirmation-buttons\">\n <button\n class=\"confirmation-button confirmation-button-cancel\"\n onClick={() => this.hideConfirmationDialog()}\n >\n Cancel\n </button>\n <button\n class=\"confirmation-button confirmation-button-confirm\"\n onClick={() => this.confirmNewChat()}\n >\n Continue\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chat Content */}\n <div class=\"chat-content\">\n {/* Loading State */}\n {this.isLoading && !this.sessionId && (\n <div class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <span class=\"loading-text\">Starting chat...</span>\n </div>\n )}\n\n {/* Messages */}\n {(\n <div\n ref={(el) => this.messageListRef = el}\n class=\"messages-container\"\n >\n {this.messages.length === 0 && this.parsedWelcomeMessages.length > 0 && (\n <div class=\"welcome-messages\">\n {/* Welcome Messages */}\n {this.parsedWelcomeMessages.map((message, index) => (\n <div key={`welcome-${index}`} class=\"message-row message-row-assistant\">\n <div class=\"message-bubble message-bubble-assistant\">\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message)}\n ></div>\n </div>\n </div>\n ))}\n </div>\n )}\n {/* Regular Chat Messages */}\n {this.messages.map((message, index) => (\n <div\n key={index}\n class={`message-row ${\n message.role === 'user' ? 'message-row-user' : 'message-row-assistant'\n }`}\n >\n <div\n class={`message-bubble ${\n message.role === 'user'\n ? 'message-bubble-user'\n : message.role === 'assistant'\n ? 'message-bubble-assistant'\n : 'message-bubble-system'\n }`}\n >\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message.content)}\n ></div>\n {message.attachments && message.attachments.length > 0 && (\n <div class=\"message-attachments\">\n {message.attachments.map((attachment, attachmentIndex) => (\n <div key={attachmentIndex} class=\"flex items-center gap-[0.5em]\">\n <span class=\"message-attachment-icon\">\n <PaperClipIcon />\n </span>\n <span class=\"message-attachment-name\">{attachment.name}</span>\n </div>\n ))}\n </div>\n )}\n <div class=\"message-timestamp\">\n {this.formatTime(message.created_at)}\n </div>\n </div>\n </div>\n ))}\n {/* Typing Indicator */}\n {this.isTyping && (\n <div>\n <div class=\"typing-indicator\">\n <div class=\"typing-progress\"></div>\n </div>\n <div class=\"typing-text\">\n <span>{this.typingIndicatorText}</span>\n <span class=\"typing-dots\"></span>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Starter Questions */}\n {this.messages.length === 0 && this.parsedStarterQuestions.length > 0 && (\n <div class=\"starter-questions\">\n {this.parsedStarterQuestions.map((question, index) => (\n <div key={`starter-${index}`} class=\"starter-question-row\">\n <button\n class=\"starter-question\"\n onClick={() => this.handleStarterQuestionClick(question)}\n >\n {question}\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Selected Files Display */}\n {this.allowAttachments && this.selectedFiles.length > 0 && (\n <div class=\"selected-files-container\">\n <div class=\"space-y-[0.25em]\">\n {this.selectedFiles.map((selectedFile, index) => (\n <div key={index} class=\"selected-file-item\">\n <div class=\"flex items-center gap-[0.5em]\">\n <span class=\"selected-file-icon\">\n <PaperClipIcon/>\n </span>\n <span>{selectedFile.file.name}</span>\n <span class=\"selected-file-size\">({this.formatFileSize(selectedFile.file.size)})</span>\n {selectedFile.error && (\n <span class=\"selected-file-error\">{selectedFile.error}</span>\n )}\n {selectedFile.uploaded && (\n <span class=\"selected-file-success-icon\"><CheckDocumentIcon /></span>\n )}\n </div>\n <button\n onClick={() => this.removeSelectedFile(index)}\n class=\"selected-file-remove-button\"\n aria-label=\"Remove file\"\n ><XIcon />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Input Area */}\n {this.sessionId && (\n <div class=\"input-area\">\n <div class=\"input-container\">\n <textarea\n ref={(el) => this.textareaRef = el}\n class=\"message-textarea\"\n rows={1}\n placeholder=\"Type your message...\"\n value={this.messageInput}\n onInput={(e) => this.handleInputChange(e)}\n onKeyPress={(e) => this.handleKeyPress(e)}\n disabled={this.isTyping || this.isUploadingFiles}\n ></textarea>\n {/* File Upload Button */}\n {this.allowAttachments && (\n <input\n ref={(el) => {\n // Unclear why but after removing all attachments this is being set to `null`.\n if (el) {this.fileInputRef = el}\n }\n }\n id=\"ocs-file-input\"\n type=\"file\"\n multiple\n accept={OcsChat.SUPPORTED_FILE_EXTENSIONS.join(',')}\n onChange={(e) => this.handleFileSelect(e)}\n class=\"hidden\"\n />\n )}\n {this.allowAttachments && (\n <button\n class=\"file-attachment-button\"\n onClick={() => this.fileInputRef?.click()}\n disabled={this.isTyping || this.isUploadingFiles}\n title=\"Attach files\"\n aria-label=\"Attach files\"\n >\n <PaperClipIcon />\n </button>\n )}\n <button\n class={`send-button ${\n !this.isTyping && !!this.messageInput.trim()\n ? 'send-button-enabled'\n : 'send-button-disabled'\n }`}\n onClick={() => this.sendMessage(this.messageInput)}\n disabled={this.isTyping || this.isUploadingFiles || !this.messageInput.trim()}\n >\n {this.isUploadingFiles ? 'Uploading...' : 'Send'}\n </button>\n </div>\n </div>\n )}\n <div class=\"flex items-center justify-center text-[0.8em] font-light w-full text-slate-500 py-[2px]\">\n <p>Powered by <a class=\"underline\" href=\"https://www.dimagi.com\" target=\"_blank\">Dimagi</a></p>\n </div>\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n"]}
|
package/dist/components/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { getAssetPath, setAssetPath, setNonce, setPlatformOptions } from '@stencil/core/internal/client';
|
|
1
|
+
export { getAssetPath, render, setAssetPath, setNonce, setPlatformOptions } from '@stencil/core/internal/client';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
2
3
|
|
|
3
4
|
//# sourceMappingURL=index.js.map
|