vg-x07df 1.9.0 → 1.9.1
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/channel/index.cjs.map +1 -1
- package/dist/channel/index.d.cts +1 -1
- package/dist/channel/index.d.ts +1 -1
- package/dist/channel/index.mjs.map +1 -1
- package/dist/index.cjs +242 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +82 -4
- package/dist/index.d.ts +82 -4
- package/dist/index.mjs +241 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{types-DbGItZmC.d.cts → types-Co2i-Cgs.d.cts} +8 -1
- package/dist/{types-DbGItZmC.d.ts → types-Co2i-Cgs.d.ts} +8 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/logger.ts","../../src/channel/DataChannelContext.ts","../../src/state/types.ts","../../src/state/store.ts","../../src/channel/chat/store.ts","../../src/channel/chat/utils.ts","../../src/channel/chat/service.ts","../../src/channel/chat/useChat.ts","../../src/channel/raiseHand/store.ts","../../src/channel/raiseHand/service.ts","../../src/channel/raiseHand/useRaiseHand.ts","../../src/channel/reactions/store.ts","../../src/channel/reactions/utils.ts","../../src/channel/reactions/service.ts","../../src/channel/reactions/useReactions.ts","../../src/channel/spotlight/store.ts","../../src/channel/spotlight/service.ts","../../src/channel/spotlight/useSpotlight.ts","../../src/channel/registry.ts","../../src/channel/DataChannelProvider.tsx"],"names":["createContext","useContext","create","immer","entry","nanoid","ConnectionState","useMemo","useCallback","react","defaultState","logger","useRef","useState","useEffect"],"mappings":";;;;;;;;;;;;AA6BA,IAAM,UAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,CAAA;AAAA,EACP,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,iBAAA,GAAN,MAAM,kBAAA,CAA2C;AAAA,EAM/C,WAAA,CAAY,SAAA,GAAY,SAAA,EAAW,OAAA,GAAyB,EAAC,EAAG;AAC9D,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,eAAA,EAAgB;AACnD,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,iBAAA,EAAkB;AACjE,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,eAAA,GAA4B;AAClC,IAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GACb,MAAA,CAAe,qBAAA,GAChB,OAAO,UAAA,KAAe,WAAA,IACrB,UAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,iBAAA;AAExC,IAAA,IAAI,QAAA,IAAY,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC9C,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,eACJ,OAAO,UAAA,KAAe,eACrB,UAAA,CAAmB,OAAA,EAAS,KAAK,QAAA,KAAa,YAAA;AAEjD,IAAA,OAAO,eAAe,MAAA,GAAS,MAAA;AAAA,EACjC;AAAA,EAEQ,iBAAA,GAA6B;AACnC,IAAA,MAAM,QAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GACb,MAAA,CAAe,SAAA,GAChB,OAAO,UAAA,KAAe,WAAA,IACrB,UAAA,CAAmB,OAAA,EAAS,GAAA,EAAK,KAAA;AAExC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAEtB,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC7C,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,CAAC,OAAA,KAAoB;AAC7C,MAAA,IAAI,OAAA,KAAY,KAAK,OAAO,IAAA;AAC5B,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,KAAK,SAAA,KAAc,OAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAgB,KAAA,EAAwB;AAC9C,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,EAC/C;AAAA,EAEQ,UAAU,KAAA,EAA0B;AAC1C,IAAA,IAAI,KAAA,KAAU,OAAA,IAAW,CAAC,IAAA,CAAK,WAAA,EAAa;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,UAAA,CAAW,KAAK,CAAA,IAAK,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,EACnD;AAAA,EAEQ,aAAA,CAAc,KAAA,EAAiB,OAAA,EAAiB,IAAA,EAAkB;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,IAAA,MAAM,MAAA,GAAS,IAAI,SAAS,CAAA,GAAA,EAAM,KAAK,SAAS,CAAA,GAAA,EAAM,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,CAAA;AAEzE,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GACJ,KAAA,KAAU,OAAA,GACN,OAAA,CAAQ,KAAA,GACR,KAAA,KAAU,MAAA,GACR,OAAA,CAAQ,IAAA,GACR,KAAA,KAAU,MAAA,GACR,OAAA,CAAQ,OACR,OAAA,CAAQ,GAAA;AAElB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,SAAA,CAAU,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,IAAI,IAAI,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAAA,EAC1C;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,SAAA,EAAkC;AACtC,IAAA,MAAM,cAAA,GAAiB,CAAA,EAAG,IAAA,CAAK,SAAS,IAAI,SAAS,CAAA,CAAA;AACrD,IAAA,MAAM,YAAA,GAA8B;AAAA,MAClC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,aAAa,IAAA,CAAK;AAAA,KACpB;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,YAAA,CAAa,eAAe,IAAA,CAAK,YAAA;AAAA,IACnC;AACA,IAAA,OAAO,IAAI,kBAAA,CAAkB,cAAA,EAAgB,YAAY,CAAA;AAAA,EAC3D;AAAA,EAEA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,eAAe,KAAA,EAA0B;AACvC,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AACF,CAAA;AAEA,IAAI,UAAA,GAAmC,IAAA;AAEhC,SAAS,YAAA,CACd,WACA,OAAA,EACe;AACf,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,UAAA,GAAa,IAAI,iBAAA,CAAkB,SAAA,EAAW,OAAO,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,iBAAA,CAAkB,CAAA,QAAA,EAAW,SAAS,IAAI,OAAO,CAAA;AAC9D;AC3KO,IAAM,kBAAA,GAAqBA,mBAAA;AAAA,EAChC;AACF,CAAA;AAEO,SAAS,qBAAA,GAAiD;AAC/D,EAAA,MAAM,OAAA,GAAUC,iBAAW,kBAAkB,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,kBAA2B,WAAA,EAAwB;AACjE,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,qBAAA,EAAsB;AAC3C,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,oBAAoB,WAAW,CAAA,2DAAA;AAAA,KACjC;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;;;ACwDO,IAAM,YAAA,GAAyB;AAAA,EACpC,SAAA,EAAW,KAAA;AAAA,EACX,OAAA,EAAS,IAAA;AAAA,EACT,cAAA,EAAgB,IAAA;AAAA,EAChB,iBAAiB,EAAC;AAAA,EAClB,QAAQ;AACV,CAAA;;;ACjFO,IAAM,cAAcC,cAAA,EAA2B;AAAA,EACpDC,WAAA,CAAM,CAAC,GAAA,MAAS;AAAA,IACd,GAAG,YAAA;AAAA,IAEH,KAAA,EAAO,CAAC,EAAA,KACN,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,EAAA,CAAG,KAAK,CAAA;AAAA,IACV,CAAC,CAAA;AAAA,IAEH,KAAA,EAAO,MAAM,GAAA,CAAI,MAAM,YAAY,CAAA;AAAA,IAEnC,QAAA,EAAU,CAAC,KAAA,KACT,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,IAEH,WAAA,EAAa,MACX,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,SAAS,EAAC;AAAA,IAClB,CAAC;AAAA,GACL,CAAE;AACJ,CAAA;ACRA,IAAM,gBAAA,GAA8B;AAAA,EAClC,MAAM,EAAC;AAAA,EACP,OAAO,EAAC;AAAA,EACR,YAAY,EAAC;AAAA,EACb,kBAAkB,EAAC;AAAA,EACnB,UAAA,EAAY;AACd,CAAA;AAEA,SAAS,oBAAA,CACP,KAAA,EACA,KAAA,EACA,aAAA,EACA,EAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,mBAAI,IAAI,GAAA,EAAI;AAAA,EACnC;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG,GAAA,CAAI,aAAa,CAAA;AAAA,EAC3C,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG,MAAA,CAAO,aAAa,CAAA;AAC5C,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG,SAAS,CAAA,EAAG;AACtC,MAAA,OAAO,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,KAAA,EAAkB;AAC7C,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,MAAM,UAAA,EAAY;AACrD,IAAA,MAAM,kBAAkB,MAAA,CAAO,IAAA,CAAK,MAAM,IAAI,CAAA,CAAE,SAAS,KAAA,CAAM,UAAA;AAC/D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC9B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,MAC5B;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA;AAAA,EACjD;AACF;AAEO,IAAM,eAAeD,cAAAA,EAAgC;AAAA,EAC1DC,WAAAA,CAAM,CAAC,GAAA,MAAS;AAAA,IACd,GAAG,gBAAA;AAAA,IAEH,KAAA,EAAO,CAAC,EAAA,KACN,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,EAAA,CAAG,KAAK,CAAA;AAAA,IACV,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,CAAC,QAAA,KACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,IAAI,QAAA,CAAS,SAAS,OAAA,EAAS;AAC7B,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAChC,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,UAAA,KAAA,CAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAAI,SAAS,MAAA,CAAO,IAAA;AAAA,QAC/D;AAEA,QAAA,MAAM,KAAA,GAAmB;AAAA,UACvB,IAAI,QAAA,CAAS,OAAA;AAAA,UACb,OAAA,EAAS,SAAS,OAAA,CAAQ,OAAA;AAAA,UAC1B,MAAA,EAAQ;AAAA,YACN,EAAA,EAAI,SAAS,MAAA,CAAO;AAAA,WACtB;AAAA,UACA,WAAW,QAAA,CAAS,EAAA;AAAA,UACpB,OAAA,EAAS,CAAA;AAAA,UACT,WAAW,EAAC;AAAA,UACZ,MAAA,EAAQ,MAAA;AAAA,UACR,QAAA,EAAU,QAAA,CAAS,OAAA,EAAS,IAAA,EAAM;AAAA,SACpC;AAEA,QAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,GAAI,KAAA;AAC/B,QAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAEjC,QAAA,mBAAA,CAAoB,KAAK,CAAA;AAEzB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AACpD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAExC,UAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,YAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAQ;AACtB,cAAA,MAAMC,MAAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,OAAO,CAAA;AACnC,cAAA,IAAIA,MAAAA,IAAS,EAAA,CAAG,OAAA,CAAQ,OAAA,GAAUA,OAAM,OAAA,EAAS;AAC/C,gBAAAA,MAAAA,CAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,UAAA;AAC3B,gBAAAA,MAAAA,CAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,OAAA;AAC3B,gBAAAA,MAAAA,CAAM,WAAW,EAAA,CAAG,EAAA;AAAA,cACtB;AAAA,YACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU;AAC/B,cAAA,MAAMA,MAAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,OAAO,CAAA;AACnC,cAAA,IAAIA,MAAAA,IAAS,CAACA,MAAAA,CAAM,SAAA,EAAW;AAC7B,gBAAAA,MAAAA,CAAM,YAAY,EAAA,CAAG,EAAA;AAAA,cACvB;AAAA,YACF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,cAAA,IAAI,EAAA,CAAG,OAAO,IAAA,EAAM;AAClB,gBAAA,KAAA,CAAM,iBAAiB,EAAA,CAAG,MAAA,CAAO,EAAE,CAAA,GAAI,GAAG,MAAA,CAAO,IAAA;AAAA,cACnD;AAEA,cAAA,MAAMA,MAAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,OAAO,CAAA;AACnC,cAAA,IAAIA,MAAAA,EAAO;AACT,gBAAA,oBAAA;AAAA,kBACEA,MAAAA;AAAA,kBACA,GAAG,OAAA,CAAQ,KAAA;AAAA,kBACX,GAAG,MAAA,CAAO,EAAA;AAAA,kBACV,GAAG,OAAA,CAAQ;AAAA,iBACb;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ;AACnC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,QAAA,CAAS,OAAA,CAAQ,OAAA,GAAU,KAAA,CAAM,OAAA,EAAS;AAC5C,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,UAAA;AACjC,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,OAAA;AACjC,YAAA,KAAA,CAAM,WAAW,QAAA,CAAS,EAAA;AAAA,UAC5B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,YAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,GAAI,EAAC;AAAA,UACxC;AACA,UAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,KAAK,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AACrC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,YAAA,KAAA,CAAM,YAAY,QAAA,CAAS,EAAA;AAAA,UAC7B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,YAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,GAAI,EAAC;AAAA,UACxC;AACA,UAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,KAAK,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,UAAA,EAAY;AACvC,QAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,UAAA,KAAA,CAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAAI,SAAS,MAAA,CAAO,IAAA;AAAA,QAC/D;AAEA,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,oBAAA;AAAA,YACE,KAAA;AAAA,YACA,SAAS,OAAA,CAAQ,KAAA;AAAA,YACjB,SAAS,MAAA,CAAO,EAAA;AAAA,YAChB,SAAS,OAAA,CAAQ;AAAA,WACnB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG;AACvC,YAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,GAAI,EAAC;AAAA,UACxC;AACA,UAAA,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,KAAK,QAAQ,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,SAAS,CAAC,IAAA,EAAM,QAAA,KACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,MAAM,WAAW,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,aAAa,QAAQ,CAAA;AACjE,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,MAAA,KAAA,CAAO,IAAA,GAAO,IAAA;AACd,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAO,EAAE,CAAA,GAAI,KAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,IAEH,kBAAA,EAAoB,CAAC,KAAA,KACnB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AACvB,MAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA;AAEzB,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,CAAC,OAAA,KACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,MAAA,GAAS,MAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,eAAA,EAAiB,CAAC,OAAA,KAChB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,WAAW,CAAC,OAAA,EAAS,YAAY,OAAA,KAC/B,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,IAAS,OAAA,GAAU,KAAA,CAAM,OAAA,EAAS;AACpC,QAAA,KAAA,CAAM,OAAA,GAAU,UAAA;AAChB,QAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,QAAA,KAAA,CAAM,QAAA,GAAW,KAAK,GAAA,EAAI;AAAA,MAC5B;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,WAAA,EAAa,CAAC,OAAA,KACZ,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,SAAA,EAAW;AAC7B,QAAA,KAAA,CAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,MAC7B;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,CAAC,OAAA,EAAS,KAAA,EAAO,eAAe,EAAA,KAC7C,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,oBAAA,CAAqB,KAAA,EAAO,KAAA,EAAO,aAAA,EAAe,EAAE,CAAA;AAAA,MACtD;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,gBAAgB,CAAC,OAAA,EAAS,QAAA,KACxB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,EAAG;AAC9B,QAAA,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,GAAI,EAAC;AAAA,MAC/B;AACA,MAAA,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AAAA,IACzC,CAAC,CAAA;AAAA,IAEH,iBAAA,EAAmB,CAAC,OAAA,KAClB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAC3C,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA;AAAA,MACF;AAEA,MAAA,OAAO,KAAA,CAAM,WAAW,OAAO,CAAA;AAE/B,MAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,QAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,UAAA,IAAI,KAAA,IAAS,QAAA,CAAS,OAAA,CAAQ,OAAA,GAAU,MAAM,OAAA,EAAS;AACrD,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,UAAA;AACjC,YAAA,KAAA,CAAM,OAAA,GAAU,SAAS,OAAA,CAAQ,OAAA;AACjC,YAAA,KAAA,CAAM,WAAW,QAAA,CAAS,EAAA;AAAA,UAC5B;AAAA,QACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,QAAA,EAAU;AACrC,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,UAAA,IAAI,KAAA,IAAS,CAAC,KAAA,CAAM,SAAA,EAAW;AAC7B,YAAA,KAAA,CAAM,YAAY,QAAA,CAAS,EAAA;AAAA,UAC7B;AAAA,QACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,UAAA,EAAY;AACvC,UAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,YAAA,KAAA,CAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,GAAI,SAAS,MAAA,CAAO,IAAA;AAAA,UAC/D;AAEA,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACzC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,oBAAA;AAAA,cACE,KAAA;AAAA,cACA,SAAS,OAAA,CAAQ,KAAA;AAAA,cACjB,SAAS,MAAA,CAAO,EAAA;AAAA,cAChB,SAAS,OAAA,CAAQ;AAAA,aACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,cAAA,EAAgB,MACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,IAEH,SAAA,EAAW,MAAM,GAAA,CAAI,MAAM,gBAAgB;AAAA,GAC7C,CAAE;AACJ;ACzSO,SAAS,cAAA,CAAe,GAAc,CAAA,EAAsB;AACjE,EAAA,IAAI,CAAA,CAAE,SAAA,KAAc,CAAA,CAAE,SAAA,EAAW;AAC/B,IAAA,OAAO,CAAA,CAAE,YAAY,CAAA,CAAE,SAAA;AAAA,EACzB;AAEA,EAAA,IAAI,CAAA,CAAE,MAAA,CAAO,EAAA,KAAO,CAAA,CAAE,OAAO,EAAA,EAAI;AAC/B,IAAA,OAAO,EAAE,MAAA,CAAO,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAChC;AAEO,SAAS,gBAAgB,OAAA,EAG9B;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAE7B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,EAC1D;AAEA,EAAA,MAAM,cAAc,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AACtD,EAAA,IAAI,cAAc,KAAA,EAAO;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,4BAAA,EAA6B;AAAA,EAC7D;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAEO,SAAS,gBAAgB,IAAA,EAA6B;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AAChB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAChE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IACE,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,IACvB,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,IACxB,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,EACnB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,QAAA,EAAU;AACtD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IACE,IAAA,CAAK,SAAS,OAAA,IACd,IAAA,CAAK,SAAS,MAAA,IACd,IAAA,CAAK,SAAS,UAAA,EACd;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,OAAO,IAAA,CAAK,YAAY,QAAA,EAAU;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAOC,aAAA,EAAO;AAChB;AAEO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;;;AChEA,IAAM,MAAA,GAAS,aAAa,MAAM,CAAA;AAE3B,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAAY,IAAA,EAAY;AAFxB,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAGrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,KAAUC,6BAAA,CAAgB,SAAA,EAAW;AACjD,MAAA,MAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB;AAC/B,MAAA,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA;AAAA,MACR,SAAA;AAAA,MACA,OAAO,QAAQ,eAAA,KAAoB;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,EAAQ;AAClC,UAAA,OAAA,CAAQ,GAAA,CAAI,mBAAA,EAAqB,IAAA,EAAM,eAAA,CAAgB,QAAQ,CAAA;AAC/D,UAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAAA,QACjC,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA;AAAA,MACR,SAAA;AAAA,MACA,OAAO,QAAQ,eAAA,KAAoB;AACjC,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,UAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AAGtB,UAAA,MAAM,KAAA,GAAA,CAAS,MAAM,MAAA,CAAO,OAAA,EAAQ,EAAG,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,EAAO,CAAA;AACnE,UAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AAExD,UAAA,IAAA,CAAK,kBAAA,CAAmB,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AAAA,QAC3D,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,KACF;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAK,gBAAA,CAAiB,QAAA;AAAA,EACpC;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,EAAiB,IAAA,EAA4B;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,yCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GACJ,QAAQ,MAAA,KAAW,CAAA,IAAK,OAAO,IAAA,KAAS,WAAA,GAAc,KAAK,IAAA,GAAO,OAAA;AAEpE,IAAA,MAAM,UAAA,GAAa,gBAAgB,cAAc,CAAA;AACjD,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,WAAW,KAAA,IAAS,iBAAA;AAAA,QAC7B,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACzB,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAA,CAAW,EAAE,CAAA,GAAI,UAAA,CAAW,IAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,KAAA,GAAmB;AAAA,MACvB,EAAA,EAAI,OAAA;AAAA,MACJ,OAAA,EAAS,cAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,IAAI,UAAA,CAAW;AAAA,OACjB;AAAA,MACA,WAAW,mBAAA,EAAoB;AAAA,MAC/B,OAAA,EAAS,CAAA;AAAA,MACT,WAAW,EAAC;AAAA,MACZ,MAAA,EAAQ,SAAA;AAAA,MACR;AAAA,KACF;AAEA,IAAA,SAAA,CAAU,mBAAmB,KAAK,CAAA;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,OAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,KAAA,CAAM,SAAA;AAAA,QACV,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,OAAA;AAAA,UACA,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA;AAAK;AAC/B,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,IAAA,EAAM;AAAA,UAC9C,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AACA,MAAA,SAAA,CAAU,cAAc,OAAO,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,CAAU,gBAAgB,OAAO,CAAA;AACjC,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,kBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,OAAA,EAAiB,UAAA,EAAmC;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,yCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,gBAAgB,UAAU,CAAA;AAC7C,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,WAAW,KAAA,IAAS,iBAAA;AAAA,QAC7B,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,UAAA,CAAW,EAAA,EAAI;AACrC,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,qCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,GAAU,CAAA;AACnC,IAAA,SAAA,CAAU,SAAA,CAAU,OAAA,EAAS,UAAA,EAAY,UAAU,CAAA;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,UAAA;AAAA,UACA,OAAA,EAAS;AAAA;AACX,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,kBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAA,EAAgC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,2CAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,iBAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,UAAA,CAAW,EAAA,EAAI;AACrC,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,uCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,QAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA;AAAQ,OACpB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,CAAM,OAAA,EAAiB,KAAA,EAA8B;AACzD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,yCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACzB,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAA,CAAW,EAAE,CAAA,GAAI,UAAA,CAAW,IAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAA,CAAU,aAAA,CAAc,OAAA,EAAS,KAAA,EAAO,UAAA,CAAW,IAAI,KAAK,CAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,KAAA;AAAA,UACA,EAAA,EAAI;AAAA;AACN,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,wBAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA,EAAS,KAAA;AAAM,OAC3B,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAQ,OAAA,EAAiB,KAAA,EAA8B;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,OAAA,EAAS,4CAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,SAAA,CAAU,KAAA,CAAM,CAAC,KAAA,KAAU;AACzB,QAAA,KAAA,CAAM,gBAAA,CAAiB,UAAA,CAAW,EAAE,CAAA,GAAI,UAAA,CAAW,IAAA;AAAA,MACrD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAA,CAAU,aAAA,CAAc,OAAA,EAAS,KAAA,EAAO,UAAA,CAAW,IAAI,QAAQ,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,OAAA;AAAA,QACA,IAAI,mBAAA,EAAoB;AAAA,QACxB,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,KAAA;AAAA,UACA,EAAA,EAAI;AAAA;AACN,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,2BAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,OAAA,EAAS,KAAA;AAAM,OAC3B,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,sBAAsB,IAAA,EAAoB;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,IAAI,CAAC,eAAA,CAAgB,MAAM,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,IAAA,CAAK,6BAA6B,MAAM,CAAA;AAC/C,QAAA;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,QAAA,EAAS,CAAE,aAAA,CAAc,MAAM,CAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,KAAA,CAAM,kCAAkC,KAAK,CAAA;AAAA,IACtD;AAAA,EACF;AAAA,EAEQ,kBAAA,CACN,IAAA,EACA,QAAA,EACA,QAAA,EACM;AACN,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,IAAY,IAAA,CAAK,IAAA,EAAM,CAAA;AAEvE,MAAA,YAAA,CAAa,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,IACnD;AAAA,EACF;AAAA,EAEQ,aAAA,GAA4D;AAClE,IAAA,MAAM,gBAAA,GAAmB,KAAK,IAAA,CAAK,gBAAA;AACnC,IAAA,MAAM,MAAA,GAAqD;AAAA,MACzD,IAAI,gBAAA,CAAiB;AAAA,KACvB;AAEA,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,OAAO,IAAA,CAAK,KAAA;AAAA,UACjB,gBAAA,CAAiB;AAAA,SACnB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AC9aO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,OAAA,GAAU,kBAA+B,MAAM,CAAA;AAErD,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,KAAA,KAAU,MAAM,KAAK,CAAA;AACjD,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,CAAC,KAAA,KAAU,MAAM,gBAAgB,CAAA;AAEvE,EAAA,MAAM,OAAA,GAAUC,cAAQ,MAAM;AAC5B,IAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,EAAA,KAAO,KAAK,EAAE,CAAC,CAAA,CACpB,MAAA,CAAO,CAAC,KAAA,KAA8B,KAAA,KAAU,MAAS,CAAA,CACzD,KAAK,cAAc,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,MAAM,kBAAA,GAAqBC,iBAAA;AAAA,IACzB,CAAC,EAAA,KAA8C;AAC7C,MAAA,OAAO,gBAAA,CAAiB,EAAE,CAAA,IAAK,IAAA;AAAA,IACjC,CAAA;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,IAAA,GAAOA,iBAAA;AAAA,IACX,OAAO,OAAA,EAAiB,IAAA,KAAgB,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IAClE,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,IAAA,GAAOA,iBAAA;AAAA,IACX,OAAO,EAAA,EAAY,OAAA,KAAoB,OAAA,CAAQ,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,IAC/D,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,MAAA,GAASA,iBAAA;AAAA,IACb,OAAO,EAAA,KAAe,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,IACvC,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAMC,OAAA,GAAQD,iBAAA;AAAA,IACZ,OAAO,EAAA,EAAY,KAAA,KAAkB,OAAA,CAAQ,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IAC5D,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,OAAA,GAAUA,iBAAA;AAAA,IACd,OAAO,EAAA,EAAY,KAAA,KAAkB,OAAA,CAAQ,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IAC9D,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAA;AAAA,IACjB,CAAC,KAAA,KAAqB,KAAA,CAAM,MAAA,CAAO,EAAA,KAAO,QAAQ,qBAAA,EAAsB;AAAA,IACxE,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,kBAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,WACAC,OAAA;AAAA,IACA;AAAA,GACF;AACF;ACrEA,IAAMC,aAAAA,GAA+B;AAAA,EACnC,WAAA,sBAAiB,GAAA,EAAI;AAAA,EACrB,SAAA,EAAW;AACb,CAAA;AAEO,IAAM,oBAAoBR,cAAAA,EAA0C;AAAA,EACzEC,WAAAA,CAAM,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,IACnB,GAAGO,aAAAA;AAAA,IAEH,SAAA,EAAW,CAAC,aAAA,KACV,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,IAAI,CAAC,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA,EAAG;AACzC,QAAA,KAAA,CAAM,WAAA,CAAY,IAAI,aAAA,EAAe;AAAA,UACnC,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,UACb,OAAO,KAAA,CAAM,SAAA;AAAA,SACd,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,SAAA,EAAW,CAAC,aAAA,KACV,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,WAAA,CAAY,OAAO,aAAa,CAAA;AAEtC,MAAA,IAAI,KAAA,CAAM,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG;AAChC,QAAA,KAAA,CAAM,SAAA,GAAY,CAAA;AAAA,MACpB;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,MACb,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,YAAY,KAAA,EAAM;AACxB,MAAA,KAAA,CAAM,SAAA,GAAY,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,IAEH,cAAc,CAAC,aAAA,KAAkB,KAAI,CAAE,WAAA,CAAY,IAAI,aAAa,CAAA;AAAA,IAEpE,kBAAA,EAAoB,CAAC,aAAA,KAAkB;AACrC,MAAA,MAAM,IAAA,GAAO,GAAA,EAAI,CAAE,WAAA,CAAY,IAAI,aAAa,CAAA;AAChD,MAAA,OAAO,MAAM,KAAA,IAAS,IAAA;AAAA,IACxB,CAAA;AAAA,IAEA,qBAAA,EAAuB,CAAC,EAAA,EAAI,IAAA,KAAS;AAAA,IAErC,CAAA;AAAA,IAEA,KAAA,EAAO,MACL,GAAA,CAAI,OAAO;AAAA,MACT,WAAA,sBAAiB,GAAA,EAAI;AAAA,MACrB,SAAA,EAAW;AAAA,KACb,CAAE;AAAA,GACN,CAAE;AACJ;AAEO,SAAS,uBAAuB,QAAA,EAAmC;AACxE,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,eAAe,qBAAA,EAAsB,GACjE,kBAAkB,QAAA,EAAS;AAE7B,EAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,IAAA,qBAAA,CAAsB,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,EAChE;AAEA,EAAA,QAAQ,QAAA,CAAS,QAAQ,MAAA;AAAQ,IAC/B,KAAK,OAAA,EAAS;AACZ,MAAA,SAAA,CAAU,QAAA,CAAS,OAAO,EAAE,CAAA;AAC5B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,QAAA,IAAY,SAAS,MAAA,CAAO,EAAA;AAC9D,MAAA,SAAA,CAAU,QAAQ,CAAA;AAClB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,aAAA,EAAc;AACd,MAAA;AAAA,IACF;AAAA;AAEJ;;;ACpFA,IAAMC,OAAAA,GAAS,aAAa,YAAY,CAAA;AAEjC,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAY,IAAA,EAAY;AAFxB,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAGrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAAA,OAAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,KAAUL,6BAAAA,CAAgB,SAAA,EAAW;AACjD,MAAAK,OAAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB;AAC/B,MAAAA,OAAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAI,KAAK,YAAA,EAAc;AAEvB,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA,CAA0B,eAAA,EAAiB,OAAO,MAAA,KAAW;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,EAAQ;AAClC,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B,SAAS,GAAA,EAAK;AACZ,QAAAA,OAAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,GAAG,CAAA;AAAA,MACrD;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAAA,OAAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,EAC3C;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAAA,OAAAA,CAAO,KAAK,+BAA+B,CAAA;AAAA,EAC7C;AAAA,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAK,gBAAA,CAAiB,QAAA;AAAA,EACpC;AAAA,EAEA,MAAM,SAAA,GAA2B;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,2BAAA;AAAA,QACN,OAAA,EAAS,uCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,iBAAA,CAAkB,QAAA,EAAS,CAAE,SAAA,CAAU,UAAA,CAAW,EAAE,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAA8B;AAAA,QAClC,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ;AAAA;AACV,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAAA,OAAAA,CAAO,MAAM,aAAa,CAAA;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,KAAK,CAAA;AAC1C,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,wBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,sBAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAAA,EAAkC;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,2BAAA;AAAA,QACN,OAAA,EAAS,uCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,CAAW,EAAA;AAC7C,IAAA,iBAAA,CAAkB,QAAA,EAAS,CAAE,SAAA,CAAU,aAAa,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAA8B;AAAA,QAClC,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,OAAA;AAAA,UACR,QAAA,EAAU;AAAA;AACZ,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAAA,QAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,QAAA,EAAU,eAAe,CAAA;AAAA,IAC1D,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,sBAAA,EAAwB,KAAK,CAAA;AAC1C,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,wBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,sBAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,GAA+B;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,gCAAA;AAAA,QACN,OAAA,EAAS,4CAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,iBAAA,CAAkB,QAAA,GAAW,aAAA,EAAc;AAE3C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAA8B;AAAA,QAClC,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,YAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ;AAAA;AACV,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAAA,OAAAA,CAAO,MAAM,mBAAmB,CAAA;AAAA,IAClC,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,2BAAA,EAA6B,KAAK,CAAA;AAC/C,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,6BAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,2BAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eAAe,IAAA,EAAoB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA,EAAG;AACjC,QAAAA,OAAAA,CAAO,IAAA,CAAK,sCAAA,EAAwC,MAAM,CAAA;AAC1D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,EAAA,KAAO,IAAA,CAAK,uBAAsB,EAAG;AACrD,QAAAA,OAAAA,CAAO,MAAM,uCAAuC,CAAA;AACpD,QAAA;AAAA,MACF;AAEA,MAAA,sBAAA,CAAuB,MAAM,CAAA;AAC7B,MAAAA,OAAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,QAC1C,MAAA,EAAQ,OAAO,OAAA,CAAQ;AAAA,OACxB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,2CAAA,EAA6C,KAAK,CAAA;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,gBAAgB,CAAA,EAAgC;AACtD,IAAA,OACE,KACA,CAAA,CAAE,CAAA,KAAM,KACR,CAAA,CAAE,IAAA,KAAS,gBACX,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,IACpB,EAAE,MAAA,KAAW,IAAA,CAAK,KAAK,IAAA,IACvB,OAAO,EAAE,EAAA,KAAO,QAAA,IAChB,CAAA,CAAE,EAAA,GAAK,KACP,OAAO,CAAA,CAAE,QAAQ,EAAA,KAAO,QAAA,IACxB,OAAO,CAAA,CAAE,OAAA,EAAS,WAAW,QAAA,IAC7B,CAAC,SAAS,OAAA,EAAS,WAAW,EAAE,QAAA,CAAS,CAAA,CAAE,QAAQ,MAAM,CAAA;AAAA,EAE7D;AAAA,EAEQ,aAAA,GAA4D;AAClE,IAAA,MAAM,gBAAA,GAAmB,KAAK,IAAA,CAAK,gBAAA;AACnC,IAAA,MAAM,MAAA,GAAqD;AAAA,MACzD,IAAI,gBAAA,CAAiB;AAAA,KACvB;AAEA,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,OAAO,IAAA,CAAK,KAAA;AAAA,UACjB,gBAAA,CAAiB;AAAA,SACnB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AC3OA,IAAMA,OAAAA,GAAS,aAAa,iBAAiB,CAAA;AAoBtC,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAU,kBAAoC,YAAY,CAAA;AAEhE,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,CAAC,KAAA,KAAU,MAAM,WAAW,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,CAAC,KAAA,KAAU,MAAM,YAAY,CAAA;AACpE,EAAA,MAAM,kBAAA,GAAqB,iBAAA;AAAA,IACzB,CAAC,UAAU,KAAA,CAAM;AAAA,GACnB;AAEA,EAAA,MAAM,SAAA,GAAYH,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAAG,OAAAA,CAAO,MAAM,sCAAsC,CAAA;AACnD,MAAA;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,SAAA,EAAU;AAAA,EAC3B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,SAAA,GAAYH,iBAAAA;AAAA,IAChB,OAAO,aAAA,KAA2B;AAChC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAAG,OAAAA,CAAO,MAAM,sCAAsC,CAAA;AACnD,QAAA;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,UAAU,aAAa,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,aAAA,GAAgBH,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAAG,OAAAA,CAAO,MAAM,2CAA2C,CAAA;AACxD,MAAA;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,aAAA,EAAc;AAAA,EAC/B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,cAAA,GAAiBH,kBAAY,MAAwB;AACzD,IAAA,MAAM,QAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,CAAC,aAAA,EAAe,IAAI,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AACzD,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,aAAA;AAAA,QACA,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,IAAI,IAAA,CAAK;AAAA,OACV,CAAA;AAAA,IACH;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC;AAAA,GACb;AACF;AClEA,IAAME,aAAAA,GAA+B;AAAA,EACnC,SAAA,sBAAe,GAAA,EAAI;AAAA,EACnB,kBAAkB,EAAC;AAAA,EACnB,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,oBAAoBR,cAAAA,EAA0C;AAAA,EACzEC,WAAAA,CAAM,CAAC,GAAA,MAAS;AAAA,IACd,GAAGO,aAAAA;AAAA,IAEH,aAAa,CAAC,aAAA,EAAe,QAAA,KAC3B,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,aAAA,EAAe,QAAQ,CAAA;AAAA,IAC7C,CAAC,CAAA;AAAA,IAEH,aAAA,EAAe,CAAC,aAAA,KACd,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,SAAA,CAAU,OAAO,aAAa,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,IAEH,uBAAuB,CAAC,EAAA,EAAI,IAAA,KAC1B,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,gBAAA,CAAiB,EAAE,CAAA,GAAI,IAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,IAEH,YAAA,EAAc,CAAC,GAAA,GAAM,IAAA,CAAK,KAAI,KAC5B,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,SAAS,CAAA;AACpD,MAAA,KAAA,MAAW,CAAC,aAAA,EAAe,QAAQ,CAAA,IAAK,OAAA,EAAS;AAC/C,QAAA,IAAI,QAAA,CAAS,EAAA,GAAK,KAAA,CAAM,KAAA,GAAQ,GAAA,EAAK;AACnC,UAAA,KAAA,CAAM,SAAA,CAAU,OAAO,aAAa,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,KAAA,EAAO,MACL,GAAA,CAAI,OAAO;AAAA,MACT,SAAA,sBAAe,GAAA,EAAI;AAAA,MACnB,kBAAkB,EAAC;AAAA,MACnB,OAAOA,aAAAA,CAAa;AAAA,KACtB,CAAE;AAAA,GACN,CAAE;AACJ;AAEO,SAAS,sBAAsB,QAAA,EAAkC;AACtE,EAAA,MAAM,EAAE,qBAAA,EAAuB,WAAA,EAAY,GAAI,kBAAkB,QAAA,EAAS;AAE1E,EAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,IAAA,qBAAA,CAAsB,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,EAChE;AAEA,EAAA,WAAA,CAAY,QAAA,CAAS,OAAO,EAAA,EAAI;AAAA,IAC9B,KAAA,EAAO,SAAS,OAAA,CAAQ,KAAA;AAAA,IACxB,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,IACb,KAAA,EAAO,SAAS,OAAA,CAAQ;AAAA,GACzB,CAAA;AACH;;;ACvEsB,aAAa,WAAW;AAEvC,SAAS,cAAc,KAAA,EAG5B;AACA,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,EACxC;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,EAAA,EAAI;AACrB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,UAAA,EAAW;AAAA,EAC3C;AACA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACjE;;;ACXA,IAAMC,OAAAA,GAAS,aAAa,WAAW,CAAA;AAEhC,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,YAAY,IAAA,EAAY;AANxB,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAEvB,IAAA,IAAA,CAAQ,UAAA,GAAa,CAAA;AACrB,IAAA,IAAA,CAAQ,aAAA,GAAgB,GAAA;AACxB,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAAoB;AAG7C,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAAA,OAAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,KAAUL,6BAAAA,CAAgB,SAAA,EAAW;AACjD,MAAAK,OAAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB;AAC/B,MAAAA,OAAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAAsB;AAC5B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,eAAe,OAAO,KAAA;AACvD,IAAA,IAAA,CAAK,UAAA,GAAa,GAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAI,KAAK,YAAA,EAAc;AAEvB,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA,CAA0B,cAAA,EAAgB,OAAO,MAAA,KAAW;AACpE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,EAAQ;AAClC,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B,SAAS,GAAA,EAAK;AACZ,QAAAA,OAAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,GAAG,CAAA;AAAA,MACpD;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,aAAA,GAAgB,YAAY,MAAM;AACrC,MAAA,iBAAA,CAAkB,QAAA,GAAW,YAAA,EAAa;AAAA,IAC5C,GAAG,GAAI,CAAA;AAEP,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAAA,OAAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,EAC3C;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,aAAA,CAAc,KAAK,aAAa,CAAA;AAChC,MAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AAAA,IACvB;AACA,IAAAA,OAAAA,CAAO,KAAK,+BAA+B,CAAA;AAAA,EAC7C;AAAA,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAK,gBAAA,CAAiB,QAAA;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa,KAAA,EAA8B;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,0BAAA;AAAA,QACN,OAAA,EAAS,0CAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,cAAc,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,yBAAA;AAAA,QACN,OAAA,EAAS,WAAW,KAAA,IAAS,eAAA;AAAA,QAC7B,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAW,EAAG;AACtB,MAAAA,OAAAA,CAAO,MAAM,6BAA6B,CAAA;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,IAAA,MAAM,QAAQ,aAAA,EAAc;AAE5B,IAAA,iBAAA,CAAkB,QAAA,EAAS,CAAE,WAAA,CAAY,UAAA,CAAW,EAAA,EAAI;AAAA,MACtD,KAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAA6B;AAAA,QACjC,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,EAAA;AAAA,QACA,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,KAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAAA,OAAAA,CAAO,KAAA,CAAM,eAAA,EAAiB,EAAE,OAAO,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B,KAAK,CAAA;AAC7C,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,uBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,yBAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,OAAA,EAAS,EAAE,KAAA;AAAM,OAClB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eAAe,IAAA,EAAoB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA,EAAG;AACjC,QAAAA,OAAAA,CAAO,IAAA,CAAK,oCAAA,EAAsC,MAAM,CAAA;AACxD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,EAAA,KAAO,IAAA,CAAK,uBAAsB,EAAG;AACrD,QAAAA,OAAAA,CAAO,MAAM,6BAA6B,CAAA;AAC1C,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GACJ,KAAK,YAAA,CAAa,GAAA,CAAI,OAAO,MAAA,CAAO,EAAE,KAAK,MAAA,CAAO,iBAAA;AACpD,MAAA,IAAI,MAAA,CAAO,KAAK,MAAA,EAAQ;AACtB,QAAAA,OAAAA,CAAO,MAAM,gCAAA,EAAkC;AAAA,UAC7C,MAAA,EAAQ,OAAO,MAAA,CAAO,EAAA;AAAA,UACtB,IAAI,MAAA,CAAO,EAAA;AAAA,UACX;AAAA,SACD,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,aAAa,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,EAAA,EAAI,OAAO,EAAE,CAAA;AACjD,MAAA,qBAAA,CAAsB,MAAM,CAAA;AAC5B,MAAAA,OAAAA,CAAO,MAAM,mBAAA,EAAqB,EAAE,OAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,IACnE,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,iCAAA,EAAmC,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,gBAAgB,CAAA,EAA+B;AACrD,IAAA,OACE,KACA,CAAA,CAAE,CAAA,KAAM,CAAA,IACR,CAAA,CAAE,SAAS,UAAA,IACX,OAAO,CAAA,CAAE,MAAA,KAAW,YACpB,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,IAAA,CAAK,QACvB,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,IAChB,EAAE,EAAA,GAAK,CAAA,IACP,OAAO,CAAA,CAAE,QAAQ,EAAA,KAAO,QAAA,IACxB,OAAO,CAAA,CAAE,SAAS,KAAA,KAAU,QAAA,IAC5B,OAAO,CAAA,CAAE,SAAS,KAAA,KAAU,QAAA;AAAA,EAEhC;AAAA,EAEQ,aAAA,GAA4D;AAClE,IAAA,MAAM,gBAAA,GAAmB,KAAK,IAAA,CAAK,gBAAA;AACnC,IAAA,MAAM,MAAA,GAAqD;AAAA,MACzD,IAAI,gBAAA,CAAiB;AAAA,KACvB;AAEA,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,OAAO,IAAA,CAAK,KAAA;AAAA,UACjB,gBAAA,CAAiB;AAAA,SACnB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AC3MA,IAAMA,OAAAA,GAAS,aAAa,gBAAgB,CAAA;AAYrC,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAU,kBAAoC,WAAW,CAAA;AAE/D,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,CAAC,KAAA,KAAU,MAAM,SAAS,CAAA;AAC9D,EAAA,MAAM,gBAAA,GAAmB,iBAAA,CAAkB,CAAC,KAAA,KAAU,MAAM,gBAAgB,CAAA;AAE5E,EAAA,MAAM,cAAA,GAAiBH,iBAAAA;AAAA,IACrB,CAAC,aAAA,KAA4C;AAC3C,MAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,aAAa,CAAA;AAC5C,MAAA,OAAO,UAAU,KAAA,IAAS,IAAA;AAAA,IAC5B,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,kBAAA,GAAqBA,iBAAAA;AAAA,IACzB,CAAC,EAAA,KAA8C,gBAAA,CAAiB,EAAE,CAAA,IAAK,IAAA;AAAA,IACvE,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,YAAA,GAAeA,iBAAAA;AAAA,IACnB,OAAO,KAAA,KAAkB;AACvB,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAAG,OAAAA,CAAO,MAAM,yCAAyC,CAAA;AACtD,QAAA;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,aAAA,GAAgBH,iBAAAA,CAAY,CAAC,aAAA,KAA0B;AAC3D,IAAA,iBAAA,CAAkB,QAAA,EAAS,CAAE,aAAA,CAAc,aAAa,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC;AAAA,GACb;AACF;AC/CA,IAAME,aAAAA,GAA+B;AAAA,EACnC,eAAA,EAAiB;AACnB,CAAA;AAEO,IAAM,oBAAoBR,cAAAA,EAA0C;AAAA,EACzEC,WAAAA,CAAM,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,IACnB,GAAGO,aAAAA;AAAA,IAEH,WAAW,CAAC,aAAA,EAAe,IAAA,KACzB,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,eAAA,GAAkB;AAAA,QACtB,aAAA;AAAA,QACA,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,GAAI,IAAA,IAAQ,EAAE,IAAA;AAAK,OACrB;AAAA,IACF,CAAC,CAAA;AAAA,IAEH,WAAA,EAAa,MACX,GAAA,CAAI,CAAC,KAAA,KAAU;AACb,MAAA,KAAA,CAAM,eAAA,GAAkB,IAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,IAEH,kBAAA,EAAoB,MAAM,GAAA,EAAI,CAAE,eAAA;AAAA,IAEhC,aAAA,EAAe,CAAC,aAAA,KAAkB;AAChC,MAAA,MAAM,IAAA,GAAO,KAAI,CAAE,eAAA;AACnB,MAAA,OAAO,MAAM,aAAA,KAAkB,aAAA;AAAA,IACjC,CAAA;AAAA,IAEA,KAAA,EAAO,MACL,GAAA,CAAI,OAAO;AAAA,MACT,eAAA,EAAiB;AAAA,KACnB,CAAE;AAAA,GACN,CAAE;AACJ;AAEO,SAAS,uBAAuB,QAAA,EAAmC;AACxE,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,kBAAkB,QAAA,EAAS;AAE9D,EAAA,QAAQ,QAAA,CAAS,QAAQ,MAAA;AAAQ,IAC/B,KAAK,WAAA,EAAa;AAGhB,MAAA,SAAA,CAAU,QAAA,CAAS,QAAQ,QAAQ,CAAA;AACnC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,WAAA,EAAY;AACZ,MAAA;AAAA,IACF;AAAA;AAEJ;;;ACzDA,IAAMC,OAAAA,GAAS,aAAa,WAAW,CAAA;AAEhC,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAY,IAAA,EAAY;AAFxB,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAGrB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEQ,WAAA,GAAuB;AAC7B,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAAA,OAAAA,CAAO,KAAK,sBAAsB,CAAA;AAClC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,KAAA,KAAUL,6BAAAA,CAAgB,SAAA,EAAW;AACjD,MAAAK,OAAAA,CAAO,KAAK,oBAAA,EAAsB,EAAE,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB;AAC/B,MAAAA,OAAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAI,KAAK,YAAA,EAAc;AAEvB,IAAA,IAAA,CAAK,IAAA,CAAK,yBAAA,CAA0B,cAAA,EAAgB,OAAO,MAAA,KAAW;AACpE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,OAAA,EAAQ;AAClC,QAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AAAA,MAC1B,SAAS,GAAA,EAAK;AACZ,QAAAA,OAAAA,CAAO,KAAA,CAAM,gCAAA,EAAkC,GAAG,CAAA;AAAA,MACpD;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAAA,OAAAA,CAAO,KAAK,6BAA6B,CAAA;AAAA,EAC3C;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAAA,OAAAA,CAAO,KAAK,+BAA+B,CAAA;AAAA,EAC7C;AAAA,EAEA,qBAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAK,gBAAA,CAAiB,QAAA;AAAA,EACpC;AAAA,EAEA,MAAM,UAAU,QAAA,EAAiC;AAC/C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,0BAAA;AAAA,QACN,OAAA,EAAS,sCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AAEtC,IAAA,iBAAA,CAAkB,QAAA,EAAS,CAAE,SAAA,CAAU,QAAQ,CAAA;AAE/C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAA8B;AAAA,QAClC,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,WAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,WAAA;AAAA,UACR;AAAA;AACF,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAAA,OAAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,UAAU,CAAA;AAAA,IAC/C,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,0BAAA,EAA4B,KAAK,CAAA;AAC9C,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,uBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,0BAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,4BAAA;AAAA,QACN,OAAA,EAAS,wCAAA;AAAA,QACT,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,aAAA,EAAc;AACtC,IAAA,MAAM,kBAAA,GAAqB,iBAAA,CAAkB,QAAA,EAAS,CAAE,kBAAA,EAAmB;AAE3E,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAAA,OAAAA,CAAO,MAAM,kCAAkC,CAAA;AAC/C,MAAA;AAAA,IACF;AAEA,IAAA,iBAAA,CAAkB,QAAA,GAAW,WAAA,EAAY;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAA8B;AAAA,QAClC,CAAA,EAAG,CAAA;AAAA,QACH,IAAA,EAAM,WAAA;AAAA,QACN,MAAA,EAAQ,KAAK,IAAA,CAAK,IAAA;AAAA,QAClB,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,aAAA;AAAA,UACR,UAAU,kBAAA,CAAmB;AAAA;AAC/B,OACF;AAEA,MAAA,MAAM,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QAClE,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAAA,OAAAA,CAAO,MAAM,oBAAoB,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,4BAAA,EAA8B,KAAK,CAAA;AAChD,MAAA,WAAA,CAAY,QAAA,GAAW,QAAA,CAAS;AAAA,QAC9B,IAAA,EAAM,yBAAA;AAAA,QACN,OAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,4BAAA;AAAA,QAC3C,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eAAe,IAAA,EAAoB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA,EAAG;AACjC,QAAAA,OAAAA,CAAO,IAAA,CAAK,qCAAA,EAAuC,MAAM,CAAA;AACzD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,EAAA,KAAO,IAAA,CAAK,uBAAsB,EAAG;AACrD,QAAAA,OAAAA,CAAO,MAAM,sCAAsC,CAAA;AACnD,QAAA;AAAA,MACF;AAEA,MAAA,sBAAA,CAAuB,MAAM,CAAA;AAC7B,MAAAA,OAAAA,CAAO,MAAM,4BAAA,EAA8B;AAAA,QACzC,MAAA,EAAQ,OAAO,OAAA,CAAQ,MAAA;AAAA,QACvB,QAAA,EAAU,OAAO,OAAA,CAAQ;AAAA,OAC1B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAAA,OAAAA,CAAO,KAAA,CAAM,0CAAA,EAA4C,KAAK,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEQ,gBAAgB,CAAA,EAAgC;AACtD,IAAA,OACE,CAAA,IACA,EAAE,CAAA,KAAM,CAAA,IACR,EAAE,IAAA,KAAS,WAAA,IACX,OAAO,CAAA,CAAE,MAAA,KAAW,YACpB,CAAA,CAAE,MAAA,KAAW,KAAK,IAAA,CAAK,IAAA,IACvB,OAAO,CAAA,CAAE,EAAA,KAAO,YAChB,CAAA,CAAE,EAAA,GAAK,KACP,OAAO,CAAA,CAAE,QAAQ,EAAA,KAAO,QAAA,IACxB,OAAO,CAAA,CAAE,OAAA,EAAS,WAAW,QAAA,IAC7B,CAAC,aAAa,aAAa,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,IACtD,OAAO,CAAA,CAAE,OAAA,EAAS,QAAA,KAAa,QAAA;AAAA,EAEnC;AAAA,EAEQ,aAAA,GAA4D;AAClE,IAAA,MAAM,gBAAA,GAAmB,KAAK,IAAA,CAAK,gBAAA;AACnC,IAAA,MAAM,MAAA,GAAqD;AAAA,MACzD,IAAI,gBAAA,CAAiB;AAAA,KACvB;AAEA,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,OAAO,IAAA,CAAK,KAAA;AAAA,UACjB,gBAAA,CAAiB;AAAA,SACnB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AC3MA,IAAMA,OAAAA,GAAS,aAAa,gBAAgB,CAAA;AAYrC,SAAS,YAAA,GAA8B;AAC5C,EAAA,MAAM,OAAA,GAAU,kBAAoC,WAAW,CAAA;AAE/D,EAAA,MAAM,kBAAA,GAAqB,iBAAA;AAAA,IACzB,CAAC,UAAU,KAAA,CAAM;AAAA,GACnB;AACA,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,CAAC,KAAA,KAAU,MAAM,aAAa,CAAA;AAEtE,EAAA,MAAM,SAAA,GAAYH,iBAAAA;AAAA,IAChB,OAAO,QAAA,KAAqB;AAC1B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAAG,OAAAA,CAAO,MAAM,qCAAqC,CAAA;AAClD,QAAA;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,UAAU,QAAQ,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,WAAA,GAAcH,kBAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAAG,OAAAA,CAAO,MAAM,uCAAuC,CAAA;AACpD,MAAA;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,WAAA,EAAY;AAAA,EAC7B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC;AAAA,GACb;AACF;;;AC9CO,IAAM,QAAA,GAA4C;AAAA,EACvD,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,aAAA,EAAe,CAAC,IAAA,KAAe,IAAI,YAAY,IAAI,CAAA;AAAA,IACnD,YAAA,EAAc,MAAM,YAAA,CAAa,QAAA,GAAW,SAAA;AAAU,GACxD;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,aAAA,EAAe,CAAC,IAAA,KAAe,IAAI,iBAAiB,IAAI,CAAA;AAAA,IACxD,YAAA,EAAc,MAAM,iBAAA,CAAkB,QAAA,GAAW,KAAA;AAAM,GACzD;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,aAAA,EAAe,CAAC,IAAA,KAAe,IAAI,iBAAiB,IAAI,CAAA;AAAA,IACxD,YAAA,EAAc,MAAM,iBAAA,CAAkB,QAAA,GAAW,KAAA;AAAM,GACzD;AAAA,EACA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,aAAA,EAAe,CAAC,IAAA,KAAe,IAAI,iBAAiB,IAAI,CAAA;AAAA,IACxD,YAAA,EAAc,MAAM,iBAAA,CAAkB,QAAA,GAAW,KAAA;AAAM;AAE3D,CAAA;AAEO,IAAM,gBAAA,GAAmB,CAAC,MAAA,EAAQ,WAAA,EAAa,cAAc,WAAW,CAAA;ACrB/E,IAAMA,OAAAA,GAAS,aAAa,mBAAmB,CAAA;AAQxC,SAAS,mBAAA,CAAoB;AAAA,EAClC,IAAA;AAAA,EACA,QAAA,GAAW,gBAAA;AAAA,EACX;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,QAAA,GAAWC,YAAA,iBAAyB,IAAI,GAAA,EAAK,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAE5C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAAH,OAAAA,CAAO,KAAK,0CAA0C,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAAA,OAAAA,CAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,UAAU,CAAA;AAClD,IAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,MAAA,MAAM,OAAA,GAAU,SAAS,WAAW,CAAA;AAEpC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,WAAW,CAAA,uBAAA,CAAyB,CAAA;AAC5D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,sBAAA,EAAyB,WAAW,CAAA,CAAE,CAAA;AACnD,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,aAAA,CAAc,IAAI,CAAA;AAE1C,QAAA,OAAA,CAAQ,SAAA,EAAU;AAClB,QAAA,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,OAAO,CAAA;AAEzC,QAAAA,OAAAA,CAAO,IAAA,CAAK,CAAA,SAAA,EAAY,WAAW,CAAA,aAAA,CAAe,CAAA;AAAA,MACpD,SAAS,KAAA,EAAO;AACd,QAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,WAAW,KAAK,KAAK,CAAA;AAAA,MACrE;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAAA,OAAAA,CAAO,KAAK,0BAA0B,CAAA;AACtC,IAAA,OAAO,MAAM;AACX,MAAAA,OAAAA,CAAO,MAAM,sBAAsB,CAAA;AAGnC,MAAA,QAAA,CAAS,OAAA,CAAQ,OAAA,CAAQ,CAAC,OAAA,EAAS,IAAA,KAAS;AAC1C,QAAA,IAAI;AACF,UAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAC7C,UAAA,OAAA,CAAQ,WAAA,EAAY;AAAA,QACtB,SAAS,KAAA,EAAO;AACd,UAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAI,KAAK,KAAK,CAAA;AAAA,QAC/D;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,QAAA,MAAM,OAAA,GAAU,SAAS,WAAW,CAAA;AACpC,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,IAAI;AACF,YAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,WAAW,CAAA,CAAE,CAAA;AACzD,YAAA,OAAA,CAAQ,YAAA,EAAa;AAAA,UACvB,SAAS,KAAA,EAAO;AACd,YAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,6BAAA,EAAgC,WAAW,KAAK,KAAK,CAAA;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,QAAQ,KAAA,EAAM;AACvB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAAA,OAAAA,CAAO,KAAK,2BAA2B,CAAA;AAAA,IACzC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEnB,EAAA,MAAM,YAAA,GAAeJ,aAAAA;AAAA,IACnB,OAAO;AAAA,MACL,UAAU,QAAA,CAAS,OAAA;AAAA,MACnB;AAAA,KACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,sCACG,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,cACjC,QAAA,EACH,CAAA;AAEJ","file":"index.cjs","sourcesContent":["/**\r\n * Comprehensive logging system for the Callpad Web SDK\r\n *\r\n * Features:\r\n * - Log level filtering (debug, info, warn, error)\r\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\r\n * - Hierarchical namespacing (callpad:socket:connection)\r\n * - Custom logger integration\r\n * - Zero-cost when disabled\r\n */\r\n\r\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enableDebug?: boolean;\r\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface CallpadLogger {\r\n debug(message: string, meta?: any): void;\r\n info(message: string, meta?: any): void;\r\n warn(message: string, meta?: any): void;\r\n error(message: string, meta?: any): void;\r\n child(namespace: string): CallpadLogger;\r\n setLevel(level: LogLevel): void;\r\n isLevelEnabled(level: LogLevel): boolean;\r\n}\r\n\r\nconst LOG_LEVELS: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n};\r\n\r\nclass CallpadLoggerImpl implements CallpadLogger {\r\n private namespace: string;\r\n private level: LogLevel;\r\n private enableDebug: boolean;\r\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n\r\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\r\n this.namespace = namespace;\r\n this.level = options.level ?? this.getDefaultLevel();\r\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\r\n if (options.customLogger) {\r\n this.customLogger = options.customLogger;\r\n }\r\n }\r\n\r\n private getDefaultLevel(): LogLevel {\r\n const envLevel =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__CALLPAD_LOG_LEVEL__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\r\n\r\n if (envLevel && this.isValidLogLevel(envLevel)) {\r\n return envLevel as LogLevel;\r\n }\r\n\r\n const isProduction =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\r\n\r\n return isProduction ? \"warn\" : \"info\";\r\n }\r\n\r\n private shouldEnableDebug(): boolean {\r\n const debugEnv =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__DEBUG__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.DEBUG;\r\n\r\n if (!debugEnv) return false;\r\n\r\n const debugPatterns = debugEnv.split(/[\\s,]+/);\r\n return debugPatterns.some((pattern: string) => {\r\n if (pattern === \"*\") return true;\r\n if (pattern.endsWith(\"*\")) {\r\n const prefix = pattern.slice(0, -1);\r\n return this.namespace.startsWith(prefix);\r\n }\r\n return this.namespace === pattern;\r\n });\r\n }\r\n\r\n private isValidLogLevel(level: string): boolean {\r\n return Object.keys(LOG_LEVELS).includes(level);\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n if (level === \"debug\" && !this.enableDebug) {\r\n return false;\r\n }\r\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\r\n }\r\n\r\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\r\n if (!this.shouldLog(level)) return;\r\n\r\n const timestamp = new Date().toISOString();\r\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\r\n\r\n if (this.customLogger) {\r\n this.customLogger(level, message, meta);\r\n return;\r\n }\r\n\r\n const logMethod =\r\n level === \"error\"\r\n ? console.error\r\n : level === \"warn\"\r\n ? console.warn\r\n : level === \"info\"\r\n ? console.info\r\n : console.log;\r\n\r\n if (meta !== undefined) {\r\n logMethod(`${prefix} ${message}`, meta);\r\n } else {\r\n logMethod(`${prefix} ${message}`);\r\n }\r\n }\r\n\r\n debug(message: string, meta?: any): void {\r\n this.formatMessage(\"debug\", message, meta);\r\n }\r\n\r\n info(message: string, meta?: any): void {\r\n this.formatMessage(\"info\", message, meta);\r\n }\r\n\r\n warn(message: string, meta?: any): void {\r\n this.formatMessage(\"warn\", message, meta);\r\n }\r\n\r\n error(message: string, meta?: any): void {\r\n this.formatMessage(\"error\", message, meta);\r\n }\r\n\r\n child(namespace: string): CallpadLogger {\r\n const childNamespace = `${this.namespace}:${namespace}`;\r\n const childOptions: LoggerOptions = {\r\n level: this.level,\r\n enableDebug: this.enableDebug,\r\n };\r\n if (this.customLogger) {\r\n childOptions.customLogger = this.customLogger;\r\n }\r\n return new CallpadLoggerImpl(childNamespace, childOptions);\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n isLevelEnabled(level: LogLevel): boolean {\r\n return this.shouldLog(level);\r\n }\r\n}\r\n\r\nlet rootLogger: CallpadLogger | null = null;\r\n\r\nexport function createLogger(\r\n namespace?: string,\r\n options?: LoggerOptions\r\n): CallpadLogger {\r\n if (!namespace) {\r\n if (!rootLogger) {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n }\r\n return rootLogger;\r\n }\r\n\r\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\r\n}\r\n\r\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n}\r\n","import { createContext, useContext } from \"react\";\r\n\r\nexport interface DataChannelContextValue {\r\n services: Map<string, any>;\r\n isReady: boolean;\r\n}\r\n\r\nexport const DataChannelContext = createContext<DataChannelContextValue | null>(\r\n null\r\n);\r\n\r\nexport function useDataChannelContext(): DataChannelContextValue {\r\n const context = useContext(DataChannelContext);\r\n if (!context) {\r\n throw new Error(\r\n \"useDataChannelContext must be used within DataChannelProvider\"\r\n );\r\n }\r\n return context;\r\n}\r\n\r\nexport function useFeatureService<T = any>(featureName: string): T {\r\n const { services } = useDataChannelContext();\r\n const service = services.get(featureName) as T;\r\n if (!service) {\r\n throw new Error(\r\n `Feature service \"${featureName}\" not found. Make sure it's enabled in DataChannelProvider.`\r\n );\r\n }\r\n\r\n return service;\r\n}\r\n","type Nullable<T> = T | null;\r\n\r\nexport type CallParticipantRole = \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n\r\nexport interface Profile {\r\n userId: string;\r\n username: string | null;\r\n firstName: string | null;\r\n lastName: string | null;\r\n profilePhoto: string | null;\r\n}\r\n\r\nexport interface ParticipantPermissions {\r\n canMute: boolean;\r\n canKick: boolean;\r\n canTransfer: boolean;\r\n canEnd: boolean;\r\n canRecord: boolean;\r\n canShareScreen: boolean;\r\n}\r\n\r\nexport interface ParticipantMetadata {\r\n userId: string | number;\r\n firstName: Nullable<string>;\r\n lastName: Nullable<string>;\r\n username: Nullable<string>;\r\n email: Nullable<string>;\r\n profilePhoto: Nullable<string>;\r\n role: CallParticipantRole;\r\n permissions: ParticipantPermissions;\r\n}\r\n\r\nexport interface LiveKitJoinInfo {\r\n token: string;\r\n roomName: string;\r\n url: string;\r\n}\r\n\r\nexport interface Session {\r\n id: string;\r\n status: \"initializing\" | \"pending\" | \"ready\" | \"active\" | \"ended\";\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n livekitInfo?: LiveKitJoinInfo;\r\n startedAt?: string;\r\n ringTimeoutMs?: number;\r\n}\r\n\r\nexport interface IncomingInvite {\r\n callId: string;\r\n inviteId: string;\r\n caller: ParticipantMetadata;\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n expiresAt: string;\r\n expiresInMs: number;\r\n ringTimeoutMs: number;\r\n}\r\n\r\nexport interface OutgoingInvite {\r\n userId: string;\r\n status: \"sent\" | \"accepted\" | \"declined\" | \"missed\";\r\n participant?: Omit<ParticipantMetadata, \"permissions\"> | undefined;\r\n}\r\n\r\nexport interface RtcError {\r\n code: string;\r\n message: string;\r\n timestamp: number;\r\n context?: any;\r\n}\r\n\r\nexport interface RtcState {\r\n // Did we initiate the current call?\r\n initiated: boolean;\r\n\r\n // Active session (null when no active call)\r\n session: Session | null;\r\n\r\n // Incoming invitation (null when no pending invite)\r\n incomingInvite: IncomingInvite | null;\r\n\r\n outgoingInvites: Record<string, OutgoingInvite>;\r\n\r\n // Error tracking\r\n errors: RtcError[];\r\n}\r\n\r\nexport const defaultState: RtcState = {\r\n initiated: false,\r\n session: null,\r\n incomingInvite: null,\r\n outgoingInvites: {},\r\n errors: [],\r\n};\r\n\r\nimport type { Participant } from \"livekit-client\";\r\n\r\nexport interface ParticipantListOptions {\r\n pageSize?: number;\r\n includeLocalParticipant?: boolean;\r\n sortBy?: \"speaking\" | \"name\" | \"raised-hand\";\r\n}\r\n\r\nexport interface ParticipantListReturn {\r\n participants: Participant[];\r\n pinnedParticipants: Participant[];\r\n currentPage: number;\r\n totalPages: number;\r\n pageSize: number;\r\n totalParticipants: number;\r\n hasNextPage: boolean;\r\n hasPrevPage: boolean;\r\n nextPage: () => void;\r\n prevPage: () => void;\r\n setPageSize: (size: number) => void;\r\n togglePin: (participantId: string) => void;\r\n clearPinned: () => void;\r\n isPinned: (participantId: string) => boolean;\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { RtcError, RtcState } from \"./types\";\r\nimport { defaultState } from \"./types\";\r\n\r\ntype Actions = {\r\n patch: (fn: (draft: RtcState) => void) => void;\r\n reset: () => void;\r\n addError: (error: RtcError) => void;\r\n clearErrors: () => void;\r\n};\r\n\r\nexport const useRtcStore = create<RtcState & Actions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n reset: () => set(() => defaultState),\r\n\r\n addError: (error) =>\r\n set((state) => {\r\n state.errors.push(error);\r\n }),\r\n\r\n clearErrors: () =>\r\n set((state) => {\r\n state.errors = [];\r\n }),\r\n }))\r\n);\r\n\r\nexport const rtcStore = useRtcStore;\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ChatEntry, ChatState, Envelope } from \"./types\";\r\n\r\ninterface ChatActions {\r\n patch: (fn: (draft: ChatState) => void) => void;\r\n applyIncoming: (envelope: Envelope) => void;\r\n addFile: (file: File, filename: string) => void;\r\n addEntryOptimistic: (entry: ChatEntry) => void;\r\n markEntrySent: (entryId: string) => void;\r\n markEntryFailed: (entryId: string) => void;\r\n applyEdit: (entryId: string, newContent: string, version: number) => void;\r\n applyRemove: (entryId: string) => void;\r\n applyReaction: (\r\n entryId: string,\r\n emoji: string,\r\n participantId: string,\r\n op: \"add\" | \"remove\"\r\n ) => void;\r\n queuePendingOp: (entryId: string, envelope: Envelope) => void;\r\n processPendingOps: (entryId: string) => void;\r\n trimOldEntries: () => void;\r\n clearChat: () => void;\r\n}\r\n\r\nconst defaultChatState: ChatState = {\r\n byId: {},\r\n order: [],\r\n pendingOps: {},\r\n participantCache: {},\r\n maxEntries: 1000,\r\n};\r\n\r\nfunction applyReactionToEntry(\r\n entry: ChatEntry,\r\n emoji: string,\r\n participantId: string,\r\n op: \"add\" | \"remove\"\r\n) {\r\n const emojiSet = entry.reactions[emoji];\r\n if (!emojiSet) {\r\n entry.reactions[emoji] = new Set();\r\n }\r\n if (op === \"add\") {\r\n entry.reactions[emoji]?.add(participantId);\r\n } else {\r\n entry.reactions[emoji]?.delete(participantId);\r\n if (entry.reactions[emoji]?.size === 0) {\r\n delete entry.reactions[emoji];\r\n }\r\n }\r\n}\r\n\r\nfunction trimEntriesIfNeeded(state: ChatState) {\r\n if (Object.keys(state.byId).length > state.maxEntries) {\r\n const entriesToRemove = Object.keys(state.byId).length - state.maxEntries;\r\n for (let i = 0; i < entriesToRemove; i++) {\r\n const oldestId = state.order[i];\r\n if (oldestId) {\r\n delete state.byId[oldestId];\r\n }\r\n }\r\n state.order = state.order.slice(entriesToRemove);\r\n }\r\n}\r\n\r\nexport const useChatStore = create<ChatState & ChatActions>()(\r\n immer((set) => ({\r\n ...defaultChatState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n applyIncoming: (envelope) =>\r\n set((state) => {\r\n if (envelope.kind === \"entry\") {\r\n if (state.byId[envelope.entryId]) {\r\n return;\r\n }\r\n\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: envelope.entryId,\r\n content: envelope.payload.content,\r\n sender: {\r\n id: envelope.sender.id,\r\n },\r\n createdAt: envelope.ts,\r\n version: 1,\r\n reactions: {},\r\n status: \"sent\",\r\n filename: envelope.payload?.meta?.filename,\r\n };\r\n\r\n state.byId[envelope.entryId] = entry;\r\n state.order.push(envelope.entryId);\r\n\r\n trimEntriesIfNeeded(state);\r\n\r\n const pendingOps = state.pendingOps[envelope.entryId];\r\n if (pendingOps) {\r\n delete state.pendingOps[envelope.entryId];\r\n\r\n for (const op of pendingOps) {\r\n if (op.kind === \"edit\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && op.payload.version > entry.version) {\r\n entry.content = op.payload.newContent;\r\n entry.version = op.payload.version;\r\n entry.editedAt = op.ts;\r\n }\r\n } else if (op.kind === \"remove\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = op.ts;\r\n }\r\n } else if (op.kind === \"reaction\") {\r\n if (op.sender.info) {\r\n state.participantCache[op.sender.id] = op.sender.info;\r\n }\r\n\r\n const entry = state.byId[op.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n op.payload.emoji,\r\n op.sender.id,\r\n op.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } else if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (!entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n }\r\n }),\r\n\r\n addFile: (file, filename) =>\r\n set((state) => {\r\n const values = Object.values(state.byId);\r\n const entryArr = values.filter((val) => val.filename === filename);\r\n const entry = entryArr[0];\r\n entry!.file = file;\r\n state.byId[entry!.id] = entry!;\r\n }),\r\n\r\n addEntryOptimistic: (entry) =>\r\n set((state) => {\r\n state.byId[entry.id] = entry;\r\n state.order.push(entry.id);\r\n\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n markEntrySent: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"sent\";\r\n }\r\n }),\r\n\r\n markEntryFailed: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"failed\";\r\n }\r\n }),\r\n\r\n applyEdit: (entryId, newContent, version) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && version > entry.version) {\r\n entry.content = newContent;\r\n entry.version = version;\r\n entry.editedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyRemove: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyReaction: (entryId, emoji, participantId, op) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n applyReactionToEntry(entry, emoji, participantId, op);\r\n }\r\n }),\r\n\r\n queuePendingOp: (entryId, envelope) =>\r\n set((state) => {\r\n if (!state.pendingOps[entryId]) {\r\n state.pendingOps[entryId] = [];\r\n }\r\n state.pendingOps[entryId].push(envelope);\r\n }),\r\n\r\n processPendingOps: (entryId) =>\r\n set((state) => {\r\n const pendingOps = state.pendingOps[entryId];\r\n if (!pendingOps) {\r\n return;\r\n }\r\n\r\n delete state.pendingOps[entryId];\r\n\r\n for (const envelope of pendingOps) {\r\n if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }),\r\n\r\n trimOldEntries: () =>\r\n set((state) => {\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n clearChat: () => set(() => defaultChatState),\r\n }))\r\n);\r\n\r\nexport const chatStore = useChatStore;\r\n","import { nanoid } from \"nanoid\";\r\nimport type { ChatEntry, Envelope } from \"./types\";\r\n\r\nexport function compareEntries(a: ChatEntry, b: ChatEntry): number {\r\n if (a.createdAt !== b.createdAt) {\r\n return a.createdAt - b.createdAt;\r\n }\r\n\r\n if (a.sender.id !== b.sender.id) {\r\n return a.sender.id.localeCompare(b.sender.id);\r\n }\r\n\r\n return a.id.localeCompare(b.id);\r\n}\r\n\r\nexport function validateContent(content: string): {\r\n valid: boolean;\r\n error?: string;\r\n} {\r\n const trimmed = content.trim();\r\n\r\n if (trimmed.length === 0) {\r\n return { valid: false, error: \"Content cannot be empty\" };\r\n }\r\n\r\n const sizeInBytes = new TextEncoder().encode(content).length;\r\n if (sizeInBytes > 16384) {\r\n return { valid: false, error: \"Content exceeds 16KB limit\" };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n\r\nexport function isValidEnvelope(data: any): data is Envelope {\r\n if (!data || typeof data !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (data.v !== 1) {\r\n return false;\r\n }\r\n\r\n if (![\"entry\", \"edit\", \"remove\", \"reaction\"].includes(data.kind)) {\r\n return false;\r\n }\r\n\r\n if (\r\n typeof data.roomId !== \"string\" ||\r\n typeof data.entryId !== \"string\" ||\r\n typeof data.ts !== \"number\"\r\n ) {\r\n return false;\r\n }\r\n\r\n if (!data.sender || typeof data.sender.id !== \"string\") {\r\n return false;\r\n }\r\n\r\n if (\r\n data.kind === \"entry\" ||\r\n data.kind === \"edit\" ||\r\n data.kind === \"reaction\"\r\n ) {\r\n if (!data.payload || typeof data.payload !== \"object\") {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function generateEntryId(): string {\r\n return nanoid();\r\n}\r\n\r\nexport function getCurrentTimestamp(): number {\r\n return Date.now();\r\n}\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useChatStore } from \"./store\";\r\nimport type { ChatEntry, Envelope } from \"./types\";\r\nimport {\r\n generateEntryId,\r\n getCurrentTimestamp,\r\n isValidEnvelope,\r\n validateContent,\r\n} from \"./utils\";\r\n\r\nconst logger = createLogger(\"chat\");\r\n\r\nexport class ChatService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) {\r\n return;\r\n }\r\n // Handles incoming text streams\r\n this.room.registerTextStreamHandler(\r\n \"chat:v1\",\r\n async (reader, participantInfo) => {\r\n try {\r\n const text = await reader.readAll();\r\n console.log(\"Got here: chat:v1\", text, participantInfo.identity);\r\n this.handleIncomingMessage(text);\r\n } catch (error) {\r\n logger.error(\"Error reading text stream\", error);\r\n }\r\n }\r\n );\r\n\r\n // Handles incoming file streams\r\n this.room.registerByteStreamHandler(\r\n \"chat:v1\",\r\n async (reader, participantInfo) => {\r\n try {\r\n const info = reader.info;\r\n const filename = info.name;\r\n\r\n // Ensure BlobParts are backed by ArrayBuffer (not SharedArrayBuffer) by copying with slice().\r\n const parts = (await reader.readAll()).map((chunk) => chunk.slice());\r\n const fileBlob = new Blob(parts, { type: info.mimeType });\r\n\r\n this.handleIncomingFile(fileBlob, filename, info.mimeType);\r\n } catch (error) {\r\n logger.error(\"Error reading file stream\", error);\r\n }\r\n }\r\n );\r\n this.isSubscribed = true;\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async send(content: string, file?: File): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot send message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const messageContent =\r\n content.length === 0 && typeof file !== \"undefined\" ? file.name : content;\r\n\r\n const validation = validateContent(messageContent);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const entryId = generateEntryId();\r\n const chatStore = useChatStore.getState();\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: entryId,\r\n content: messageContent,\r\n sender: {\r\n id: senderInfo.id,\r\n },\r\n createdAt: getCurrentTimestamp(),\r\n version: 1,\r\n reactions: {},\r\n status: \"sending\",\r\n file: file!,\r\n };\r\n\r\n chatStore.addEntryOptimistic(entry);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"entry\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: entry.createdAt,\r\n sender: senderInfo,\r\n payload: {\r\n content,\r\n meta: { filename: file?.name },\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n if (file) {\r\n await this.room.localParticipant.sendFile(file, {\r\n mimeType: file.type,\r\n topic: \"chat:v1\",\r\n });\r\n }\r\n chatStore.markEntrySent(entryId);\r\n } catch (error) {\r\n chatStore.markEntryFailed(entryId);\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to send message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async edit(entryId: string, newContent: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot edit message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateContent(newContent);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only edit your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const newVersion = entry.version + 1;\r\n chatStore.applyEdit(entryId, newContent, newVersion);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"edit\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n newContent,\r\n version: newVersion,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_EDIT_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to edit message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async remove(entryId: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only remove your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n chatStore.applyRemove(entryId);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"remove\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REMOVE_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to remove message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async react(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot add reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"add\");\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"add\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to add reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n async unreact(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"remove\");\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"remove\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to remove reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n private handleIncomingMessage(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text);\r\n if (!isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid envelope received\", parsed);\r\n return;\r\n }\r\n\r\n useChatStore.getState().applyIncoming(parsed);\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming message\", error);\r\n }\r\n }\r\n\r\n private handleIncomingFile(\r\n blob: Blob,\r\n filename: string,\r\n mimeType: string\r\n ): void {\r\n try {\r\n const file = new File([blob], filename, { type: mimeType || blob.type });\r\n\r\n useChatStore.getState().addFile(file, filename);\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming file\", error);\r\n }\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parsing errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useCallback, useMemo } from \"react\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { ChatService } from \"./service\";\r\nimport { useChatStore } from \"./store\";\r\nimport type { ChatEntry } from \"./types\";\r\nimport { compareEntries } from \"./utils\";\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface UseChatReturn {\r\n entries: ChatEntry[];\r\n isReady: boolean;\r\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\r\n isOwnEntry: (entry: ChatEntry) => boolean;\r\n send: (content: string, file?: File) => Promise<void>;\r\n edit: (id: string, content: string) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n react: (id: string, emoji: string) => Promise<void>;\r\n unreact: (id: string, emoji: string) => Promise<void>;\r\n}\r\n\r\nexport function useChat(): UseChatReturn {\r\n const service = useFeatureService<ChatService>(\"chat\");\r\n\r\n const byId = useChatStore((state) => state.byId);\r\n const order = useChatStore((state) => state.order);\r\n const participantCache = useChatStore((state) => state.participantCache);\r\n\r\n const entries = useMemo(() => {\r\n return order\r\n .map((id) => byId[id])\r\n .filter((entry): entry is ChatEntry => entry !== undefined)\r\n .sort(compareEntries);\r\n }, [byId, order]);\r\n\r\n const getParticipantInfo = useCallback(\r\n (id: string): Nullable<ParticipantMetadata> => {\r\n return participantCache[id] || null;\r\n },\r\n [participantCache]\r\n );\r\n\r\n const send = useCallback(\r\n async (content: string, file?: File) => service.send(content, file),\r\n [service]\r\n );\r\n\r\n const edit = useCallback(\r\n async (id: string, content: string) => service.edit(id, content),\r\n [service]\r\n );\r\n\r\n const remove = useCallback(\r\n async (id: string) => service.remove(id),\r\n [service]\r\n );\r\n\r\n const react = useCallback(\r\n async (id: string, emoji: string) => service.react(id, emoji),\r\n [service]\r\n );\r\n\r\n const unreact = useCallback(\r\n async (id: string, emoji: string) => service.unreact(id, emoji),\r\n [service]\r\n );\r\n\r\n const isOwnEntry = useCallback(\r\n (entry: ChatEntry) => entry.sender.id === service.getLocalParticipantId(),\r\n [service]\r\n );\r\n\r\n return {\r\n entries,\r\n isReady: true,\r\n getParticipantInfo,\r\n isOwnEntry,\r\n send,\r\n edit,\r\n remove,\r\n react,\r\n unreact,\r\n };\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport type { RaiseHandEnvelope, RaiseHandState, RaisedHand } from \"./types\";\r\n\r\ninterface RaiseHandActions {\r\n raiseHand: (participantId: string) => void;\r\n lowerHand: (participantId: string) => void;\r\n lowerAllHands: () => void;\r\n isHandRaised: (participantId: string) => boolean;\r\n getRaisedHandOrder: (participantId: string) => number | null;\r\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\r\n clear: () => void;\r\n}\r\n\r\nconst defaultState: RaiseHandState = {\r\n raisedHands: new Map(),\r\n nextOrder: 1,\r\n};\r\n\r\nexport const useRaiseHandStore = create<RaiseHandState & RaiseHandActions>()(\r\n immer((set, get) => ({\r\n ...defaultState,\r\n\r\n raiseHand: (participantId) =>\r\n set((state) => {\r\n if (!state.raisedHands.has(participantId)) {\r\n state.raisedHands.set(participantId, {\r\n ts: Date.now(),\r\n order: state.nextOrder++,\r\n });\r\n }\r\n }),\r\n\r\n lowerHand: (participantId) =>\r\n set((state) => {\r\n state.raisedHands.delete(participantId);\r\n // Reset order counter when all hands are lowered\r\n if (state.raisedHands.size === 0) {\r\n state.nextOrder = 1;\r\n }\r\n }),\r\n\r\n lowerAllHands: () =>\r\n set((state) => {\r\n state.raisedHands.clear();\r\n state.nextOrder = 1;\r\n }),\r\n\r\n isHandRaised: (participantId) => get().raisedHands.has(participantId),\r\n\r\n getRaisedHandOrder: (participantId) => {\r\n const hand = get().raisedHands.get(participantId);\r\n return hand?.order ?? null;\r\n },\r\n\r\n upsertParticipantInfo: (id, info) => {\r\n // No-op for now, can be extended if needed\r\n },\r\n\r\n clear: () =>\r\n set(() => ({\r\n raisedHands: new Map(),\r\n nextOrder: 1,\r\n })),\r\n }))\r\n);\r\n\r\nexport function applyIncomingRaiseHand(envelope: RaiseHandEnvelope): void {\r\n const { raiseHand, lowerHand, lowerAllHands, upsertParticipantInfo } =\r\n useRaiseHandStore.getState();\r\n\r\n if (envelope.sender.info) {\r\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\r\n }\r\n\r\n switch (envelope.payload.action) {\r\n case \"raise\": {\r\n raiseHand(envelope.sender.id);\r\n break;\r\n }\r\n case \"lower\": {\r\n const targetId = envelope.payload.targetId || envelope.sender.id;\r\n lowerHand(targetId);\r\n break;\r\n }\r\n case \"lower-all\": {\r\n lowerAllHands();\r\n break;\r\n }\r\n }\r\n}\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { applyIncomingRaiseHand, useRaiseHandStore } from \"./store\";\r\nimport type { RaiseHandEnvelope } from \"./types\";\r\n\r\nconst logger = createLogger(\"raise-hand\");\r\n\r\nexport class RaiseHandService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) return;\r\n\r\n this.room.registerTextStreamHandler(\"raise-hand:v1\", async (reader) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncoming(text);\r\n } catch (err) {\r\n logger.error(\"Error reading raise-hand stream\", err);\r\n }\r\n });\r\n\r\n this.isSubscribed = true;\r\n logger.info(\"RaiseHandService subscribed\");\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n logger.info(\"RaiseHandService unsubscribed\");\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async raiseHand(): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"RAISE_HAND_ROOM_NOT_READY\",\r\n message: \"Cannot raise hand: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n useRaiseHandStore.getState().raiseHand(senderInfo.id);\r\n\r\n try {\r\n const envelope: RaiseHandEnvelope = {\r\n v: 1,\r\n kind: \"raise-hand\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"raise\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"raise-hand:v1\",\r\n });\r\n\r\n logger.debug(\"Hand raised\");\r\n } catch (error) {\r\n logger.error(\"Failed to raise hand\", error);\r\n useRtcStore.getState().addError({\r\n code: \"RAISE_HAND_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to raise hand\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n async lowerHand(targetId?: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_HAND_ROOM_NOT_READY\",\r\n message: \"Cannot lower hand: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n const participantId = targetId || senderInfo.id;\r\n useRaiseHandStore.getState().lowerHand(participantId);\r\n\r\n try {\r\n const envelope: RaiseHandEnvelope = {\r\n v: 1,\r\n kind: \"raise-hand\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"lower\",\r\n targetId: participantId,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"raise-hand:v1\",\r\n });\r\n\r\n logger.debug(\"Hand lowered\", { targetId: participantId });\r\n } catch (error) {\r\n logger.error(\"Failed to lower hand\", error);\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_HAND_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to lower hand\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n async lowerAllHands(): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_ALL_HANDS_ROOM_NOT_READY\",\r\n message: \"Cannot lower all hands: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n useRaiseHandStore.getState().lowerAllHands();\r\n\r\n try {\r\n const envelope: RaiseHandEnvelope = {\r\n v: 1,\r\n kind: \"raise-hand\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"lower-all\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"raise-hand:v1\",\r\n });\r\n\r\n logger.debug(\"All hands lowered\");\r\n } catch (error) {\r\n logger.error(\"Failed to lower all hands\", error);\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_ALL_HANDS_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to lower all hands\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n private handleIncoming(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text) as RaiseHandEnvelope;\r\n if (!this.isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid raise-hand envelope received\", parsed);\r\n return;\r\n }\r\n\r\n if (parsed.sender.id === this.getLocalParticipantId()) {\r\n logger.debug(\"Ignoring self-echo raise-hand message\");\r\n return;\r\n }\r\n\r\n applyIncomingRaiseHand(parsed);\r\n logger.debug(\"Raise-hand message received\", {\r\n action: parsed.payload.action,\r\n });\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming raise-hand message\", error);\r\n }\r\n }\r\n\r\n private isValidEnvelope(e: any): e is RaiseHandEnvelope {\r\n return (\r\n e &&\r\n e.v === 1 &&\r\n e.kind === \"raise-hand\" &&\r\n typeof e.roomId === \"string\" &&\r\n e.roomId === this.room.name &&\r\n typeof e.ts === \"number\" &&\r\n e.ts > 0 &&\r\n typeof e.sender?.id === \"string\" &&\r\n typeof e.payload?.action === \"string\" &&\r\n [\"raise\", \"lower\", \"lower-all\"].includes(e.payload.action)\r\n );\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parse errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useCallback, useMemo } from \"react\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { RaiseHandService } from \"./service\";\r\nimport { useRaiseHandStore } from \"./store\";\r\n\r\nconst logger = createLogger(\"raise-hand:hook\");\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface RaisedHandInfo {\r\n participantId: string;\r\n order: number;\r\n ts: number;\r\n}\r\n\r\nexport interface UseRaiseHandReturn {\r\n raiseHand: () => Promise<void>;\r\n lowerHand: (participantId?: string) => Promise<void>;\r\n lowerAllHands: () => Promise<void>;\r\n isHandRaised: (participantId: string) => boolean;\r\n getRaisedHandOrder: (participantId: string) => Nullable<number>;\r\n getRaisedHands: () => RaisedHandInfo[];\r\n isReady: boolean;\r\n}\r\n\r\nexport function useRaiseHand(): UseRaiseHandReturn {\r\n const service = useFeatureService<RaiseHandService>(\"raise-hand\");\r\n\r\n const raisedHands = useRaiseHandStore((state) => state.raisedHands);\r\n const isHandRaised = useRaiseHandStore((state) => state.isHandRaised);\r\n const getRaisedHandOrder = useRaiseHandStore(\r\n (state) => state.getRaisedHandOrder\r\n );\r\n\r\n const raiseHand = useCallback(async () => {\r\n if (!service) {\r\n logger.error(\"Cannot raise hand: service not ready\");\r\n return;\r\n }\r\n return service.raiseHand();\r\n }, [service]);\r\n\r\n const lowerHand = useCallback(\r\n async (participantId?: string) => {\r\n if (!service) {\r\n logger.error(\"Cannot lower hand: service not ready\");\r\n return;\r\n }\r\n return service.lowerHand(participantId);\r\n },\r\n [service]\r\n );\r\n\r\n const lowerAllHands = useCallback(async () => {\r\n if (!service) {\r\n logger.error(\"Cannot lower all hands: service not ready\");\r\n return;\r\n }\r\n return service.lowerAllHands();\r\n }, [service]);\r\n\r\n const getRaisedHands = useCallback((): RaisedHandInfo[] => {\r\n const hands: RaisedHandInfo[] = [];\r\n for (const [participantId, hand] of raisedHands.entries()) {\r\n hands.push({\r\n participantId,\r\n order: hand.order,\r\n ts: hand.ts,\r\n });\r\n }\r\n return hands.sort((a, b) => a.order - b.order);\r\n }, [raisedHands]);\r\n\r\n return {\r\n raiseHand,\r\n lowerHand,\r\n lowerAllHands,\r\n isHandRaised,\r\n getRaisedHandOrder,\r\n getRaisedHands,\r\n isReady: !!service,\r\n };\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport type {\r\n ParticipantReaction,\r\n ReactionEnvelope,\r\n ReactionsState,\r\n} from \"./types\";\r\n\r\ninterface ReactionsActions {\r\n setReaction: (participantId: string, reaction: ParticipantReaction) => void;\r\n clearReaction: (participantId: string) => void;\r\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\r\n pruneExpired: (now?: number) => void;\r\n clear: () => void;\r\n}\r\n\r\nconst defaultState: ReactionsState = {\r\n reactions: new Map(),\r\n participantCache: {},\r\n ttlMs: 4000,\r\n};\r\n\r\nexport const useReactionsStore = create<ReactionsState & ReactionsActions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n setReaction: (participantId, reaction) =>\r\n set((state) => {\r\n state.reactions.set(participantId, reaction);\r\n }),\r\n\r\n clearReaction: (participantId) =>\r\n set((state) => {\r\n state.reactions.delete(participantId);\r\n }),\r\n\r\n upsertParticipantInfo: (id, info) =>\r\n set((state) => {\r\n state.participantCache[id] = info;\r\n }),\r\n\r\n pruneExpired: (now = Date.now()) =>\r\n set((state) => {\r\n const entries = Array.from(state.reactions.entries());\r\n for (const [participantId, reaction] of entries) {\r\n if (reaction.ts + state.ttlMs < now) {\r\n state.reactions.delete(participantId);\r\n }\r\n }\r\n }),\r\n\r\n clear: () =>\r\n set(() => ({\r\n reactions: new Map(),\r\n participantCache: {},\r\n ttlMs: defaultState.ttlMs,\r\n })),\r\n }))\r\n);\r\n\r\nexport function applyIncomingReaction(envelope: ReactionEnvelope): void {\r\n const { upsertParticipantInfo, setReaction } = useReactionsStore.getState();\r\n\r\n if (envelope.sender.info) {\r\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\r\n }\r\n\r\n setReaction(envelope.sender.id, {\r\n emoji: envelope.payload.emoji,\r\n ts: Date.now(),\r\n nonce: envelope.payload.nonce,\r\n });\r\n}\r\n","import { createLogger } from \"../../utils\";\r\n\r\nexport const logger = createLogger(\"reactions\");\r\n\r\nexport function validateEmoji(emoji: string): {\r\n valid: boolean;\r\n error?: string;\r\n} {\r\n if (!emoji || typeof emoji !== \"string\") {\r\n return { valid: false, error: \"empty\" };\r\n }\r\n if (emoji.length > 10) {\r\n return { valid: false, error: \"too long\" };\r\n }\r\n return { valid: true };\r\n}\r\n\r\nexport function generateNonce(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n}\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { applyIncomingReaction, useReactionsStore } from \"./store\";\r\nimport type { ReactionEnvelope } from \"./types\";\r\nimport { generateNonce, validateEmoji } from \"./utils\";\r\n\r\nconst logger = createLogger(\"reactions\");\r\n\r\nexport class ReactionsService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n private pruneInterval: ReturnType<typeof setInterval> | undefined;\r\n private lastSendAt = 0;\r\n private minIntervalMs = 200;\r\n private lastRemoteTs = new Map<string, number>();\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private canSendNow(): boolean {\r\n const now = Date.now();\r\n if (now - this.lastSendAt < this.minIntervalMs) return false;\r\n this.lastSendAt = now;\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) return;\r\n\r\n this.room.registerTextStreamHandler(\"reactions:v1\", async (reader) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncoming(text);\r\n } catch (err) {\r\n logger.error(\"Error reading reactions stream\", err);\r\n }\r\n });\r\n\r\n this.pruneInterval = setInterval(() => {\r\n useReactionsStore.getState().pruneExpired();\r\n }, 1000);\r\n\r\n this.isSubscribed = true;\r\n logger.info(\"ReactionsService subscribed\");\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n if (this.pruneInterval) {\r\n clearInterval(this.pruneInterval);\r\n this.pruneInterval = undefined;\r\n }\r\n logger.info(\"ReactionsService unsubscribed\");\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async sendReaction(emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"REACTIONS_ROOM_NOT_READY\",\r\n message: \"Cannot send reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateEmoji(emoji);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"REACTIONS_INVALID_EMOJI\",\r\n message: validation.error || \"Invalid emoji\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n if (!this.canSendNow()) {\r\n logger.debug(\"Rate limited, skipping send\");\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n const ts = Date.now();\r\n const nonce = generateNonce();\r\n\r\n useReactionsStore.getState().setReaction(senderInfo.id, {\r\n emoji,\r\n ts,\r\n nonce,\r\n });\r\n\r\n try {\r\n const envelope: ReactionEnvelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n ts,\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n nonce,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"reactions:v1\",\r\n });\r\n\r\n logger.debug(\"Reaction sent\", { emoji });\r\n } catch (error) {\r\n logger.error(\"Failed to send reaction\", error);\r\n useRtcStore.getState().addError({\r\n code: \"REACTIONS_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to send reaction\",\r\n timestamp: Date.now(),\r\n context: { emoji },\r\n });\r\n }\r\n }\r\n\r\n private handleIncoming(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text) as ReactionEnvelope;\r\n if (!this.isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid reaction envelope received\", parsed);\r\n return;\r\n }\r\n\r\n if (parsed.sender.id === this.getLocalParticipantId()) {\r\n logger.debug(\"Ignoring self-echo reaction\");\r\n return;\r\n }\r\n\r\n const lastTs =\r\n this.lastRemoteTs.get(parsed.sender.id) ?? Number.NEGATIVE_INFINITY;\r\n if (parsed.ts < lastTs) {\r\n logger.debug(\"Ignoring out-of-order reaction\", {\r\n sender: parsed.sender.id,\r\n ts: parsed.ts,\r\n lastTs,\r\n });\r\n return;\r\n }\r\n this.lastRemoteTs.set(parsed.sender.id, parsed.ts);\r\n applyIncomingReaction(parsed);\r\n logger.debug(\"Reaction received\", { emoji: parsed.payload.emoji });\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming reaction\", error);\r\n }\r\n }\r\n\r\n private isValidEnvelope(e: any): e is ReactionEnvelope {\r\n return (\r\n e &&\r\n e.v === 1 &&\r\n e.kind === \"reaction\" &&\r\n typeof e.roomId === \"string\" &&\r\n e.roomId === this.room.name &&\r\n typeof e.ts === \"number\" &&\r\n e.ts > 0 &&\r\n typeof e.sender?.id === \"string\" &&\r\n typeof e.payload?.emoji === \"string\" &&\r\n typeof e.payload?.nonce === \"string\"\r\n );\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parse errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useCallback } from \"react\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { ReactionsService } from \"./service\";\r\nimport { useReactionsStore } from \"./store\";\r\n\r\nconst logger = createLogger(\"reactions:hook\");\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface UseReactionsReturn {\r\n sendReaction: (emoji: string) => Promise<void>;\r\n getReactionFor: (participantId: string) => Nullable<string>;\r\n clearReaction: (participantId: string) => void;\r\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\r\n isReady: boolean;\r\n}\r\n\r\nexport function useReactions(): UseReactionsReturn {\r\n const service = useFeatureService<ReactionsService>(\"reactions\");\r\n\r\n const reactions = useReactionsStore((state) => state.reactions);\r\n const participantCache = useReactionsStore((state) => state.participantCache);\r\n\r\n const getReactionFor = useCallback(\r\n (participantId: string): Nullable<string> => {\r\n const reaction = reactions.get(participantId);\r\n return reaction?.emoji ?? null;\r\n },\r\n [reactions]\r\n );\r\n\r\n const getParticipantInfo = useCallback(\r\n (id: string): Nullable<ParticipantMetadata> => participantCache[id] || null,\r\n [participantCache]\r\n );\r\n\r\n const sendReaction = useCallback(\r\n async (emoji: string) => {\r\n if (!service) {\r\n logger.error(\"Cannot send reaction: service not ready\");\r\n return;\r\n }\r\n return service.sendReaction(emoji);\r\n },\r\n [service]\r\n );\r\n\r\n const clearReaction = useCallback((participantId: string) => {\r\n useReactionsStore.getState().clearReaction(participantId);\r\n }, []);\r\n\r\n return {\r\n sendReaction,\r\n getReactionFor,\r\n clearReaction,\r\n getParticipantInfo,\r\n isReady: !!service,\r\n };\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport type { SpotlightEnvelope, SpotlightState, SpotlightedUser } from \"./types\";\r\n\r\ninterface SpotlightActions {\r\n spotlight: (participantId: string, info?: ParticipantMetadata) => void;\r\n unspotlight: () => void;\r\n getSpotlightedUser: () => SpotlightedUser | null;\r\n isSpotlighted: (participantId: string) => boolean;\r\n clear: () => void;\r\n}\r\n\r\nconst defaultState: SpotlightState = {\r\n spotlightedUser: null,\r\n};\r\n\r\nexport const useSpotlightStore = create<SpotlightState & SpotlightActions>()(\r\n immer((set, get) => ({\r\n ...defaultState,\r\n\r\n spotlight: (participantId, info) =>\r\n set((state) => {\r\n state.spotlightedUser = {\r\n participantId,\r\n ts: Date.now(),\r\n ...(info && { info }),\r\n };\r\n }),\r\n\r\n unspotlight: () =>\r\n set((state) => {\r\n state.spotlightedUser = null;\r\n }),\r\n\r\n getSpotlightedUser: () => get().spotlightedUser,\r\n\r\n isSpotlighted: (participantId) => {\r\n const user = get().spotlightedUser;\r\n return user?.participantId === participantId;\r\n },\r\n\r\n clear: () =>\r\n set(() => ({\r\n spotlightedUser: null,\r\n })),\r\n }))\r\n);\r\n\r\nexport function applyIncomingSpotlight(envelope: SpotlightEnvelope): void {\r\n const { spotlight, unspotlight } = useSpotlightStore.getState();\r\n\r\n switch (envelope.payload.action) {\r\n case \"spotlight\": {\r\n // Note: We don't have the target's info in the envelope, only the sender's\r\n // The info can be populated later if needed from the room's participant list\r\n spotlight(envelope.payload.targetId);\r\n break;\r\n }\r\n case \"unspotlight\": {\r\n unspotlight();\r\n break;\r\n }\r\n }\r\n}\r\n\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { applyIncomingSpotlight, useSpotlightStore } from \"./store\";\r\nimport type { SpotlightEnvelope } from \"./types\";\r\n\r\nconst logger = createLogger(\"spotlight\");\r\n\r\nexport class SpotlightService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) return;\r\n\r\n this.room.registerTextStreamHandler(\"spotlight:v1\", async (reader) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncoming(text);\r\n } catch (err) {\r\n logger.error(\"Error reading spotlight stream\", err);\r\n }\r\n });\r\n\r\n this.isSubscribed = true;\r\n logger.info(\"SpotlightService subscribed\");\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n logger.info(\"SpotlightService unsubscribed\");\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async spotlight(targetId: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"SPOTLIGHT_ROOM_NOT_READY\",\r\n message: \"Cannot spotlight: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n // Note: We store the target's ID. The target's info can be retrieved from the room's participant list if needed\r\n useSpotlightStore.getState().spotlight(targetId);\r\n\r\n try {\r\n const envelope: SpotlightEnvelope = {\r\n v: 1,\r\n kind: \"spotlight\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"spotlight\",\r\n targetId,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"spotlight:v1\",\r\n });\r\n\r\n logger.debug(\"User spotlighted\", { targetId });\r\n } catch (error) {\r\n logger.error(\"Failed to spotlight user\", error);\r\n useRtcStore.getState().addError({\r\n code: \"SPOTLIGHT_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to spotlight user\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n async unspotlight(): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"UNSPOTLIGHT_ROOM_NOT_READY\",\r\n message: \"Cannot unspotlight: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n const currentSpotlighted = useSpotlightStore.getState().getSpotlightedUser();\r\n \r\n if (!currentSpotlighted) {\r\n logger.debug(\"No user is currently spotlighted\");\r\n return;\r\n }\r\n\r\n useSpotlightStore.getState().unspotlight();\r\n\r\n try {\r\n const envelope: SpotlightEnvelope = {\r\n v: 1,\r\n kind: \"spotlight\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"unspotlight\",\r\n targetId: currentSpotlighted.participantId,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"spotlight:v1\",\r\n });\r\n\r\n logger.debug(\"User unspotlighted\");\r\n } catch (error) {\r\n logger.error(\"Failed to unspotlight user\", error);\r\n useRtcStore.getState().addError({\r\n code: \"UNSPOTLIGHT_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to unspotlight user\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n private handleIncoming(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text) as SpotlightEnvelope;\r\n if (!this.isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid spotlight envelope received\", parsed);\r\n return;\r\n }\r\n\r\n if (parsed.sender.id === this.getLocalParticipantId()) {\r\n logger.debug(\"Ignoring self-echo spotlight message\");\r\n return;\r\n }\r\n\r\n applyIncomingSpotlight(parsed);\r\n logger.debug(\"Spotlight message received\", {\r\n action: parsed.payload.action,\r\n targetId: parsed.payload.targetId,\r\n });\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming spotlight message\", error);\r\n }\r\n }\r\n\r\n private isValidEnvelope(e: any): e is SpotlightEnvelope {\r\n return (\r\n e &&\r\n e.v === 1 &&\r\n e.kind === \"spotlight\" &&\r\n typeof e.roomId === \"string\" &&\r\n e.roomId === this.room.name &&\r\n typeof e.ts === \"number\" &&\r\n e.ts > 0 &&\r\n typeof e.sender?.id === \"string\" &&\r\n typeof e.payload?.action === \"string\" &&\r\n [\"spotlight\", \"unspotlight\"].includes(e.payload.action) &&\r\n typeof e.payload?.targetId === \"string\"\r\n );\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parse errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n\r\n","import { useCallback } from \"react\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { SpotlightService } from \"./service\";\r\nimport { useSpotlightStore } from \"./store\";\r\nimport type { SpotlightedUser } from \"./types\";\r\n\r\nconst logger = createLogger(\"spotlight:hook\");\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface IUseSpotlight {\r\n spotlight: (targetId: string) => Promise<void>;\r\n unspotlight: () => Promise<void>;\r\n getSpotlightedUser: () => Nullable<SpotlightedUser>;\r\n isSpotlighted: (participantId: string) => boolean;\r\n isReady: boolean;\r\n}\r\n\r\nexport function useSpotlight(): IUseSpotlight {\r\n const service = useFeatureService<SpotlightService>(\"spotlight\");\r\n\r\n const getSpotlightedUser = useSpotlightStore(\r\n (state) => state.getSpotlightedUser\r\n );\r\n const isSpotlighted = useSpotlightStore((state) => state.isSpotlighted);\r\n\r\n const spotlight = useCallback(\r\n async (targetId: string) => {\r\n if (!service) {\r\n logger.error(\"Cannot spotlight: service not ready\");\r\n return;\r\n }\r\n return service.spotlight(targetId);\r\n },\r\n [service]\r\n );\r\n\r\n const unspotlight = useCallback(async () => {\r\n if (!service) {\r\n logger.error(\"Cannot unspotlight: service not ready\");\r\n return;\r\n }\r\n return service.unspotlight();\r\n }, [service]);\r\n\r\n return {\r\n spotlight,\r\n unspotlight,\r\n getSpotlightedUser,\r\n isSpotlighted,\r\n isReady: !!service,\r\n };\r\n}\r\n\r\n","import type { Room } from \"livekit-client\";\r\nimport { ChatService, useChatStore } from \"./chat\";\r\nimport { RaiseHandService, useRaiseHandStore } from \"./raiseHand\";\r\nimport { ReactionsService, useReactionsStore } from \"./reactions\";\r\nimport { SpotlightService, useSpotlightStore } from \"./spotlight\";\r\nimport type { RealtimeFeature } from \"./types\";\r\n\r\nexport const FEATURES: Record<string, RealtimeFeature> = {\r\n chat: {\r\n name: \"chat\",\r\n createService: (room: Room) => new ChatService(room),\r\n cleanupStore: () => useChatStore.getState().clearChat(),\r\n },\r\n reactions: {\r\n name: \"reactions\",\r\n createService: (room: Room) => new ReactionsService(room),\r\n cleanupStore: () => useReactionsStore.getState().clear(),\r\n },\r\n \"raise-hand\": {\r\n name: \"raise-hand\",\r\n createService: (room: Room) => new RaiseHandService(room),\r\n cleanupStore: () => useRaiseHandStore.getState().clear(),\r\n },\r\n spotlight: {\r\n name: \"spotlight\",\r\n createService: (room: Room) => new SpotlightService(room),\r\n cleanupStore: () => useSpotlightStore.getState().clear(),\r\n },\r\n};\r\n\r\nexport const DEFAULT_FEATURES = [\"chat\", \"reactions\", \"raise-hand\", \"spotlight\"];\r\n","import type { Room } from \"livekit-client\";\r\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { createLogger } from \"../utils\";\r\nimport {\r\n DataChannelContext,\r\n type DataChannelContextValue,\r\n} from \"./DataChannelContext\";\r\nimport { DEFAULT_FEATURES, FEATURES } from \"./registry\";\r\n\r\nconst logger = createLogger(\"channels:provider\");\r\n\r\nexport interface DataChannelProviderProps {\r\n room: Room;\r\n features?: string[];\r\n children: ReactNode;\r\n}\r\n\r\nexport function DataChannelProvider({\r\n room,\r\n features = DEFAULT_FEATURES,\r\n children,\r\n}: DataChannelProviderProps) {\r\n const services = useRef<Map<string, any>>(new Map());\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!room) {\r\n logger.warn(\"DataChannelProvider mounted without room\");\r\n return;\r\n }\r\n\r\n logger.debug(\"Initializing features\", { features });\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n\r\n if (!feature) {\r\n logger.warn(`Feature \"${featureName}\" not found in registry`);\r\n continue;\r\n }\r\n\r\n try {\r\n logger.debug(`Initializing feature: ${featureName}`);\r\n const service = feature.createService(room);\r\n\r\n service.subscribe();\r\n services.current.set(featureName, service);\r\n\r\n logger.info(`Feature \"${featureName}\" initialized`);\r\n } catch (error) {\r\n logger.error(`Failed to initialize feature \"${featureName}\"`, error);\r\n }\r\n }\r\n\r\n setIsReady(true);\r\n logger.info(\"All features initialized\");\r\n return () => {\r\n logger.debug(\"Cleaning up features\");\r\n\r\n // Unsubscribe all services\r\n services.current.forEach((service, name) => {\r\n try {\r\n logger.debug(`Unsubscribing feature: ${name}`);\r\n service.unsubscribe();\r\n } catch (error) {\r\n logger.error(`Failed to unsubscribe feature \"${name}\"`, error);\r\n }\r\n });\r\n\r\n // Clean up stores\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n if (feature?.cleanupStore) {\r\n try {\r\n logger.debug(`Cleaning store for feature: ${featureName}`);\r\n feature.cleanupStore();\r\n } catch (error) {\r\n logger.error(`Failed to cleanup store for \"${featureName}\"`, error);\r\n }\r\n }\r\n }\r\n\r\n services.current.clear();\r\n setIsReady(false);\r\n logger.info(\"Features cleanup complete\");\r\n };\r\n }, [room, features]);\r\n\r\n const contextValue = useMemo<DataChannelContextValue>(\r\n () => ({\r\n services: services.current,\r\n isReady,\r\n }),\r\n [isReady]\r\n );\r\n\r\n return (\r\n <DataChannelContext.Provider value={contextValue}>\r\n {children}\r\n </DataChannelContext.Provider>\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/logger.ts","../../src/channel/DataChannelContext.ts","../../src/state/types.ts","../../src/state/store.ts","../../src/channel/chat/store.ts","../../src/channel/chat/utils.ts","../../src/channel/chat/service.ts","../../src/channel/chat/useChat.ts","../../src/channel/raiseHand/store.ts","../../src/channel/raiseHand/service.ts","../../src/channel/raiseHand/useRaiseHand.ts","../../src/channel/reactions/store.ts","../../src/channel/reactions/utils.ts","../../src/channel/reactions/service.ts","../../src/channel/reactions/useReactions.ts","../../src/channel/spotlight/store.ts","../../src/channel/spotlight/service.ts","../../src/channel/spotlight/useSpotlight.ts","../../src/channel/registry.ts","../../src/channel/DataChannelProvider.tsx"],"names":["createContext","useContext","create","immer","entry","nanoid","ConnectionState","useMemo","useCallback","react","defaultState","logger","useRef","useState","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Comprehensive logging system for the Callpad Web SDK\r\n *\r\n * Features:\r\n * - Log level filtering (debug, info, warn, error)\r\n * - Environment variable configuration (DEBUG, CALLPAD_LOG_LEVEL)\r\n * - Hierarchical namespacing (callpad:socket:connection)\r\n * - Custom logger integration\r\n * - Zero-cost when disabled\r\n */\r\n\r\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enableDebug?: boolean;\r\n customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n}\r\n\r\nexport interface CallpadLogger {\r\n debug(message: string, meta?: any): void;\r\n info(message: string, meta?: any): void;\r\n warn(message: string, meta?: any): void;\r\n error(message: string, meta?: any): void;\r\n child(namespace: string): CallpadLogger;\r\n setLevel(level: LogLevel): void;\r\n isLevelEnabled(level: LogLevel): boolean;\r\n}\r\n\r\nconst LOG_LEVELS: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n};\r\n\r\nclass CallpadLoggerImpl implements CallpadLogger {\r\n private namespace: string;\r\n private level: LogLevel;\r\n private enableDebug: boolean;\r\n private customLogger?: (level: LogLevel, message: string, meta?: any) => void;\r\n\r\n constructor(namespace = \"callpad\", options: LoggerOptions = {}) {\r\n this.namespace = namespace;\r\n this.level = options.level ?? this.getDefaultLevel();\r\n this.enableDebug = options.enableDebug ?? this.shouldEnableDebug();\r\n if (options.customLogger) {\r\n this.customLogger = options.customLogger;\r\n }\r\n }\r\n\r\n private getDefaultLevel(): LogLevel {\r\n const envLevel =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__CALLPAD_LOG_LEVEL__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.CALLPAD_LOG_LEVEL;\r\n\r\n if (envLevel && this.isValidLogLevel(envLevel)) {\r\n return envLevel as LogLevel;\r\n }\r\n\r\n const isProduction =\r\n typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.NODE_ENV === \"production\";\r\n\r\n return isProduction ? \"warn\" : \"info\";\r\n }\r\n\r\n private shouldEnableDebug(): boolean {\r\n const debugEnv =\r\n typeof window !== \"undefined\"\r\n ? (window as any).__DEBUG__\r\n : typeof globalThis !== \"undefined\" &&\r\n (globalThis as any).process?.env?.DEBUG;\r\n\r\n if (!debugEnv) return false;\r\n\r\n const debugPatterns = debugEnv.split(/[\\s,]+/);\r\n return debugPatterns.some((pattern: string) => {\r\n if (pattern === \"*\") return true;\r\n if (pattern.endsWith(\"*\")) {\r\n const prefix = pattern.slice(0, -1);\r\n return this.namespace.startsWith(prefix);\r\n }\r\n return this.namespace === pattern;\r\n });\r\n }\r\n\r\n private isValidLogLevel(level: string): boolean {\r\n return Object.keys(LOG_LEVELS).includes(level);\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n if (level === \"debug\" && !this.enableDebug) {\r\n return false;\r\n }\r\n return LOG_LEVELS[level] >= LOG_LEVELS[this.level];\r\n }\r\n\r\n private formatMessage(level: LogLevel, message: string, meta?: any): void {\r\n if (!this.shouldLog(level)) return;\r\n\r\n const timestamp = new Date().toISOString();\r\n const prefix = `[${timestamp}] [${this.namespace}] [${level.toUpperCase()}]`;\r\n\r\n if (this.customLogger) {\r\n this.customLogger(level, message, meta);\r\n return;\r\n }\r\n\r\n const logMethod =\r\n level === \"error\"\r\n ? console.error\r\n : level === \"warn\"\r\n ? console.warn\r\n : level === \"info\"\r\n ? console.info\r\n : console.log;\r\n\r\n if (meta !== undefined) {\r\n logMethod(`${prefix} ${message}`, meta);\r\n } else {\r\n logMethod(`${prefix} ${message}`);\r\n }\r\n }\r\n\r\n debug(message: string, meta?: any): void {\r\n this.formatMessage(\"debug\", message, meta);\r\n }\r\n\r\n info(message: string, meta?: any): void {\r\n this.formatMessage(\"info\", message, meta);\r\n }\r\n\r\n warn(message: string, meta?: any): void {\r\n this.formatMessage(\"warn\", message, meta);\r\n }\r\n\r\n error(message: string, meta?: any): void {\r\n this.formatMessage(\"error\", message, meta);\r\n }\r\n\r\n child(namespace: string): CallpadLogger {\r\n const childNamespace = `${this.namespace}:${namespace}`;\r\n const childOptions: LoggerOptions = {\r\n level: this.level,\r\n enableDebug: this.enableDebug,\r\n };\r\n if (this.customLogger) {\r\n childOptions.customLogger = this.customLogger;\r\n }\r\n return new CallpadLoggerImpl(childNamespace, childOptions);\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n\r\n isLevelEnabled(level: LogLevel): boolean {\r\n return this.shouldLog(level);\r\n }\r\n}\r\n\r\nlet rootLogger: CallpadLogger | null = null;\r\n\r\nexport function createLogger(\r\n namespace?: string,\r\n options?: LoggerOptions\r\n): CallpadLogger {\r\n if (!namespace) {\r\n if (!rootLogger) {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n }\r\n return rootLogger;\r\n }\r\n\r\n return new CallpadLoggerImpl(`callpad:${namespace}`, options);\r\n}\r\n\r\nexport function setGlobalLoggerOptions(options: LoggerOptions): void {\r\n rootLogger = new CallpadLoggerImpl(\"callpad\", options);\r\n}\r\n","import { createContext, useContext } from \"react\";\r\n\r\nexport interface DataChannelContextValue {\r\n services: Map<string, any>;\r\n isReady: boolean;\r\n}\r\n\r\nexport const DataChannelContext = createContext<DataChannelContextValue | null>(\r\n null\r\n);\r\n\r\nexport function useDataChannelContext(): DataChannelContextValue {\r\n const context = useContext(DataChannelContext);\r\n if (!context) {\r\n throw new Error(\r\n \"useDataChannelContext must be used within DataChannelProvider\"\r\n );\r\n }\r\n return context;\r\n}\r\n\r\nexport function useFeatureService<T = any>(featureName: string): T {\r\n const { services } = useDataChannelContext();\r\n const service = services.get(featureName) as T;\r\n if (!service) {\r\n throw new Error(\r\n `Feature service \"${featureName}\" not found. Make sure it's enabled in DataChannelProvider.`\r\n );\r\n }\r\n\r\n return service;\r\n}\r\n","type Nullable<T> = T | null;\r\n\r\nexport type CallParticipantRole = \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n\r\nexport interface Profile {\r\n userId: string;\r\n username: string | null;\r\n firstName: string | null;\r\n lastName: string | null;\r\n profilePhoto: string | null;\r\n}\r\n\r\nexport interface ParticipantPermissions {\r\n canMute: boolean;\r\n canKick: boolean;\r\n canTransfer: boolean;\r\n canEnd: boolean;\r\n canRecord: boolean;\r\n canShareScreen: boolean;\r\n}\r\n\r\nexport interface ParticipantMetadata {\r\n userId: string | number;\r\n firstName: Nullable<string>;\r\n lastName: Nullable<string>;\r\n username: Nullable<string>;\r\n email: Nullable<string>;\r\n profilePhoto: Nullable<string>;\r\n role: CallParticipantRole;\r\n permissions: ParticipantPermissions;\r\n}\r\n\r\nexport interface LiveKitJoinInfo {\r\n token: string;\r\n roomName: string;\r\n url: string;\r\n}\r\n\r\nexport interface RecordingInfo {\r\n recordingId: string;\r\n egressId: string;\r\n state: string;\r\n startedAt: string;\r\n}\r\n\r\nexport interface Session {\r\n id: string;\r\n status: \"initializing\" | \"pending\" | \"ready\" | \"active\" | \"ended\";\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n role: \"HOST\" | \"PARTICIPANT\" | \"GUEST\";\r\n livekitInfo?: LiveKitJoinInfo;\r\n startedAt?: string;\r\n ringTimeoutMs?: number;\r\n recording?: RecordingInfo | null;\r\n}\r\n\r\nexport interface IncomingInvite {\r\n callId: string;\r\n inviteId: string;\r\n caller: ParticipantMetadata;\r\n mode: \"AUDIO\" | \"VIDEO\";\r\n expiresAt: string;\r\n expiresInMs: number;\r\n ringTimeoutMs: number;\r\n}\r\n\r\nexport interface OutgoingInvite {\r\n userId: string;\r\n status: \"sent\" | \"accepted\" | \"declined\" | \"missed\";\r\n participant?: Omit<ParticipantMetadata, \"permissions\"> | undefined;\r\n}\r\n\r\nexport interface RtcError {\r\n code: string;\r\n message: string;\r\n timestamp: number;\r\n context?: any;\r\n}\r\n\r\nexport interface RtcState {\r\n // Did we initiate the current call?\r\n initiated: boolean;\r\n\r\n // Active session (null when no active call)\r\n session: Session | null;\r\n\r\n // Incoming invitation (null when no pending invite)\r\n incomingInvite: IncomingInvite | null;\r\n\r\n outgoingInvites: Record<string, OutgoingInvite>;\r\n\r\n // Error tracking\r\n errors: RtcError[];\r\n}\r\n\r\nexport const defaultState: RtcState = {\r\n initiated: false,\r\n session: null,\r\n incomingInvite: null,\r\n outgoingInvites: {},\r\n errors: [],\r\n};\r\n\r\nimport type { Participant } from \"livekit-client\";\r\n\r\nexport interface ParticipantListOptions {\r\n pageSize?: number;\r\n includeLocalParticipant?: boolean;\r\n sortBy?: \"speaking\" | \"name\" | \"raised-hand\";\r\n}\r\n\r\nexport interface ParticipantListReturn {\r\n participants: Participant[];\r\n pinnedParticipants: Participant[];\r\n currentPage: number;\r\n totalPages: number;\r\n pageSize: number;\r\n totalParticipants: number;\r\n hasNextPage: boolean;\r\n hasPrevPage: boolean;\r\n nextPage: () => void;\r\n prevPage: () => void;\r\n setPageSize: (size: number) => void;\r\n togglePin: (participantId: string) => void;\r\n clearPinned: () => void;\r\n isPinned: (participantId: string) => boolean;\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { RtcError, RtcState } from \"./types\";\r\nimport { defaultState } from \"./types\";\r\n\r\ntype Actions = {\r\n patch: (fn: (draft: RtcState) => void) => void;\r\n reset: () => void;\r\n addError: (error: RtcError) => void;\r\n clearErrors: () => void;\r\n};\r\n\r\nexport const useRtcStore = create<RtcState & Actions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n reset: () => set(() => defaultState),\r\n\r\n addError: (error) =>\r\n set((state) => {\r\n state.errors.push(error);\r\n }),\r\n\r\n clearErrors: () =>\r\n set((state) => {\r\n state.errors = [];\r\n }),\r\n }))\r\n);\r\n\r\nexport const rtcStore = useRtcStore;\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ChatEntry, ChatState, Envelope } from \"./types\";\r\n\r\ninterface ChatActions {\r\n patch: (fn: (draft: ChatState) => void) => void;\r\n applyIncoming: (envelope: Envelope) => void;\r\n addFile: (file: File, filename: string) => void;\r\n addEntryOptimistic: (entry: ChatEntry) => void;\r\n markEntrySent: (entryId: string) => void;\r\n markEntryFailed: (entryId: string) => void;\r\n applyEdit: (entryId: string, newContent: string, version: number) => void;\r\n applyRemove: (entryId: string) => void;\r\n applyReaction: (\r\n entryId: string,\r\n emoji: string,\r\n participantId: string,\r\n op: \"add\" | \"remove\"\r\n ) => void;\r\n queuePendingOp: (entryId: string, envelope: Envelope) => void;\r\n processPendingOps: (entryId: string) => void;\r\n trimOldEntries: () => void;\r\n clearChat: () => void;\r\n}\r\n\r\nconst defaultChatState: ChatState = {\r\n byId: {},\r\n order: [],\r\n pendingOps: {},\r\n participantCache: {},\r\n maxEntries: 1000,\r\n};\r\n\r\nfunction applyReactionToEntry(\r\n entry: ChatEntry,\r\n emoji: string,\r\n participantId: string,\r\n op: \"add\" | \"remove\"\r\n) {\r\n const emojiSet = entry.reactions[emoji];\r\n if (!emojiSet) {\r\n entry.reactions[emoji] = new Set();\r\n }\r\n if (op === \"add\") {\r\n entry.reactions[emoji]?.add(participantId);\r\n } else {\r\n entry.reactions[emoji]?.delete(participantId);\r\n if (entry.reactions[emoji]?.size === 0) {\r\n delete entry.reactions[emoji];\r\n }\r\n }\r\n}\r\n\r\nfunction trimEntriesIfNeeded(state: ChatState) {\r\n if (Object.keys(state.byId).length > state.maxEntries) {\r\n const entriesToRemove = Object.keys(state.byId).length - state.maxEntries;\r\n for (let i = 0; i < entriesToRemove; i++) {\r\n const oldestId = state.order[i];\r\n if (oldestId) {\r\n delete state.byId[oldestId];\r\n }\r\n }\r\n state.order = state.order.slice(entriesToRemove);\r\n }\r\n}\r\n\r\nexport const useChatStore = create<ChatState & ChatActions>()(\r\n immer((set) => ({\r\n ...defaultChatState,\r\n\r\n patch: (fn) =>\r\n set((state) => {\r\n fn(state);\r\n }),\r\n\r\n applyIncoming: (envelope) =>\r\n set((state) => {\r\n if (envelope.kind === \"entry\") {\r\n if (state.byId[envelope.entryId]) {\r\n return;\r\n }\r\n\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: envelope.entryId,\r\n content: envelope.payload.content,\r\n sender: {\r\n id: envelope.sender.id,\r\n },\r\n createdAt: envelope.ts,\r\n version: 1,\r\n reactions: {},\r\n status: \"sent\",\r\n filename: envelope.payload?.meta?.filename,\r\n };\r\n\r\n state.byId[envelope.entryId] = entry;\r\n state.order.push(envelope.entryId);\r\n\r\n trimEntriesIfNeeded(state);\r\n\r\n const pendingOps = state.pendingOps[envelope.entryId];\r\n if (pendingOps) {\r\n delete state.pendingOps[envelope.entryId];\r\n\r\n for (const op of pendingOps) {\r\n if (op.kind === \"edit\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && op.payload.version > entry.version) {\r\n entry.content = op.payload.newContent;\r\n entry.version = op.payload.version;\r\n entry.editedAt = op.ts;\r\n }\r\n } else if (op.kind === \"remove\") {\r\n const entry = state.byId[op.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = op.ts;\r\n }\r\n } else if (op.kind === \"reaction\") {\r\n if (op.sender.info) {\r\n state.participantCache[op.sender.id] = op.sender.info;\r\n }\r\n\r\n const entry = state.byId[op.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n op.payload.emoji,\r\n op.sender.id,\r\n op.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }\r\n } else if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n if (!entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n } else {\r\n if (!state.pendingOps[envelope.entryId]) {\r\n state.pendingOps[envelope.entryId] = [];\r\n }\r\n state.pendingOps[envelope.entryId]?.push(envelope);\r\n }\r\n }\r\n }),\r\n\r\n addFile: (file, filename) =>\r\n set((state) => {\r\n const values = Object.values(state.byId);\r\n const entryArr = values.filter((val) => val.filename === filename);\r\n const entry = entryArr[0];\r\n entry!.file = file;\r\n state.byId[entry!.id] = entry!;\r\n }),\r\n\r\n addEntryOptimistic: (entry) =>\r\n set((state) => {\r\n state.byId[entry.id] = entry;\r\n state.order.push(entry.id);\r\n\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n markEntrySent: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"sent\";\r\n }\r\n }),\r\n\r\n markEntryFailed: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n entry.status = \"failed\";\r\n }\r\n }),\r\n\r\n applyEdit: (entryId, newContent, version) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && version > entry.version) {\r\n entry.content = newContent;\r\n entry.version = version;\r\n entry.editedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyRemove: (entryId) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = Date.now();\r\n }\r\n }),\r\n\r\n applyReaction: (entryId, emoji, participantId, op) =>\r\n set((state) => {\r\n const entry = state.byId[entryId];\r\n if (entry) {\r\n applyReactionToEntry(entry, emoji, participantId, op);\r\n }\r\n }),\r\n\r\n queuePendingOp: (entryId, envelope) =>\r\n set((state) => {\r\n if (!state.pendingOps[entryId]) {\r\n state.pendingOps[entryId] = [];\r\n }\r\n state.pendingOps[entryId].push(envelope);\r\n }),\r\n\r\n processPendingOps: (entryId) =>\r\n set((state) => {\r\n const pendingOps = state.pendingOps[entryId];\r\n if (!pendingOps) {\r\n return;\r\n }\r\n\r\n delete state.pendingOps[entryId];\r\n\r\n for (const envelope of pendingOps) {\r\n if (envelope.kind === \"edit\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && envelope.payload.version > entry.version) {\r\n entry.content = envelope.payload.newContent;\r\n entry.version = envelope.payload.version;\r\n entry.editedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"remove\") {\r\n const entry = state.byId[envelope.entryId];\r\n if (entry && !entry.removedAt) {\r\n entry.removedAt = envelope.ts;\r\n }\r\n } else if (envelope.kind === \"reaction\") {\r\n if (envelope.sender.info) {\r\n state.participantCache[envelope.sender.id] = envelope.sender.info;\r\n }\r\n\r\n const entry = state.byId[envelope.entryId];\r\n if (entry) {\r\n applyReactionToEntry(\r\n entry,\r\n envelope.payload.emoji,\r\n envelope.sender.id,\r\n envelope.payload.op\r\n );\r\n }\r\n }\r\n }\r\n }),\r\n\r\n trimOldEntries: () =>\r\n set((state) => {\r\n trimEntriesIfNeeded(state);\r\n }),\r\n\r\n clearChat: () => set(() => defaultChatState),\r\n }))\r\n);\r\n\r\nexport const chatStore = useChatStore;\r\n","import { nanoid } from \"nanoid\";\r\nimport type { ChatEntry, Envelope } from \"./types\";\r\n\r\nexport function compareEntries(a: ChatEntry, b: ChatEntry): number {\r\n if (a.createdAt !== b.createdAt) {\r\n return a.createdAt - b.createdAt;\r\n }\r\n\r\n if (a.sender.id !== b.sender.id) {\r\n return a.sender.id.localeCompare(b.sender.id);\r\n }\r\n\r\n return a.id.localeCompare(b.id);\r\n}\r\n\r\nexport function validateContent(content: string): {\r\n valid: boolean;\r\n error?: string;\r\n} {\r\n const trimmed = content.trim();\r\n\r\n if (trimmed.length === 0) {\r\n return { valid: false, error: \"Content cannot be empty\" };\r\n }\r\n\r\n const sizeInBytes = new TextEncoder().encode(content).length;\r\n if (sizeInBytes > 16384) {\r\n return { valid: false, error: \"Content exceeds 16KB limit\" };\r\n }\r\n\r\n return { valid: true };\r\n}\r\n\r\nexport function isValidEnvelope(data: any): data is Envelope {\r\n if (!data || typeof data !== \"object\") {\r\n return false;\r\n }\r\n\r\n if (data.v !== 1) {\r\n return false;\r\n }\r\n\r\n if (![\"entry\", \"edit\", \"remove\", \"reaction\"].includes(data.kind)) {\r\n return false;\r\n }\r\n\r\n if (\r\n typeof data.roomId !== \"string\" ||\r\n typeof data.entryId !== \"string\" ||\r\n typeof data.ts !== \"number\"\r\n ) {\r\n return false;\r\n }\r\n\r\n if (!data.sender || typeof data.sender.id !== \"string\") {\r\n return false;\r\n }\r\n\r\n if (\r\n data.kind === \"entry\" ||\r\n data.kind === \"edit\" ||\r\n data.kind === \"reaction\"\r\n ) {\r\n if (!data.payload || typeof data.payload !== \"object\") {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function generateEntryId(): string {\r\n return nanoid();\r\n}\r\n\r\nexport function getCurrentTimestamp(): number {\r\n return Date.now();\r\n}\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useChatStore } from \"./store\";\r\nimport type { ChatEntry, Envelope } from \"./types\";\r\nimport {\r\n generateEntryId,\r\n getCurrentTimestamp,\r\n isValidEnvelope,\r\n validateContent,\r\n} from \"./utils\";\r\n\r\nconst logger = createLogger(\"chat\");\r\n\r\nexport class ChatService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) {\r\n return;\r\n }\r\n // Handles incoming text streams\r\n this.room.registerTextStreamHandler(\r\n \"chat:v1\",\r\n async (reader, participantInfo) => {\r\n try {\r\n const text = await reader.readAll();\r\n console.log(\"Got here: chat:v1\", text, participantInfo.identity);\r\n this.handleIncomingMessage(text);\r\n } catch (error) {\r\n logger.error(\"Error reading text stream\", error);\r\n }\r\n }\r\n );\r\n\r\n // Handles incoming file streams\r\n this.room.registerByteStreamHandler(\r\n \"chat:v1\",\r\n async (reader, participantInfo) => {\r\n try {\r\n const info = reader.info;\r\n const filename = info.name;\r\n\r\n // Ensure BlobParts are backed by ArrayBuffer (not SharedArrayBuffer) by copying with slice().\r\n const parts = (await reader.readAll()).map((chunk) => chunk.slice());\r\n const fileBlob = new Blob(parts, { type: info.mimeType });\r\n\r\n this.handleIncomingFile(fileBlob, filename, info.mimeType);\r\n } catch (error) {\r\n logger.error(\"Error reading file stream\", error);\r\n }\r\n }\r\n );\r\n this.isSubscribed = true;\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async send(content: string, file?: File): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot send message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const messageContent =\r\n content.length === 0 && typeof file !== \"undefined\" ? file.name : content;\r\n\r\n const validation = validateContent(messageContent);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const entryId = generateEntryId();\r\n const chatStore = useChatStore.getState();\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n const entry: ChatEntry = {\r\n id: entryId,\r\n content: messageContent,\r\n sender: {\r\n id: senderInfo.id,\r\n },\r\n createdAt: getCurrentTimestamp(),\r\n version: 1,\r\n reactions: {},\r\n status: \"sending\",\r\n file: file!,\r\n };\r\n\r\n chatStore.addEntryOptimistic(entry);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"entry\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: entry.createdAt,\r\n sender: senderInfo,\r\n payload: {\r\n content,\r\n meta: { filename: file?.name },\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n if (file) {\r\n await this.room.localParticipant.sendFile(file, {\r\n mimeType: file.type,\r\n topic: \"chat:v1\",\r\n });\r\n }\r\n chatStore.markEntrySent(entryId);\r\n } catch (error) {\r\n chatStore.markEntryFailed(entryId);\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to send message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async edit(entryId: string, newContent: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot edit message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateContent(newContent);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_INVALID_CONTENT\",\r\n message: validation.error || \"Invalid content\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only edit your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const newVersion = entry.version + 1;\r\n chatStore.applyEdit(entryId, newContent, newVersion);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"edit\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n newContent,\r\n version: newVersion,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_EDIT_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to edit message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async remove(entryId: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove message: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ENTRY_NOT_FOUND\",\r\n message: \"Entry not found\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (entry.sender.id !== senderInfo.id) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_UNAUTHORIZED\",\r\n message: \"You can only remove your own messages\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n return;\r\n }\r\n\r\n chatStore.applyRemove(entryId);\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"remove\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REMOVE_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to remove message\",\r\n timestamp: Date.now(),\r\n context: { entryId },\r\n });\r\n }\r\n }\r\n\r\n async react(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot add reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"add\");\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"add\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to add reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n async unreact(entryId: string, emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_ROOM_NOT_READY\",\r\n message: \"Cannot remove reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const chatStore = useChatStore.getState();\r\n const entry = chatStore.byId[entryId];\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n if (senderInfo.info) {\r\n chatStore.patch((state) => {\r\n state.participantCache[senderInfo.id] = senderInfo.info!;\r\n });\r\n }\r\n\r\n chatStore.applyReaction(entryId, emoji, senderInfo.id, \"remove\");\r\n try {\r\n const envelope: Envelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n entryId,\r\n ts: getCurrentTimestamp(),\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n op: \"remove\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"chat:v1\",\r\n });\r\n } catch (error) {\r\n useRtcStore.getState().addError({\r\n code: \"CHAT_REACTION_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to remove reaction\",\r\n timestamp: Date.now(),\r\n context: { entryId, emoji },\r\n });\r\n }\r\n }\r\n\r\n private handleIncomingMessage(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text);\r\n if (!isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid envelope received\", parsed);\r\n return;\r\n }\r\n\r\n useChatStore.getState().applyIncoming(parsed);\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming message\", error);\r\n }\r\n }\r\n\r\n private handleIncomingFile(\r\n blob: Blob,\r\n filename: string,\r\n mimeType: string\r\n ): void {\r\n try {\r\n const file = new File([blob], filename, { type: mimeType || blob.type });\r\n\r\n useChatStore.getState().addFile(file, filename);\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming file\", error);\r\n }\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parsing errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useCallback, useMemo } from \"react\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { ChatService } from \"./service\";\r\nimport { useChatStore } from \"./store\";\r\nimport type { ChatEntry } from \"./types\";\r\nimport { compareEntries } from \"./utils\";\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface UseChatReturn {\r\n entries: ChatEntry[];\r\n isReady: boolean;\r\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\r\n isOwnEntry: (entry: ChatEntry) => boolean;\r\n send: (content: string, file?: File) => Promise<void>;\r\n edit: (id: string, content: string) => Promise<void>;\r\n remove: (id: string) => Promise<void>;\r\n react: (id: string, emoji: string) => Promise<void>;\r\n unreact: (id: string, emoji: string) => Promise<void>;\r\n}\r\n\r\nexport function useChat(): UseChatReturn {\r\n const service = useFeatureService<ChatService>(\"chat\");\r\n\r\n const byId = useChatStore((state) => state.byId);\r\n const order = useChatStore((state) => state.order);\r\n const participantCache = useChatStore((state) => state.participantCache);\r\n\r\n const entries = useMemo(() => {\r\n return order\r\n .map((id) => byId[id])\r\n .filter((entry): entry is ChatEntry => entry !== undefined)\r\n .sort(compareEntries);\r\n }, [byId, order]);\r\n\r\n const getParticipantInfo = useCallback(\r\n (id: string): Nullable<ParticipantMetadata> => {\r\n return participantCache[id] || null;\r\n },\r\n [participantCache]\r\n );\r\n\r\n const send = useCallback(\r\n async (content: string, file?: File) => service.send(content, file),\r\n [service]\r\n );\r\n\r\n const edit = useCallback(\r\n async (id: string, content: string) => service.edit(id, content),\r\n [service]\r\n );\r\n\r\n const remove = useCallback(\r\n async (id: string) => service.remove(id),\r\n [service]\r\n );\r\n\r\n const react = useCallback(\r\n async (id: string, emoji: string) => service.react(id, emoji),\r\n [service]\r\n );\r\n\r\n const unreact = useCallback(\r\n async (id: string, emoji: string) => service.unreact(id, emoji),\r\n [service]\r\n );\r\n\r\n const isOwnEntry = useCallback(\r\n (entry: ChatEntry) => entry.sender.id === service.getLocalParticipantId(),\r\n [service]\r\n );\r\n\r\n return {\r\n entries,\r\n isReady: true,\r\n getParticipantInfo,\r\n isOwnEntry,\r\n send,\r\n edit,\r\n remove,\r\n react,\r\n unreact,\r\n };\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport type { RaiseHandEnvelope, RaiseHandState, RaisedHand } from \"./types\";\r\n\r\ninterface RaiseHandActions {\r\n raiseHand: (participantId: string) => void;\r\n lowerHand: (participantId: string) => void;\r\n lowerAllHands: () => void;\r\n isHandRaised: (participantId: string) => boolean;\r\n getRaisedHandOrder: (participantId: string) => number | null;\r\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\r\n clear: () => void;\r\n}\r\n\r\nconst defaultState: RaiseHandState = {\r\n raisedHands: new Map(),\r\n nextOrder: 1,\r\n};\r\n\r\nexport const useRaiseHandStore = create<RaiseHandState & RaiseHandActions>()(\r\n immer((set, get) => ({\r\n ...defaultState,\r\n\r\n raiseHand: (participantId) =>\r\n set((state) => {\r\n if (!state.raisedHands.has(participantId)) {\r\n state.raisedHands.set(participantId, {\r\n ts: Date.now(),\r\n order: state.nextOrder++,\r\n });\r\n }\r\n }),\r\n\r\n lowerHand: (participantId) =>\r\n set((state) => {\r\n state.raisedHands.delete(participantId);\r\n // Reset order counter when all hands are lowered\r\n if (state.raisedHands.size === 0) {\r\n state.nextOrder = 1;\r\n }\r\n }),\r\n\r\n lowerAllHands: () =>\r\n set((state) => {\r\n state.raisedHands.clear();\r\n state.nextOrder = 1;\r\n }),\r\n\r\n isHandRaised: (participantId) => get().raisedHands.has(participantId),\r\n\r\n getRaisedHandOrder: (participantId) => {\r\n const hand = get().raisedHands.get(participantId);\r\n return hand?.order ?? null;\r\n },\r\n\r\n upsertParticipantInfo: (id, info) => {\r\n // No-op for now, can be extended if needed\r\n },\r\n\r\n clear: () =>\r\n set(() => ({\r\n raisedHands: new Map(),\r\n nextOrder: 1,\r\n })),\r\n }))\r\n);\r\n\r\nexport function applyIncomingRaiseHand(envelope: RaiseHandEnvelope): void {\r\n const { raiseHand, lowerHand, lowerAllHands, upsertParticipantInfo } =\r\n useRaiseHandStore.getState();\r\n\r\n if (envelope.sender.info) {\r\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\r\n }\r\n\r\n switch (envelope.payload.action) {\r\n case \"raise\": {\r\n raiseHand(envelope.sender.id);\r\n break;\r\n }\r\n case \"lower\": {\r\n const targetId = envelope.payload.targetId || envelope.sender.id;\r\n lowerHand(targetId);\r\n break;\r\n }\r\n case \"lower-all\": {\r\n lowerAllHands();\r\n break;\r\n }\r\n }\r\n}\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { applyIncomingRaiseHand, useRaiseHandStore } from \"./store\";\r\nimport type { RaiseHandEnvelope } from \"./types\";\r\n\r\nconst logger = createLogger(\"raise-hand\");\r\n\r\nexport class RaiseHandService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) return;\r\n\r\n this.room.registerTextStreamHandler(\"raise-hand:v1\", async (reader) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncoming(text);\r\n } catch (err) {\r\n logger.error(\"Error reading raise-hand stream\", err);\r\n }\r\n });\r\n\r\n this.isSubscribed = true;\r\n logger.info(\"RaiseHandService subscribed\");\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n logger.info(\"RaiseHandService unsubscribed\");\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async raiseHand(): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"RAISE_HAND_ROOM_NOT_READY\",\r\n message: \"Cannot raise hand: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n useRaiseHandStore.getState().raiseHand(senderInfo.id);\r\n\r\n try {\r\n const envelope: RaiseHandEnvelope = {\r\n v: 1,\r\n kind: \"raise-hand\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"raise\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"raise-hand:v1\",\r\n });\r\n\r\n logger.debug(\"Hand raised\");\r\n } catch (error) {\r\n logger.error(\"Failed to raise hand\", error);\r\n useRtcStore.getState().addError({\r\n code: \"RAISE_HAND_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to raise hand\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n async lowerHand(targetId?: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_HAND_ROOM_NOT_READY\",\r\n message: \"Cannot lower hand: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n const participantId = targetId || senderInfo.id;\r\n useRaiseHandStore.getState().lowerHand(participantId);\r\n\r\n try {\r\n const envelope: RaiseHandEnvelope = {\r\n v: 1,\r\n kind: \"raise-hand\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"lower\",\r\n targetId: participantId,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"raise-hand:v1\",\r\n });\r\n\r\n logger.debug(\"Hand lowered\", { targetId: participantId });\r\n } catch (error) {\r\n logger.error(\"Failed to lower hand\", error);\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_HAND_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to lower hand\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n async lowerAllHands(): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_ALL_HANDS_ROOM_NOT_READY\",\r\n message: \"Cannot lower all hands: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n useRaiseHandStore.getState().lowerAllHands();\r\n\r\n try {\r\n const envelope: RaiseHandEnvelope = {\r\n v: 1,\r\n kind: \"raise-hand\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"lower-all\",\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"raise-hand:v1\",\r\n });\r\n\r\n logger.debug(\"All hands lowered\");\r\n } catch (error) {\r\n logger.error(\"Failed to lower all hands\", error);\r\n useRtcStore.getState().addError({\r\n code: \"LOWER_ALL_HANDS_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to lower all hands\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n private handleIncoming(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text) as RaiseHandEnvelope;\r\n if (!this.isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid raise-hand envelope received\", parsed);\r\n return;\r\n }\r\n\r\n if (parsed.sender.id === this.getLocalParticipantId()) {\r\n logger.debug(\"Ignoring self-echo raise-hand message\");\r\n return;\r\n }\r\n\r\n applyIncomingRaiseHand(parsed);\r\n logger.debug(\"Raise-hand message received\", {\r\n action: parsed.payload.action,\r\n });\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming raise-hand message\", error);\r\n }\r\n }\r\n\r\n private isValidEnvelope(e: any): e is RaiseHandEnvelope {\r\n return (\r\n e &&\r\n e.v === 1 &&\r\n e.kind === \"raise-hand\" &&\r\n typeof e.roomId === \"string\" &&\r\n e.roomId === this.room.name &&\r\n typeof e.ts === \"number\" &&\r\n e.ts > 0 &&\r\n typeof e.sender?.id === \"string\" &&\r\n typeof e.payload?.action === \"string\" &&\r\n [\"raise\", \"lower\", \"lower-all\"].includes(e.payload.action)\r\n );\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parse errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useCallback, useMemo } from \"react\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { RaiseHandService } from \"./service\";\r\nimport { useRaiseHandStore } from \"./store\";\r\n\r\nconst logger = createLogger(\"raise-hand:hook\");\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface RaisedHandInfo {\r\n participantId: string;\r\n order: number;\r\n ts: number;\r\n}\r\n\r\nexport interface UseRaiseHandReturn {\r\n raiseHand: () => Promise<void>;\r\n lowerHand: (participantId?: string) => Promise<void>;\r\n lowerAllHands: () => Promise<void>;\r\n isHandRaised: (participantId: string) => boolean;\r\n getRaisedHandOrder: (participantId: string) => Nullable<number>;\r\n getRaisedHands: () => RaisedHandInfo[];\r\n isReady: boolean;\r\n}\r\n\r\nexport function useRaiseHand(): UseRaiseHandReturn {\r\n const service = useFeatureService<RaiseHandService>(\"raise-hand\");\r\n\r\n const raisedHands = useRaiseHandStore((state) => state.raisedHands);\r\n const isHandRaised = useRaiseHandStore((state) => state.isHandRaised);\r\n const getRaisedHandOrder = useRaiseHandStore(\r\n (state) => state.getRaisedHandOrder\r\n );\r\n\r\n const raiseHand = useCallback(async () => {\r\n if (!service) {\r\n logger.error(\"Cannot raise hand: service not ready\");\r\n return;\r\n }\r\n return service.raiseHand();\r\n }, [service]);\r\n\r\n const lowerHand = useCallback(\r\n async (participantId?: string) => {\r\n if (!service) {\r\n logger.error(\"Cannot lower hand: service not ready\");\r\n return;\r\n }\r\n return service.lowerHand(participantId);\r\n },\r\n [service]\r\n );\r\n\r\n const lowerAllHands = useCallback(async () => {\r\n if (!service) {\r\n logger.error(\"Cannot lower all hands: service not ready\");\r\n return;\r\n }\r\n return service.lowerAllHands();\r\n }, [service]);\r\n\r\n const getRaisedHands = useCallback((): RaisedHandInfo[] => {\r\n const hands: RaisedHandInfo[] = [];\r\n for (const [participantId, hand] of raisedHands.entries()) {\r\n hands.push({\r\n participantId,\r\n order: hand.order,\r\n ts: hand.ts,\r\n });\r\n }\r\n return hands.sort((a, b) => a.order - b.order);\r\n }, [raisedHands]);\r\n\r\n return {\r\n raiseHand,\r\n lowerHand,\r\n lowerAllHands,\r\n isHandRaised,\r\n getRaisedHandOrder,\r\n getRaisedHands,\r\n isReady: !!service,\r\n };\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport type {\r\n ParticipantReaction,\r\n ReactionEnvelope,\r\n ReactionsState,\r\n} from \"./types\";\r\n\r\ninterface ReactionsActions {\r\n setReaction: (participantId: string, reaction: ParticipantReaction) => void;\r\n clearReaction: (participantId: string) => void;\r\n upsertParticipantInfo: (id: string, info: ParticipantMetadata) => void;\r\n pruneExpired: (now?: number) => void;\r\n clear: () => void;\r\n}\r\n\r\nconst defaultState: ReactionsState = {\r\n reactions: new Map(),\r\n participantCache: {},\r\n ttlMs: 4000,\r\n};\r\n\r\nexport const useReactionsStore = create<ReactionsState & ReactionsActions>()(\r\n immer((set) => ({\r\n ...defaultState,\r\n\r\n setReaction: (participantId, reaction) =>\r\n set((state) => {\r\n state.reactions.set(participantId, reaction);\r\n }),\r\n\r\n clearReaction: (participantId) =>\r\n set((state) => {\r\n state.reactions.delete(participantId);\r\n }),\r\n\r\n upsertParticipantInfo: (id, info) =>\r\n set((state) => {\r\n state.participantCache[id] = info;\r\n }),\r\n\r\n pruneExpired: (now = Date.now()) =>\r\n set((state) => {\r\n const entries = Array.from(state.reactions.entries());\r\n for (const [participantId, reaction] of entries) {\r\n if (reaction.ts + state.ttlMs < now) {\r\n state.reactions.delete(participantId);\r\n }\r\n }\r\n }),\r\n\r\n clear: () =>\r\n set(() => ({\r\n reactions: new Map(),\r\n participantCache: {},\r\n ttlMs: defaultState.ttlMs,\r\n })),\r\n }))\r\n);\r\n\r\nexport function applyIncomingReaction(envelope: ReactionEnvelope): void {\r\n const { upsertParticipantInfo, setReaction } = useReactionsStore.getState();\r\n\r\n if (envelope.sender.info) {\r\n upsertParticipantInfo(envelope.sender.id, envelope.sender.info);\r\n }\r\n\r\n setReaction(envelope.sender.id, {\r\n emoji: envelope.payload.emoji,\r\n ts: Date.now(),\r\n nonce: envelope.payload.nonce,\r\n });\r\n}\r\n","import { createLogger } from \"../../utils\";\r\n\r\nexport const logger = createLogger(\"reactions\");\r\n\r\nexport function validateEmoji(emoji: string): {\r\n valid: boolean;\r\n error?: string;\r\n} {\r\n if (!emoji || typeof emoji !== \"string\") {\r\n return { valid: false, error: \"empty\" };\r\n }\r\n if (emoji.length > 10) {\r\n return { valid: false, error: \"too long\" };\r\n }\r\n return { valid: true };\r\n}\r\n\r\nexport function generateNonce(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n}\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { applyIncomingReaction, useReactionsStore } from \"./store\";\r\nimport type { ReactionEnvelope } from \"./types\";\r\nimport { generateNonce, validateEmoji } from \"./utils\";\r\n\r\nconst logger = createLogger(\"reactions\");\r\n\r\nexport class ReactionsService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n private pruneInterval: ReturnType<typeof setInterval> | undefined;\r\n private lastSendAt = 0;\r\n private minIntervalMs = 200;\r\n private lastRemoteTs = new Map<string, number>();\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private canSendNow(): boolean {\r\n const now = Date.now();\r\n if (now - this.lastSendAt < this.minIntervalMs) return false;\r\n this.lastSendAt = now;\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) return;\r\n\r\n this.room.registerTextStreamHandler(\"reactions:v1\", async (reader) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncoming(text);\r\n } catch (err) {\r\n logger.error(\"Error reading reactions stream\", err);\r\n }\r\n });\r\n\r\n this.pruneInterval = setInterval(() => {\r\n useReactionsStore.getState().pruneExpired();\r\n }, 1000);\r\n\r\n this.isSubscribed = true;\r\n logger.info(\"ReactionsService subscribed\");\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n if (this.pruneInterval) {\r\n clearInterval(this.pruneInterval);\r\n this.pruneInterval = undefined;\r\n }\r\n logger.info(\"ReactionsService unsubscribed\");\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async sendReaction(emoji: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"REACTIONS_ROOM_NOT_READY\",\r\n message: \"Cannot send reaction: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const validation = validateEmoji(emoji);\r\n if (!validation.valid) {\r\n useRtcStore.getState().addError({\r\n code: \"REACTIONS_INVALID_EMOJI\",\r\n message: validation.error || \"Invalid emoji\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n if (!this.canSendNow()) {\r\n logger.debug(\"Rate limited, skipping send\");\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n const ts = Date.now();\r\n const nonce = generateNonce();\r\n\r\n useReactionsStore.getState().setReaction(senderInfo.id, {\r\n emoji,\r\n ts,\r\n nonce,\r\n });\r\n\r\n try {\r\n const envelope: ReactionEnvelope = {\r\n v: 1,\r\n kind: \"reaction\",\r\n roomId: this.room.name,\r\n ts,\r\n sender: senderInfo,\r\n payload: {\r\n emoji,\r\n nonce,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"reactions:v1\",\r\n });\r\n\r\n logger.debug(\"Reaction sent\", { emoji });\r\n } catch (error) {\r\n logger.error(\"Failed to send reaction\", error);\r\n useRtcStore.getState().addError({\r\n code: \"REACTIONS_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to send reaction\",\r\n timestamp: Date.now(),\r\n context: { emoji },\r\n });\r\n }\r\n }\r\n\r\n private handleIncoming(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text) as ReactionEnvelope;\r\n if (!this.isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid reaction envelope received\", parsed);\r\n return;\r\n }\r\n\r\n if (parsed.sender.id === this.getLocalParticipantId()) {\r\n logger.debug(\"Ignoring self-echo reaction\");\r\n return;\r\n }\r\n\r\n const lastTs =\r\n this.lastRemoteTs.get(parsed.sender.id) ?? Number.NEGATIVE_INFINITY;\r\n if (parsed.ts < lastTs) {\r\n logger.debug(\"Ignoring out-of-order reaction\", {\r\n sender: parsed.sender.id,\r\n ts: parsed.ts,\r\n lastTs,\r\n });\r\n return;\r\n }\r\n this.lastRemoteTs.set(parsed.sender.id, parsed.ts);\r\n applyIncomingReaction(parsed);\r\n logger.debug(\"Reaction received\", { emoji: parsed.payload.emoji });\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming reaction\", error);\r\n }\r\n }\r\n\r\n private isValidEnvelope(e: any): e is ReactionEnvelope {\r\n return (\r\n e &&\r\n e.v === 1 &&\r\n e.kind === \"reaction\" &&\r\n typeof e.roomId === \"string\" &&\r\n e.roomId === this.room.name &&\r\n typeof e.ts === \"number\" &&\r\n e.ts > 0 &&\r\n typeof e.sender?.id === \"string\" &&\r\n typeof e.payload?.emoji === \"string\" &&\r\n typeof e.payload?.nonce === \"string\"\r\n );\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parse errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n","import { useCallback } from \"react\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { ReactionsService } from \"./service\";\r\nimport { useReactionsStore } from \"./store\";\r\n\r\nconst logger = createLogger(\"reactions:hook\");\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface UseReactionsReturn {\r\n sendReaction: (emoji: string) => Promise<void>;\r\n getReactionFor: (participantId: string) => Nullable<string>;\r\n clearReaction: (participantId: string) => void;\r\n getParticipantInfo: (id: string) => Nullable<ParticipantMetadata>;\r\n isReady: boolean;\r\n}\r\n\r\nexport function useReactions(): UseReactionsReturn {\r\n const service = useFeatureService<ReactionsService>(\"reactions\");\r\n\r\n const reactions = useReactionsStore((state) => state.reactions);\r\n const participantCache = useReactionsStore((state) => state.participantCache);\r\n\r\n const getReactionFor = useCallback(\r\n (participantId: string): Nullable<string> => {\r\n const reaction = reactions.get(participantId);\r\n return reaction?.emoji ?? null;\r\n },\r\n [reactions]\r\n );\r\n\r\n const getParticipantInfo = useCallback(\r\n (id: string): Nullable<ParticipantMetadata> => participantCache[id] || null,\r\n [participantCache]\r\n );\r\n\r\n const sendReaction = useCallback(\r\n async (emoji: string) => {\r\n if (!service) {\r\n logger.error(\"Cannot send reaction: service not ready\");\r\n return;\r\n }\r\n return service.sendReaction(emoji);\r\n },\r\n [service]\r\n );\r\n\r\n const clearReaction = useCallback((participantId: string) => {\r\n useReactionsStore.getState().clearReaction(participantId);\r\n }, []);\r\n\r\n return {\r\n sendReaction,\r\n getReactionFor,\r\n clearReaction,\r\n getParticipantInfo,\r\n isReady: !!service,\r\n };\r\n}\r\n","import { create } from \"zustand\";\r\nimport { immer } from \"zustand/middleware/immer\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport type { SpotlightEnvelope, SpotlightState, SpotlightedUser } from \"./types\";\r\n\r\ninterface SpotlightActions {\r\n spotlight: (participantId: string, info?: ParticipantMetadata) => void;\r\n unspotlight: () => void;\r\n getSpotlightedUser: () => SpotlightedUser | null;\r\n isSpotlighted: (participantId: string) => boolean;\r\n clear: () => void;\r\n}\r\n\r\nconst defaultState: SpotlightState = {\r\n spotlightedUser: null,\r\n};\r\n\r\nexport const useSpotlightStore = create<SpotlightState & SpotlightActions>()(\r\n immer((set, get) => ({\r\n ...defaultState,\r\n\r\n spotlight: (participantId, info) =>\r\n set((state) => {\r\n state.spotlightedUser = {\r\n participantId,\r\n ts: Date.now(),\r\n ...(info && { info }),\r\n };\r\n }),\r\n\r\n unspotlight: () =>\r\n set((state) => {\r\n state.spotlightedUser = null;\r\n }),\r\n\r\n getSpotlightedUser: () => get().spotlightedUser,\r\n\r\n isSpotlighted: (participantId) => {\r\n const user = get().spotlightedUser;\r\n return user?.participantId === participantId;\r\n },\r\n\r\n clear: () =>\r\n set(() => ({\r\n spotlightedUser: null,\r\n })),\r\n }))\r\n);\r\n\r\nexport function applyIncomingSpotlight(envelope: SpotlightEnvelope): void {\r\n const { spotlight, unspotlight } = useSpotlightStore.getState();\r\n\r\n switch (envelope.payload.action) {\r\n case \"spotlight\": {\r\n // Note: We don't have the target's info in the envelope, only the sender's\r\n // The info can be populated later if needed from the room's participant list\r\n spotlight(envelope.payload.targetId);\r\n break;\r\n }\r\n case \"unspotlight\": {\r\n unspotlight();\r\n break;\r\n }\r\n }\r\n}\r\n\r\n","import { ConnectionState, type Room } from \"livekit-client\";\r\nimport { useRtcStore } from \"../../state/store\";\r\nimport type { ParticipantMetadata } from \"../../state/types\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { applyIncomingSpotlight, useSpotlightStore } from \"./store\";\r\nimport type { SpotlightEnvelope } from \"./types\";\r\n\r\nconst logger = createLogger(\"spotlight\");\r\n\r\nexport class SpotlightService {\r\n private readonly room: Room;\r\n private isSubscribed = false;\r\n\r\n constructor(room: Room) {\r\n this.room = room;\r\n }\r\n\r\n private isRoomReady(): boolean {\r\n if (!this.room) {\r\n logger.warn(\"Room not initialized\");\r\n return false;\r\n }\r\n\r\n if (this.room.state !== ConnectionState.Connected) {\r\n logger.warn(\"Room not connected\", { state: this.room.state });\r\n return false;\r\n }\r\n\r\n if (!this.room.localParticipant) {\r\n logger.warn(\"Local participant not available\");\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n subscribe(): void {\r\n if (this.isSubscribed) return;\r\n\r\n this.room.registerTextStreamHandler(\"spotlight:v1\", async (reader) => {\r\n try {\r\n const text = await reader.readAll();\r\n this.handleIncoming(text);\r\n } catch (err) {\r\n logger.error(\"Error reading spotlight stream\", err);\r\n }\r\n });\r\n\r\n this.isSubscribed = true;\r\n logger.info(\"SpotlightService subscribed\");\r\n }\r\n\r\n unsubscribe(): void {\r\n this.isSubscribed = false;\r\n logger.info(\"SpotlightService unsubscribed\");\r\n }\r\n\r\n getLocalParticipantId(): string {\r\n return this.room.localParticipant.identity;\r\n }\r\n\r\n async spotlight(targetId: string): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"SPOTLIGHT_ROOM_NOT_READY\",\r\n message: \"Cannot spotlight: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n // Note: We store the target's ID. The target's info can be retrieved from the room's participant list if needed\r\n useSpotlightStore.getState().spotlight(targetId);\r\n\r\n try {\r\n const envelope: SpotlightEnvelope = {\r\n v: 1,\r\n kind: \"spotlight\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"spotlight\",\r\n targetId,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"spotlight:v1\",\r\n });\r\n\r\n logger.debug(\"User spotlighted\", { targetId });\r\n } catch (error) {\r\n logger.error(\"Failed to spotlight user\", error);\r\n useRtcStore.getState().addError({\r\n code: \"SPOTLIGHT_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to spotlight user\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n async unspotlight(): Promise<void> {\r\n if (!this.isRoomReady()) {\r\n useRtcStore.getState().addError({\r\n code: \"UNSPOTLIGHT_ROOM_NOT_READY\",\r\n message: \"Cannot unspotlight: room not connected\",\r\n timestamp: Date.now(),\r\n });\r\n return;\r\n }\r\n\r\n const senderInfo = this.getSenderInfo();\r\n const currentSpotlighted = useSpotlightStore.getState().getSpotlightedUser();\r\n \r\n if (!currentSpotlighted) {\r\n logger.debug(\"No user is currently spotlighted\");\r\n return;\r\n }\r\n\r\n useSpotlightStore.getState().unspotlight();\r\n\r\n try {\r\n const envelope: SpotlightEnvelope = {\r\n v: 1,\r\n kind: \"spotlight\",\r\n roomId: this.room.name,\r\n ts: Date.now(),\r\n sender: senderInfo,\r\n payload: {\r\n action: \"unspotlight\",\r\n targetId: currentSpotlighted.participantId,\r\n },\r\n };\r\n\r\n await this.room.localParticipant.sendText(JSON.stringify(envelope), {\r\n topic: \"spotlight:v1\",\r\n });\r\n\r\n logger.debug(\"User unspotlighted\");\r\n } catch (error) {\r\n logger.error(\"Failed to unspotlight user\", error);\r\n useRtcStore.getState().addError({\r\n code: \"UNSPOTLIGHT_SEND_FAILED\",\r\n message:\r\n error instanceof Error ? error.message : \"Failed to unspotlight user\",\r\n timestamp: Date.now(),\r\n });\r\n }\r\n }\r\n\r\n private handleIncoming(text: string): void {\r\n try {\r\n const parsed = JSON.parse(text) as SpotlightEnvelope;\r\n if (!this.isValidEnvelope(parsed)) {\r\n logger.warn(\"Invalid spotlight envelope received\", parsed);\r\n return;\r\n }\r\n\r\n if (parsed.sender.id === this.getLocalParticipantId()) {\r\n logger.debug(\"Ignoring self-echo spotlight message\");\r\n return;\r\n }\r\n\r\n applyIncomingSpotlight(parsed);\r\n logger.debug(\"Spotlight message received\", {\r\n action: parsed.payload.action,\r\n targetId: parsed.payload.targetId,\r\n });\r\n } catch (error) {\r\n logger.error(\"Error parsing incoming spotlight message\", error);\r\n }\r\n }\r\n\r\n private isValidEnvelope(e: any): e is SpotlightEnvelope {\r\n return (\r\n e &&\r\n e.v === 1 &&\r\n e.kind === \"spotlight\" &&\r\n typeof e.roomId === \"string\" &&\r\n e.roomId === this.room.name &&\r\n typeof e.ts === \"number\" &&\r\n e.ts > 0 &&\r\n typeof e.sender?.id === \"string\" &&\r\n typeof e.payload?.action === \"string\" &&\r\n [\"spotlight\", \"unspotlight\"].includes(e.payload.action) &&\r\n typeof e.payload?.targetId === \"string\"\r\n );\r\n }\r\n\r\n private getSenderInfo(): { id: string; info?: ParticipantMetadata } {\r\n const localParticipant = this.room.localParticipant;\r\n const sender: { id: string; info?: ParticipantMetadata } = {\r\n id: localParticipant.identity,\r\n };\r\n\r\n if (localParticipant.metadata) {\r\n try {\r\n sender.info = JSON.parse(\r\n localParticipant.metadata\r\n ) as ParticipantMetadata;\r\n } catch {\r\n // Ignore metadata parse errors\r\n }\r\n }\r\n\r\n return sender;\r\n }\r\n}\r\n\r\n","import { useCallback } from \"react\";\r\nimport { createLogger } from \"../../utils\";\r\nimport { useFeatureService } from \"../DataChannelContext\";\r\nimport type { SpotlightService } from \"./service\";\r\nimport { useSpotlightStore } from \"./store\";\r\nimport type { SpotlightedUser } from \"./types\";\r\n\r\nconst logger = createLogger(\"spotlight:hook\");\r\n\r\ntype Nullable<T> = T | null;\r\n\r\nexport interface IUseSpotlight {\r\n spotlight: (targetId: string) => Promise<void>;\r\n unspotlight: () => Promise<void>;\r\n getSpotlightedUser: () => Nullable<SpotlightedUser>;\r\n isSpotlighted: (participantId: string) => boolean;\r\n isReady: boolean;\r\n}\r\n\r\nexport function useSpotlight(): IUseSpotlight {\r\n const service = useFeatureService<SpotlightService>(\"spotlight\");\r\n\r\n const getSpotlightedUser = useSpotlightStore(\r\n (state) => state.getSpotlightedUser\r\n );\r\n const isSpotlighted = useSpotlightStore((state) => state.isSpotlighted);\r\n\r\n const spotlight = useCallback(\r\n async (targetId: string) => {\r\n if (!service) {\r\n logger.error(\"Cannot spotlight: service not ready\");\r\n return;\r\n }\r\n return service.spotlight(targetId);\r\n },\r\n [service]\r\n );\r\n\r\n const unspotlight = useCallback(async () => {\r\n if (!service) {\r\n logger.error(\"Cannot unspotlight: service not ready\");\r\n return;\r\n }\r\n return service.unspotlight();\r\n }, [service]);\r\n\r\n return {\r\n spotlight,\r\n unspotlight,\r\n getSpotlightedUser,\r\n isSpotlighted,\r\n isReady: !!service,\r\n };\r\n}\r\n\r\n","import type { Room } from \"livekit-client\";\r\nimport { ChatService, useChatStore } from \"./chat\";\r\nimport { RaiseHandService, useRaiseHandStore } from \"./raiseHand\";\r\nimport { ReactionsService, useReactionsStore } from \"./reactions\";\r\nimport { SpotlightService, useSpotlightStore } from \"./spotlight\";\r\nimport type { RealtimeFeature } from \"./types\";\r\n\r\nexport const FEATURES: Record<string, RealtimeFeature> = {\r\n chat: {\r\n name: \"chat\",\r\n createService: (room: Room) => new ChatService(room),\r\n cleanupStore: () => useChatStore.getState().clearChat(),\r\n },\r\n reactions: {\r\n name: \"reactions\",\r\n createService: (room: Room) => new ReactionsService(room),\r\n cleanupStore: () => useReactionsStore.getState().clear(),\r\n },\r\n \"raise-hand\": {\r\n name: \"raise-hand\",\r\n createService: (room: Room) => new RaiseHandService(room),\r\n cleanupStore: () => useRaiseHandStore.getState().clear(),\r\n },\r\n spotlight: {\r\n name: \"spotlight\",\r\n createService: (room: Room) => new SpotlightService(room),\r\n cleanupStore: () => useSpotlightStore.getState().clear(),\r\n },\r\n};\r\n\r\nexport const DEFAULT_FEATURES = [\"chat\", \"reactions\", \"raise-hand\", \"spotlight\"];\r\n","import type { Room } from \"livekit-client\";\r\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { createLogger } from \"../utils\";\r\nimport {\r\n DataChannelContext,\r\n type DataChannelContextValue,\r\n} from \"./DataChannelContext\";\r\nimport { DEFAULT_FEATURES, FEATURES } from \"./registry\";\r\n\r\nconst logger = createLogger(\"channels:provider\");\r\n\r\nexport interface DataChannelProviderProps {\r\n room: Room;\r\n features?: string[];\r\n children: ReactNode;\r\n}\r\n\r\nexport function DataChannelProvider({\r\n room,\r\n features = DEFAULT_FEATURES,\r\n children,\r\n}: DataChannelProviderProps) {\r\n const services = useRef<Map<string, any>>(new Map());\r\n const [isReady, setIsReady] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!room) {\r\n logger.warn(\"DataChannelProvider mounted without room\");\r\n return;\r\n }\r\n\r\n logger.debug(\"Initializing features\", { features });\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n\r\n if (!feature) {\r\n logger.warn(`Feature \"${featureName}\" not found in registry`);\r\n continue;\r\n }\r\n\r\n try {\r\n logger.debug(`Initializing feature: ${featureName}`);\r\n const service = feature.createService(room);\r\n\r\n service.subscribe();\r\n services.current.set(featureName, service);\r\n\r\n logger.info(`Feature \"${featureName}\" initialized`);\r\n } catch (error) {\r\n logger.error(`Failed to initialize feature \"${featureName}\"`, error);\r\n }\r\n }\r\n\r\n setIsReady(true);\r\n logger.info(\"All features initialized\");\r\n return () => {\r\n logger.debug(\"Cleaning up features\");\r\n\r\n // Unsubscribe all services\r\n services.current.forEach((service, name) => {\r\n try {\r\n logger.debug(`Unsubscribing feature: ${name}`);\r\n service.unsubscribe();\r\n } catch (error) {\r\n logger.error(`Failed to unsubscribe feature \"${name}\"`, error);\r\n }\r\n });\r\n\r\n // Clean up stores\r\n for (const featureName of features) {\r\n const feature = FEATURES[featureName];\r\n if (feature?.cleanupStore) {\r\n try {\r\n logger.debug(`Cleaning store for feature: ${featureName}`);\r\n feature.cleanupStore();\r\n } catch (error) {\r\n logger.error(`Failed to cleanup store for \"${featureName}\"`, error);\r\n }\r\n }\r\n }\r\n\r\n services.current.clear();\r\n setIsReady(false);\r\n logger.info(\"Features cleanup complete\");\r\n };\r\n }, [room, features]);\r\n\r\n const contextValue = useMemo<DataChannelContextValue>(\r\n () => ({\r\n services: services.current,\r\n isReady,\r\n }),\r\n [isReady]\r\n );\r\n\r\n return (\r\n <DataChannelContext.Provider value={contextValue}>\r\n {children}\r\n </DataChannelContext.Provider>\r\n );\r\n}\r\n"]}
|