jamespot-react-core 1.3.6 → 1.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/build/346.5e80d1d74f0d543bfa32.chunk.js +2 -0
  2. package/build/346.5e80d1d74f0d543bfa32.chunk.js.map +1 -0
  3. package/build/605.e14ede6ac53f82a861c7.chunk.js +707 -0
  4. package/build/605.e14ede6ac53f82a861c7.chunk.js.map +1 -0
  5. package/build/app.bundle.js +879 -879
  6. package/build/app.bundle.js.LICENSE.txt +92 -1
  7. package/build/app.bundle.js.map +1 -1
  8. package/build/script/checkDependencies.d.ts +1 -0
  9. package/build/socket.sharedworker.6e975754295fd9584be6.js.map +1 -1
  10. package/build/src/App.d.ts +33 -5
  11. package/build/src/hooks/useAI.d.ts +1 -1
  12. package/build/src/redux/middleware/index.d.ts +0 -1
  13. package/build/src/redux/middleware/logger.d.ts +1 -1
  14. package/build/src/redux/slice/Article.slice.d.ts +21 -21
  15. package/build/src/redux/slice/User.slice.d.ts +21 -21
  16. package/build/src/redux/store.d.ts +191 -531
  17. package/externals.json +13 -2
  18. package/package.json +26 -28
  19. package/README.internal.md +0 -20
  20. package/build/534.606ae244f89e01f0c5fa.chunk.js +0 -2
  21. package/build/534.606ae244f89e01f0c5fa.chunk.js.map +0 -1
  22. package/build/605.2ea491387427c666537a.chunk.js +0 -707
  23. package/build/605.2ea491387427c666537a.chunk.js.map +0 -1
  24. package/build/assets/404.6ddcf23842aa398fdb2521ed61e26426.png +0 -0
  25. package/build/assets/ai.0bd1828cb6ec10ad92d900c710079cac.png +0 -0
  26. package/build/assets/check.e04c3374d2c43bd03d5c52b37639d90c.svg +0 -4
  27. package/build/assets/default.2ca3180f8cdd6f14c4184439f06173cb.png +0 -0
  28. package/build/assets/docx.d99aeeb833c328dc360bb2dc1d99126f.png +0 -0
  29. package/build/assets/gif.605d1d151a01356b376d5c4ac2f40d19.png +0 -0
  30. package/build/assets/group-background.daf782321c7f65cde0fc3d5918d27762.png +0 -0
  31. package/build/assets/jamespot-2025-216.d681af07a093035b056f3a3589dfb6f8.png +0 -0
  32. package/build/assets/jamespot-blue-2025-216.cbe9350502876bd1e0495637f73b0ce6.png +0 -0
  33. package/build/assets/mp3.c4f6cf8e048c8d1fd70ea5676f9e35bb.png +0 -0
  34. package/build/assets/mp4.c631e40ab77a5009bec629505396f88b.png +0 -0
  35. package/build/assets/pdf.25c19fbb11dacc87994bdce830d7e5ed.png +0 -0
  36. package/build/assets/pptx.fc266e95afba9abd862da4d909e1ad68.png +0 -0
  37. package/build/assets/psd.cca4c1ac52e6e24770486bf5bc6d6ff9.png +0 -0
  38. package/build/assets/svg.21a77099744d94b9214c52043ef39d95.png +0 -0
  39. package/build/assets/ttf.28668a6c059779e01fe7dc66dd70ef40.png +0 -0
  40. package/build/assets/txt.d0b32e515641b99e8e31165279361eb4.png +0 -0
  41. package/build/assets/x.609ccec1e6c6c10c412a1ab325258b42.svg +0 -1
  42. package/build/assets/xlsx.a3b00a8cd84f504b94d1cfc617b4080f.png +0 -0
  43. package/build/assets/zip.b8f8ab347fc92f763a2d44617a82b66e.png +0 -0
  44. package/build/jest.config.d.ts +0 -3
  45. package/build/jest.setup.d.ts +0 -1
  46. package/jest.config.ts +0 -17
  47. package/jest.setup.ts +0 -1
  48. package/script/checkDependencies.js +0 -48
  49. package/script/traduction-react.php +0 -95
  50. package/styled-components.d.ts +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"605.e14ede6ac53f82a861c7.chunk.js","mappings":"ktBAOA,MAAMA,EAAU,IAAyBC,iBAAiB,QACpDC,EAAY,IAAyBD,iBAAiB,aAItDE,EAAK,UAAOC,IAAI;MAChB,EAAAC;EAGOC,EAAUC,IACnB,MAAMC,GAAQ,IAAAC,YACRC,GAAO,EAAAC,EAAA,KACPC,GAAgB,QAAe,EAAAC,QAAQC,UAAUC,qBAEvD,OAAIR,EAAMS,MAAQJ,GAAeI,KAEzB,iCACI,SAAChB,EAAO,CACJiB,KAAM,eACNC,KAhBE,GAgBKX,EAAMW,MAAQ,GACrBC,MAAOX,EAAMW,MAAMC,QACnBC,QAAS,YAEb,SAAClB,EAAE,UAAEO,EAAKY,cAAc,CAAEC,GAAI,yBAKnC,SAACrB,EAAS,IAAKK,KC3BpBiB,EAAa,IAAyBvB,iBAAiB,WACvDwB,EAAkB,IAAyBxB,iBAAiB,gBAC5DyB,EAAiB,IAAyBzB,iBAAiB,eAC3D0B,EAAgB,IAAyB1B,iBAAiB,cAC1D2B,EAAa,IAAyB3B,iBAAiB,WACvD4B,EAAgB,IAAyB5B,iBAAiB,cAS1D6B,EAAkB,UAAOC,GAAG;;;;;EAOrBC,EAAa,UAAOC,CAAwB;;;;;;;;;aAS3C1B,GAAUA,EAAMC,MAAMW,MAAMe;wBACjB3B,GAAUA,EAAMC,MAAMW,MAAMgB;wBAC5B5B,GAAUA,EAAMC,MAAMW,MAAMe;mBACjC3B,GAAWA,EAAM6B,QAAU,QAAU;;EAI5CC,EAAW,EAA4BC,WAAUC,QAzBhD,MA0BV,MAAM7B,GAAO,EAAAC,EAAA,KACPH,GAAQ,IAAAC,aACP+B,EAAaC,IAAgB,IAAAC,WAAS,GAE7C,OACI,iCACI,UAAClB,EAAU,WACN,IAAIc,GAAUK,OAAO,EAAGJ,GAAOK,IAAI,CAACC,EAAMC,KACvC,SAACd,EAAU,CAACI,QAAmB,IAAVU,EAAaC,KAAMF,EAAKG,KAAMC,OAAQ,SAAQ,UAC/D,SAACrB,EAAU,CAACsB,iBAA4BC,IAAfN,EAAKO,MAAsB,IAAMP,EAAKO,MAAOC,SAAS,OAAM,UACjF,SAAC/C,EAAM,CACHU,IAAK6B,EAAK7B,IACVE,KAAM,EACNG,QAAQ,SACRiC,IAAI,QACJC,UAAWV,EAAKW,aAAe,EAAAC,MAAMC,KAAKC,eAAed,EAAKW,mBAAgBL,EAC9ES,WAAS,OARqDf,EAAKtB,KAalFe,EAASuB,OAAStB,IACf,UAACP,EAAU,CAAC8B,QAAS,IAAMrB,GAAa,GAAOL,SAAS,EAAI,cACtDE,EAASuB,OAAStB,QAI/BD,EAASuB,OAAStB,IACf,SAACb,EAAc,CACXqC,aAAc,IAAMtB,GAAa,GACjCuB,2BAAyB,EACzBC,KAAMzB,EACNnB,QAAS,eACT6C,UAAW,QAAO,UAClB,SAACzC,EAAe,CACZ2B,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,oBAChC4C,SAAU,SACVC,iBAAkB,IAAM3B,GAAa,GAAM,UAC3C,SAACX,EAAe,UACXQ,EAASM,IAAI,CAACC,EAAMwB,KACjB,UAAC7C,EAAU,CAAuB8C,EAAG,SAAUC,IAAK/D,EAAMgE,MAAMC,EAAC,WAC7D,SAACnE,EAAM,CAACY,KAAM,EAAGF,IAAK,GAAG6B,EAAK6B,QAAQ7B,EAAKtB,QAC3C,SAACI,EAAa,CAACoB,KAAM,GAAGF,EAAK6B,QAAQ7B,EAAKtB,KAAI,UAC1C,SAACM,EAAa,UAAEgB,EAAKO,YAHZ,YAAYiB,gB,cC/E7D,MAAMM,EAAY,IAAyB1E,iBAAiB,UACtD,EAAkB,IAAyBA,iBAAiB,gBAC5D,EAAiB,IAAyBA,iBAAiB,eAC3D,EAAgB,IAAyBA,iBAAiB,cAE1D2E,EAAc,UAAO7C,GAAG;eACdxB,GAAUA,EAAMC,MAAMgE,MAAMK;EAatCC,EAAgC,CAClCC,cAAU5B,EACV6B,SAAS,EACTC,WAAO9B,GAGE+B,EAAU,EAAGC,YACtB,MAAMzE,GAAO,EAAAC,EAAA,MACNoE,EAAUK,IAAe,IAAA1C,UAAuBoC,GACjDtE,GAAQ,IAAAC,YAER4E,GAAgB,IAAAC,aACjBH,IACGC,EAAYN,GACZ,UAASS,IACJC,gBAAgB,CAAEC,KAAMN,EAAMM,KAAMC,SAAUP,EAAMQ,aACpDC,KAAMb,IACH,GAAIA,EAASE,MAQT,YAPAG,EAAY,CACRH,MAAO,GAAGvE,EAAKY,cAAc,CAAEC,GAAI,wBAC/BwD,EAASc,UAAY,KAAOd,EAASc,WAEzCb,SAAS,EACTD,cAAU5B,IAIlB,MAAM2C,EAAef,EAASgB,OAAON,KACrCL,EAAY,CACRH,WAAO9B,EACP6B,SAAS,EACTD,SAAUe,MAGjBE,MAAOC,IACJb,EAAY,CACRH,MAAOvE,EAAKY,cAAc,CAAEC,GAAI,sBAChCyD,SAAS,EACTD,cAAU5B,OAI1B,CAACzC,IASL,OANA,IAAAwF,WAAU,KACFf,GAASA,EAAMM,KAAKU,OAAOtC,OAAS,GACpCwB,EAAcF,IAEnB,CAACA,EAAOE,KAGP,SAAC,EAAc,CACXe,OAAQ5F,EAAM4F,OAAOC,aACrBpC,OAAQkB,EACRpB,aAAc,KACVoB,GAAOmB,UACV,UACD,SAAC,EAAe,CACZnC,SAAS,SACToC,QAAS,CACL,CACIC,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,qBACnCkF,aAAc,KACVtB,GAASE,EAAcF,KAG/B,CACIqB,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,sBACnCkF,aAAc,IAAM1B,EAASA,UAAYI,GAAOuB,QAAQ3B,EAASA,WAErE,CACIyB,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,kBACnCkF,aAAc,IAAMtB,GAAOmB,WAGnCK,QAAM,YACN,UAAC/B,EAAW,WACPG,EAASC,UACN,iCACI,SAACL,EAAS,KACV,SAAC,EAAa,CAACiC,MAAM,SAAQ,SACxBlG,EAAKY,cAAc,CAAEC,GAAI,6BAIpCwD,EAASC,SAAWD,EAASE,QAAS,uBAAIF,EAASE,SACnDF,EAASC,SAAWD,EAASA,WAAY,uBAAIA,EAASA,mB,gCC/F5E,MAAM8B,EAAmB,EAAAC,GAAG;;;;;EAOtBC,EAAY,UAAOhF,GAA0B;MAC7C,EAAGiF,aAAcA,GAAWH;EAG5BI,EAAO,UAAOC,IAA2B;MACzC,EAAGF,aAAcA,GAAWH;EA0B5BM,GAAU,IAAAC,YAvBI,CAChB7G,EAMA8G,IAEO9G,EAAM+G,UACT,SAACL,EAAI,CACDD,QAASzG,EAAMyG,QACfM,SAAU/G,EAAM+G,SAChBD,IAAKA,EAA2B,UACvB9G,EAAMgH,OAAM,SACpBhH,EAAMiG,YAGX,SAACO,EAAS,CAACC,QAASzG,EAAMyG,QAASK,IAAKA,EAA0B,UAAW9G,EAAMgH,OAAM,SACpFhH,EAAMiG,YAMbgB,EAAkB,UAAOzF,GAA0B;MAClDxB,GACCA,EAAMyG,SACN;EA4HKS,GAAc,IAAAL,YA5FN,EACfM,YAAWnH,GACb8G,KAEA,MAAMM,GAAU,IAAAC,QAAyC,OAElDC,EAAeC,IAAiB,EAAAC,EAAA,IAAexH,EAAMyH,OAAQzH,EAAMmE,KAAMnE,EAAM0H,iBAC/EC,EAAQC,IAAa,IAAAzF,WAAS,IAE/B,aAAE0F,EAAY,QAAEC,EAAO,MAAEC,KAAUC,IAAW,IAAAC,SAAQ,CACxDV,cAAe,IACRA,KACAvH,EAAMuH,eAEbW,aAAc,SAGlB,IAAAvC,WAAU,KACFwB,IAAWQ,IACXR,EAAOa,GACPJ,GAAU,KAEf,CAACT,EAAQa,EAAQL,IAEpB,MAAMQ,GAAwB,IAAApD,aACzBqD,IACG,MAAMC,EAAa,CAAC,EAkBpB,OAjBAC,OAAOC,KAAKH,GAAQI,QAASC,IACzB,MAAMC,EAASpB,EAAcqB,KAAMC,GAAMA,EAAElI,OAAS+H,IAAIC,OACxD,OAAQA,GAAQvE,MACZ,IAAK,WACDkE,EAAMI,GAAKL,EAAOK,GAAGpG,IAAKwG,GAA4BA,EAAEpI,KAAKqI,KAAK,KAClE,MACJ,IAAK,WACDT,EAAMI,GAAKL,EAAOK,GAAGpG,IAAKwG,GAAWA,EAAEhG,OAAOiG,KAAK,KACnD,MACJ,IAAK,SACDT,EAAMI,GAAKL,EAAOK,GAAK,IAAM,IAC7B,MACJ,QACIJ,EAAMI,GAAKL,EAAOK,MAIvBJ,GAEX,CAACf,IAuBL,OApBA,IAAAyB,qBACIjC,EACA,KAAM,IACCkB,EACHH,eACAC,UACAC,MAAO,KAEHX,GAAS4B,SAASC,SAAS,EAAG,GAE9BlB,KAEJmB,mBAAoB,IACTf,EAAsBH,EAAOmB,eAI5C,KAIA,UAACvC,EAAO,CACJI,OAAQhH,EAAMgH,OACdP,QAASzG,EAAMyG,QACfM,SAAU/G,EAAM+G,SAAWc,EAAa7H,EAAM+G,eAAYnE,EAC1DkE,IAAKM,EAAO,WACZ,UAACH,EAAe,CAACR,QAASzG,EAAMyG,QAAO,UAClCa,EAAcjF,IAAI,EAAG+G,WAAUC,MAC5B,SAACD,EAAK,CAEFtB,QAASA,KACLuB,EACJrC,OAAQ,GAAGhH,EAAMgH,UAAUqC,EAAK3I,OAChC4I,SAAUtJ,EAAMsJ,UAJXD,EAAK3I,OAOjBV,EAAMuJ,aAAevJ,EAAMuJ,YAAYzB,MAE3C9H,EAAMgG,a,cCzKnB,MAAMwD,EAAY,IAAyB9J,iBAAiB,aACtD+J,EAAS,IAAyB/J,iBAAiB,UACnDgK,EAAO,IAAyBhK,iBAAiB,QACjDiK,EAAa,IAAyBjK,iBAAiB,cACvDkK,EAAW,IAAyBlK,iBAAiB,uBACrDmK,EAAa,IAAyBnK,iBAAiB,cAEvD,EAAY,UAAO8B,GAAG;;;WAGjB,EAAGvB,WAAYA,EAAMgE,MAAMK;EAGhCwF,EAAiB,UAAOtI,GAAG;;WAEtB,EAAGvB,WAAYA,EAAMgE,MAAMK;;wBAEd,EAAGrE,WAAYA,EAAMW,MAAMmJ;wBAC3B,EAAG9J,WAAYA,EAAMW,MAAMoJ;qBAC9B,EAAG/J,WAAYA,EAAMU,KAAKsJ;eAChC,EAAGhK,WAAYA,EAAMgE,MAAMK;EAGpC4F,EAAiB,UAAO1I,GAAG;;;WAGtB,EAAGvB,WAAYA,EAAMgE,MAAMgG;EAUzBE,EAAiB,EAAGC,UAASC,YAAWC,aAAYC,iBAC7D,MAAMpK,GAAO,EAAAC,EAAA,KACPgH,GAAU,IAAAC,QAAuB,MACjCmD,GAAW,WACV9G,EAAM+G,IAAW,IAAAtI,WAAS,IAC1BuI,EAASC,IAAc,IAAAxI,aACvByI,EAASC,IAAc,IAAA1I,aACvB2I,EAAgBC,IAAqB,IAAA5I,WAAS,IAC9C6I,EAAeC,IAAoB,IAAA9I,WAAS,GAC7C+I,GAAkB,WAExB,IAAAvF,WAAU,KACNwF,QAAQC,IAAI,CACR,WACI,MAAMC,QAAY,UAAKX,QAAQY,IAC3B,CAAEC,UAAWlB,GACb,CAAEmB,OAAQN,EAAgBM,OAAQC,OAAQ,aAE9Cd,EAAWU,EAAI7F,OAClB,EAND,GAOA,WACI,GAAI+E,EAAY,CACZ,MAAMc,QAAY,UAAKX,QAAQgB,YAC3B,CAAEH,UAAWlB,GACb,CACIoB,OAAQ,WACRD,OAAQN,EAAgBM,SAGhCX,EAAWQ,EAAI7F,OAAOmD,KAAMC,GAAMA,EAAEnI,MAAQ8J,GAChD,CACH,EAXD,KAYDlF,KAAK,KACJ0F,GAAkB,MAEvB,CAACG,EAAiBb,EAAWE,IAEhC,MAAMoB,GAAa,IAAA5G,aAAY,KAC3B0F,GAAQ,GACRL,KACD,CAACA,IAEEwB,GAAS,IAAA7G,aACVpC,IACQA,GAAaiD,QAKdqF,GAAiB,GACjB,UAAKY,cACAC,aAAa,CACVrL,IAAK8J,GAAcD,EACnB3H,YAAaA,IAEhB0C,KAAK,KACFmF,EAAS,EAAAuB,MAAMC,QAAQC,QAAQ,CAAEC,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,wBACjE2K,MAEHlG,MAAO0G,IACJ,EAAAJ,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAY,iBAC3C2F,GAAiB,MAhBzBT,EACI,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,yCAmBlE,CAACsJ,EAAYqB,EAAYpB,EAAYC,EAAUrK,IAG7CiM,GAAa,IAAArH,aACf,EAAGpC,kBACCiJ,EAAOjJ,IAEX,CAACiJ,IAGL,OACI,SAACpC,EAAS,CACN3G,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,oBAChC0C,KAAMA,EACNF,aAAcmI,EACd5E,SAAUsF,SAAYT,EAAOxE,EAAQ4B,SAASG,YAAYxG,aAC1Dc,2BAAyB,EACzBE,UAAW,QACXqC,QAAS,CACL,CACIC,UAAU,SAAC,IAAgB,CAACjF,GAAG,kBAC/BJ,MAAO,SACPsF,aAAcyF,GAElB,CACI1F,UAAU,SAAC,IAAgB,CAACjF,GAAG,gBAC/BkF,aAAc,IAAM0F,EAAOxE,EAAQ4B,SAASG,YAAYxG,aACxD/B,MAAO,QACP6D,QAASuG,IAEhB,SACAF,GACG,SAACrB,EAAM,CAAC9I,KAAM,OAEd,UAAC,EAAS,YACN,UAACmJ,EAAc,YACX,SAACJ,EAAI,CAAChJ,KAAM6J,EAAa,eAAiB,YAAa5J,KAAM,GAAIG,QAAS,YAC1E,UAACoJ,EAAc,YACX,SAACP,EAAU,CAAC7I,QAASyJ,EAAa,KAAO,KAAI,UACzC,SAACX,EAAQ,CAACsC,MAAOxB,GAAS7H,MAAOS,OAAQ,OAE5CsH,IACG,UAACjB,EAAU,WACNxJ,EAAKY,cAAc,CAAEC,GAAI,oBAAsB,KAChD,SAAC6I,EAAU,CAACrH,KAAMoI,GAAS0B,MAAM7J,KAAI,SAAGmI,GAAS0B,MAAMzJ,kBAKvE,SAACqE,EAAW,CAACJ,IAAKM,EAASK,OAAQ,CAAC,eAAgBtD,KAAK,gBAAgB4C,SAAUqF,U,oCC5JvG,MCFaG,GAAyB,UAAO/K,GAAG;;;;;;EAQnCgL,GAAkB,UAAOhL,GAA2B;wBACxCxB,GAAUA,EAAMC,MAAMW,MAAMmJ;;;;;eAKrC/J,GAAWA,EAAMyM,UAAY,IAAM;sBAC5BzM,GAAWA,EAAMyM,UAAY,MAAQ;;;;;;;;;;;;;;;;;;EAoB/CC,GAAkB,UAAOlL,GAAsC;wBACnDxB,GAAUA,EAAMC,MAAMW,MAAMC;cACtCb,GAAWA,EAAM0D,KAAO1D,EAAM2M,OAAS;;;;;;;;EAUzCC,GAAuB,UAAOpL,GAAyB;;;;;;MAM7DxB,GAAUA,EAAM6M,QAAU;EAGpBC,GAAe,UAAOtL,GAAG;;;;;;aAMxBxB,GAAUA,EAAMC,MAAMW,MAAMC;;4BAEbb,GAAUA,EAAMC,MAAMW,MAAMoJ;;EAI5C+C,GAAgB,UAAOC,MAAkF;;;eAGtGhN,GAAWA,EAAMiN,eAAiB,YAAc;;;wBAGvCjN,GAAUA,EAAMC,MAAMW,MAAMsM;;oCAEhBlN,GAAwB,GAAdA,EAAMuC;eACrCvC,GAAWA,EAAM0D,KAAO,EAAI;;;;MAIrC1D,GAAUA,EAAMmN,MAAQ;MACxBnN,GAAUA,EAAMiN,gBAAkB;MAClCjN,IAAWA,EAAMiN,gBAAkB;;4BAEbjN,GAAUA,EAAMC,MAAMW,MAAMoJ;;;OAGnD,IAAAoD;EAGOC,GAAO,UAAO7L,GAAkD;;sBAEtDxB,GAA+B,QAApBA,EAAMsN,UAAsB,MAAQ;mBAClDtN,GAA+B,QAApBA,EAAMsN,UAAsB,SAAW;uBAC9CtN,GAA+B,QAApBA,EAAMsN,UAAsB,aAAe;;MAEvEtN,GAAUA,EAAMgE,KAAO,OAAOhE,EAAMgE;ECnFrCuJ,GAAY,IAAyB7N,iBAAiB,UACtD,GAAiB,IAAyBA,iBAAiB,eAC3D,GAAkB,IAAyBA,iBAAiB,gBAC5D,GAAa,IAAyBA,iBAAiB,WACvD8N,GAAgB,IAAyB9N,iBAAiB,cAOnD+N,GAAa,EACtBC,OACAC,OACA1H,WACA2H,YAAY,UACZC,eAQA,MAAOC,EAAQrD,IAAW,IAAAtI,WAAkB,GACtC4L,ECvCH,SAA2BH,GAC9B,OAAQA,GACJ,IAAK,uBACD,MAAO,CAAC,EAAAI,OAAOC,WAAW,EAAAC,YAAYC,cAAe,EAAAH,OAAOC,WAAW,EAAAC,YAAYE,gBACvF,IAAK,UACD,MAAO,CACH,EAAAJ,OAAOC,WAAW,EAAAC,YAAYG,WAC9B,EAAAL,OAAOC,WAAW,EAAAC,YAAYI,UAC9B,EAAAN,OAAOC,WAAW,EAAAC,YAAYK,cAEtC,QACI,MAAO,CACH,EAAAP,OAAOC,WAAW,EAAAC,YAAYC,cAC9B,EAAAH,OAAOC,WAAW,EAAAC,YAAYM,aAC9B,EAAAR,OAAOC,WAAW,EAAAC,YAAYO,cAC9B,EAAAT,OAAOC,WAAW,EAAAC,YAAYE,eAC9B,EAAAJ,OAAOC,WAAW,EAAAC,YAAYQ,eAC9B,EAAAV,OAAOC,WAAW,EAAAC,YAAYS,mBAC9B,EAAAX,OAAOC,WAAW,EAAAC,YAAYI,WAG9C,CDkBoBM,CAAkBhB,GAC5BzN,GAAO,EAAAC,EAAA,KAEPyO,EAA4B,CAC9BnL,KAAMoK,EACNgB,SAAU,cACVhO,QAAS,cACT0C,aAAc,IAAMiH,GAAQ,IAG1BlH,EAAW7C,IACbmN,EAAS,EAAAG,OAAOe,QAAQrO,IACxB+J,GAAQ,IAEZ,OACI,iCACI,SAAC,GAAc,IAAKoE,EAAI,UACpB,SAAC,GAAe,CACZhL,iBAAkBgL,EAAKrL,aACvBwC,QACa,YAAT0H,EACM,CACI,CACIzH,UAAU,SAAC,IAAgB,CAACjF,GAAG,iBAC/BJ,MAAO,SACPsF,aAAc,IAAMuE,GAAQ,UAGpC7H,EAEVC,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,mBAAmB,SACzC,YAAT0M,GACG,SAACd,GAAoB,CAACC,QAAM,WACvBkB,EAAQ1L,IAAI,CAACqG,EAAQnG,KAClB,SAACwK,GAAa,CAEVrJ,MAAM,EACNyJ,MAAI,EACJF,gBAAc,EACd1K,MAAOA,EACPgB,QAAS,IAAMA,EAAQmF,EAAOhI,MAAK,UACnC,UAAC2M,GAAI,CAACC,UAAW,MAAOtJ,IAAK,GAAE,WAC3B,gBAAKgL,IAAKtG,EAAOuG,OACjB,UAAC5B,GAAI,CAACC,UAAW,SAAQ,WACrB,wBAAKnN,EAAKY,cAAc,CAAEC,GAAI0H,EAAOwD,WACrC,uBAAI/L,EAAKY,cAAc,CAAEC,GAAI0H,EAAO/F,uBAVvC+F,EAAOhI,UAiBxB,SAAC6L,GAAsB,UAClBwB,EAAQ1L,IAAI,CAACqG,EAAQnG,KAEd,UAACiK,GAAe,CAEZjJ,QAAS,IAAMA,EAAQmF,EAAOhI,MAC9B+L,UAAW/D,EAAO+D,UAAS,WAC3B,gBAAKuC,IAAKtG,EAAOuG,OACjB,gBAAKC,UAAU,gBAAe,SAAE/O,EAAKY,cAAc,CAAEC,GAAI0H,EAAOwD,YAJ3D3J,UAYvB,WAATmL,GAAqBzH,GAAW,gBAAK1C,QAAS,IAAMkH,GAAQ,GAAK,SAAGxE,KAAkB,wBAC7E,WAATyH,GAA8B,SAATC,GAClB,SAACJ,GAAS,CAAChK,QAAS,IAAMkH,GAAQ,GAAO3J,QAAS,WAAYqO,SAAU,OAAM,SACzEhP,EAAKY,cAAc,CAAEC,GAAI,yBAG9B,wBAEM,YAAT0M,GAA+B,SAATC,GACnB,SAACpB,GAAsB,UAClBwB,EAAQ1L,IAAI,CAACqG,EAAQnG,KAEd,UAACiK,GAAe,CAEZjJ,QAAS,IAAMA,EAAQmF,EAAOhI,MAC9B+L,UAAW/D,EAAO+D,UAAS,WAC3B,gBAAKuC,IAAKtG,EAAOuG,OACjB,gBAAKC,UAAU,gBAAe,SAAE/O,EAAKY,cAAc,CAAEC,GAAI0H,EAAOwD,YAJ3D3J,OAUrB,wBAEM,YAATmL,GAA+B,SAATC,GAAkB,SAACyB,GAAiB,CAACrB,QAASA,EAASxK,QAASA,KAAc,wBAC3F,YAATmK,GAA+B,SAATC,GACnB,SAAC0B,GAAiB,CACd9L,QAAS,KACLkH,GAAQ,OAIhB,4BAUV2E,GAAoB,EACtBrB,UACAxK,cAKA,MAAOG,EAAMoK,IAAU,IAAA3L,WAAS,GAC1BhC,GAAO,EAAAC,EAAA,KAEPkP,GAAa,IAAAC,SAAQ,IAbhB,GAcAC,KAAKC,KAAK1B,EAAQzK,OAAS,GAfpB,GAEA,GAcf,CAACyK,IAEJ,OACI,+BACI,UAACrB,GAAe,CAAChJ,KAAMA,EAAMiJ,OAAQ2C,EAAU,WAC3C,SAACxC,GAAY,CAACvJ,QAAS,IAAMuK,GAAQpK,GAAK,SACrCvD,EAAKY,cAAc,CAAEC,GAAI,yBAE9B,SAAC4L,GAAoB,UAChBmB,EAAQ1L,IAAI,CAACqG,EAAQnG,KAEd,UAACwK,GAAa,CAEVrJ,KAAMA,EACNnB,MAAOA,EACPgB,QAAS,IAAMA,EAAQmF,EAAOhI,MAAK,WACnC,gBAAKsO,IAAKtG,EAAOuG,MAChB9O,EAAKY,cAAc,CAAEC,GAAI0H,EAAOwD,UAL5BxD,EAAOhI,eAetC2O,GAAoB,EAAG9L,cACzB,MAAMpD,GAAO,EAAAC,EAAA,KACb,OACI,+BACI,SAAC,GAAU,CAACuC,YAAaxC,EAAKY,cAAc,CAAEC,GAAI,uBAAuB,UACrE,SAACwM,GAAa,CACVkC,GAAI,QACJC,QAAS,QACT/O,MAAO,QACPgP,SAAU,GACVrM,QAAS,KACLA,KAEJsM,KAAM,wBEzMbC,GAAmB,KAO5B,MAAM3P,GAAO,EAAAC,EAAA,MACNsD,EAAM+G,IAAW,IAAAtI,WAAS,IAC1B4N,EAAQC,IAAa,IAAA7N,YAS5B,MAAO,CACHuB,OACAuM,SAAWpH,IACPkH,GAAQG,YAAY,cAAc,EAAOrH,IAE7CsH,MAAO,IAAM1F,GAAQ,GACrB2F,KAdQ,IAAAb,SACR,IACI,EAAAc,2BAA2BC,SAAUC,IACjCP,EAAUO,GACV9F,GAAQ,IACTtK,GACP,CAACA,IASDqQ,UAAU,I,qCCrBlB,MAAMC,GAAe,IAAyB/Q,iBAAiB,aAElDgR,GAAkB,EAAGC,aAC9B,MAAMxQ,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXoG,GAAqB,QACtBC,GAAU,EAAA7C,OAAOzN,UAAUuQ,aAAaD,EAAOF,IAAS9N,MACzD,GAAAkO,eAGE,QAAEjJ,EAAO,MAAEkJ,IAAU,IAAA/I,SAAQ,CAC/BV,cAAe,CAAE0J,YAAaL,GAC9B1I,aAAc,QAUlB,OAPA,IAAAvC,WAAU,KACN,MAAMuL,EAAeF,EAAOG,IACxB3G,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqF,oBAAoB,CAAEV,SAAQ9N,MAAOsO,EAAKF,iBAE5E,MAAO,IAAMC,EAAaI,eAC3B,CAACN,EAAOxG,EAAUmG,KAGjB,SAACF,GAAY,CACT/P,KAAM,cACNoH,QAASA,EACTyJ,YAAapR,EAAKY,cAAc,CAAEC,GAAI,iBACtCwQ,MAAM,OACNC,OAAO,OC3Bb,GAAY,IAAyB/R,iBAAiB,UACtD,GAAiB,IAAyBA,iBAAiB,eAC3D,GAAkB,IAAyBA,iBAAiB,gBAC5D,GAAgB,IAAyBA,iBAAiB,cAEnDgS,GAAiB,UAAOlQ,GAAG;eACxBxB,GAAUA,EAAMC,MAAMgE,MAAMK;;;EAK/BqN,GAAsB,UAAOnQ,GAAG;;;;WAIjCxB,GAAUA,EAAMC,MAAMgE,MAAMgG;eACxBjK,GAAUA,EAAMC,MAAMgE,MAAMgG;+BACZjK,GAAUA,EAAMC,MAAMW,MAAMsM;EAG/C0E,GAA2B,UAAOpQ,GAAG;;;;;;EAQrCqQ,GAA6B,UAAOrQ,GAAG;;WAExCxB,GAAUA,EAAMC,MAAMgE,MAAMgG;EAG3B6H,GAAmB,EAC5BnB,SACAjQ,OACAqR,uBAMA,MAAMvH,GAAW,UACXrK,GAAO,EAAAC,EAAA,MACN0N,EAAQkE,IAAa,IAAA7P,WAAkB,GAExC8P,GAAgB,IAAAlN,aAAY,KAC9ByF,EACI,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CACtCxB,SACAjQ,OACAgN,KAAM,WAGf,CAACiD,EAAQnG,EAAU9J,IAEhB0R,GAAqB,IAAArN,aAAY,KACnCyF,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqG,YAAY,CAAE1B,aAC7C,CAACA,EAAQnG,IAEZ,OACI,iCACI,UAACmH,GAAmB,YAChB,SAACC,GAAwB,WACrB,SAAClB,GAAe,CAACC,OAAQA,OAE7B,UAACkB,GAA0B,YACvB,SAAC,GAAa,CACVhC,KAAK,cACLH,GAAI,QACJC,QAAS,QACT/O,MAAO,QACPgP,SAAU,GACVrM,QAASwO,GAAoBE,EAC7BpP,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,oCAEpC,SAAC,GAAa,CACV6O,KAAK,aACLH,GAAI,QACJC,QAAS,QACT/O,MAAO,QACPgP,SAAU,GACVrM,QAAS,IAAMyO,GAAU,GACzBnP,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,4CAI3C8M,IACG,UAAC,GAAc,CAACrK,2BAA2B,EAAMC,KAAMoK,EAAQtK,aAAc,IAAMwO,GAAU,GAAM,WAC/F,SAAC,GAAe,CACZpO,SAAU,SACVf,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,yBAChC6C,iBAAkB,IAAMmO,GAAU,GAAM,SACvC7R,EAAKY,cAAc,CAAEC,GAAI,yCAE9B,SAAC0Q,GAAc,WACX,SAAC,GAAS,CAACxF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mBAAqBuC,QAAS6O,aClG3FE,GAAU,IAAyB5S,iBAAiB,QAE7C6S,GAAiB,UAAO/Q,GAAG;eACxBxB,GAAUA,EAAMC,MAAMgE,MAAMK;+BACZtE,GAAUA,EAAMC,MAAMW,MAAMsM;EAG/CsF,GAAc,EAAG7B,aAC1B,MAAM8B,GAAgB,QAAgB5B,GAAU,EAAA7C,OAAOzN,UAAUuQ,aAAaD,EAAOF,GAAS,GAAAI,cACxF9Q,GAAQ,IAAAC,YACRwS,GAAS,QAAgB7B,GAAU,EAAA7C,OAAOzN,UAAUoS,uBAAuB9B,EAAOF,GAAS,GAAAI,cAE3F6B,GAAgB,IAAArD,SAAQ,KACnB,CACH3O,MAAO8R,GAAUA,EAAc,MAAIG,OAAOH,EAAc,OAAKzS,EAAMW,MAAMkS,MACzEC,gBACIL,GAAUA,EAAO,oBAAsBG,OAAOH,EAAO,qBAAuBzS,EAAMW,MAAMe,MAC5FqR,SAAUN,GAAUA,EAAO,aAAe,GAAGA,EAAO,iBAAmB,OACvEO,WAAYP,GAAUA,EAAO,eAAiBG,OAAOH,EAAO,gBAAkB,SAC9EQ,UAAWR,GAAUA,EAAO,cAAgBG,OAAOH,EAAO,eAAiB,SAEhF,CAACA,EAAQzS,IAEN4C,GAAQ,IAAA0M,SAAQ,IACXkD,GAAgD,iBAAxBA,EAAc5P,OAAqD,IAA/B4P,EAAc5P,MAAMS,OACjFmP,EAAc5P,WACdD,EACP,CAAC6P,IAEJ,OAAK5P,GAGD,SAAC0P,GAAc,CACXY,MAAO,CACHvS,MAAOgS,EAAchS,MACrBmS,gBAAiBH,EAAcG,gBAC/BC,SAAUJ,EAAcI,SACxBC,WAAYL,EAAcK,WAC1BC,UAAWN,EAAcM,WAC5B,UACD,SAACZ,GAAO,CAACc,GAAG,OAAOC,OAAQxQ,OAXhB,yBC7BjByQ,GAA0B,IAAyB5T,iBAAiB,wBAE7D6T,GAAY,UAAO/R,GAAG;;;;EAiBtBgS,GAAiB,EAC1BvN,WACAwN,eACAC,eACAC,WACAC,SACAC,gBACAC,cACAC,sBAEA,MAAMC,GAAY,IAAA3M,QAAyB,MACrC4M,GAAQ,QAAe,EAAAjG,OAAOzN,UAAU2T,cACvCC,EAAOC,IAAY,IAAAjS,UAAiB,IACpCkS,EAAOC,IAAY,IAAAnS,UAAwBsR,GA2BlD,OAzBA,IAAA9N,WAAU,KACF+N,GACAM,EAAUhL,SAASuL,SAExB,CAACb,KAEJ,IAAA/N,WAAU,KACF8N,EAAanQ,SAAW+Q,EAAM/Q,QAC9BgR,EAASb,IAGd,CAACA,KAEJ,IAAA9N,WAAU,KACNoO,EAAgBM,IAEjB,CAACA,KAEJ,IAAA1O,WAAU,KACQ,IAAVwO,GACAL,KAGL,CAACK,KAGA,iCACI,gBACI5Q,QAAS,KACDmQ,GACAM,EAAUhL,SAASuL,SAE1B,SACAtO,KAEL,SAACsN,GAAS,WACN,SAACD,GAAuB,CACpBxM,IAAKkN,EACLhT,GAAG,qBACHN,KAAK,cACL8T,QAAS,GACTZ,OAAQA,EACRD,SAAUA,EACVM,MAAOA,EACPJ,cAAgBY,SACM7R,IAAd6R,GACAL,EAAUM,GAAcA,EAAYD,GAEX,mBAAlBZ,GAA8C,IAAdY,GACvCZ,KAGRE,gBAAkBY,SACO/R,IAAjB+R,IAGJP,EAAUM,QAA6B9R,IAAd8R,EAA0BA,EAAY,EAAI,GACnEJ,EAAUM,GAAejB,EAAW,IAAIiB,EAAWD,GAAgB,CAACA,cCjFtFE,GAAmB,IAAyBnV,iBAAiB,oBAC7DoV,GAAwB,IAAyBpV,iBAAiB,sBAClEqV,GAAa,IAAyBrV,iBAAiB,cAYhDsV,GAAa,UAAOxT,GAAG;;EAIvByT,GAAoC,EAC7CvM,SACAwM,UACAxH,WAMA,MAAMvN,GAAO,EAAAC,EAAA,MACP,OAAEuQ,GAAWjI,GACb,MAAE2L,GAAU3L,EAAO8L,QACnBhK,GAAW,UACXgG,GAAW,QAAgBK,GAAU,EAAA7C,OAAOzN,UAAUiQ,SAASK,EAAOF,GAAS,GAAAI,cAE/EoE,EAAWC,IACb5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,sBAG9E,IAAA2E,WAAU,KACN6E,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,MAEjE,KAEH,IAAA3P,WAAU,KACN6E,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAChC1E,SACA4E,OAAQlB,GAA0B,IAAjBA,EAAM/Q,WAIhC,CAAC+Q,IAEJ,MAAMmB,GAAQ,QAAgB3E,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,cAoB1E8E,EAAS,CACX,CACIzJ,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChCuC,QArBSqS,IACRA,GAGL,UAASC,OACJC,cAAc,eAAeF,EAAK5U,MAClCqE,KAAMb,IACH,GAAwB,KAApBA,EAASgB,OACT,MAAM,IAAIuQ,MAAM,gBAEpB,MAAMC,EAAOxR,EAASgB,OA3DP,EAACyQ,EAAgBD,KAC5CE,OAAOxS,KAIJ,SAA0BuS,EAAgBD,GAC7C,MAAO,eAAeC,KAAUD,GACpC,CANgBG,CAAiBF,EAAQD,QA2DzBI,KAAgBR,EAAK5U,GAAIgV,KAE5BvQ,MAAM,KACH+E,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,sBAAwB,WAWpEmK,EAAoDb,EACpD,CACI,CACIc,UAAYC,GACR,CACI,0EACA,oEACA,6EACFC,SAASD,EAAEE,UACjBC,QAASf,IAGjB,GAEN,YAAiB/S,IAAVyR,GACH,UAACW,GAAU,WACG,SAATtH,GACG,SAACmH,GAAgB,CAACR,MAAOA,EAAO9Q,QAAS,OAAiB4R,QAASA,KAEnE,SAACJ,GAAU,CAACV,MAAOA,EAAOgC,gBAAiBA,EAAe,SACpD3S,IAEM,SAACmR,GAAgB,CACbR,MAAOA,EAAMhS,IAAKkU,IAAM,IACjBA,EACH9V,KAAK,IAAAkW,iBAAgBJ,MAEzBhT,QAAU0S,GAAWvS,EAAKuS,GAC1Bd,QAASA,MAM5BD,GAAoB,SAATxH,IACR,SAAC8F,GAAc,CACXC,aAAcY,EACdX,aAAclD,EACdmD,UAAU,EACVC,OAAQ,IACRG,gBAAkBM,IACVuC,MAAMC,QAAQxC,IACd7J,GACI,IAAAsM,qBAAoDnG,EAAQ,CACxD0D,MAAOA,EAAMhS,IAAKkU,IAAM,IACjBA,EACH9V,KAAK,IAAAkW,iBAAgBJ,IAAM,UAM/C1C,cAAe,KACXrJ,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,MAEpEqP,YAAa,KACTtJ,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,MACnE,SACS,SAATiJ,GACG,SAACoH,GAAqB,CAClB5I,MAAO,wCACPvJ,YAAa,8CACboU,IAAK,uCACLxT,QAAS,UAGb,8BAMhB,yBCjKFyT,GAAkB,IAAyBtX,iBAAiB,gBAE5DuX,GAAmB,UAAOzV,GAAG;;;;;EAO7B0V,GAAa,UAAO1V,GAA2B;sBAC9BxB,GAAWA,EAAMmX,UAAY,MAAQ;;;;;;EAQ/CC,GAAgC,EACzC1O,SACAgF,WAMA,MAAMlD,GAAW,WACX,OAAEmG,GAAWjI,GACb,KAAExD,EAAI,IAAE6R,EAAG,OAAErU,EAAM,MAAE9B,EAAK,gBAAEmS,EAAe,WAAEsE,EAAU,aAAEC,EAAY,QAAExW,GAAY4H,EAAO8L,QAYhG,OAVA,IAAA7O,WAAU,KACN6E,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAChC1E,SACA4E,OAAQrQ,GAAwB,IAAhBA,EAAK5B,WAI9B,CAAC4B,KAGA,SAAC+R,GAAgB,CACb1T,QAAS,KACQ,SAATmK,GACAlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CAAExB,SAAQjQ,KAAMgI,EAAOhI,SAEjF,UACD,SAACwW,GAAU,CAACC,UAAoB,SAATzJ,EAAe,UAClC,SAACsJ,GAAe,CACZ9R,KAAMA,EACN6R,IAAKA,EACLrU,OAAQA,EACR9B,MAAOA,EACPmS,gBAAiBA,EACjBsE,WAAYA,EACZC,aAAcA,EACdxW,QAASA,SCtDvByW,GAA0B,IAAyB7X,iBAAiB,wBACpE,GAAwB,IAAyBA,iBAAiB,sBAClE,GAAa,IAAyBA,iBAAiB,cAEvD8X,GAAkB,UAAOxK,MAAM;;EAIxByK,GAAiC,EAC1C/O,SACAwM,UACAxH,WAMA,MAAM,OAAEiD,GAAWjI,GACb,MAAE2L,GAAU3L,EAAO8L,QACnBhK,GAAW,UACXgG,GAAW,QAAgBK,GAAU,EAAA7C,OAAOzN,UAAUiQ,SAASK,EAAOF,GAAS,GAAAI,cAOrF,OALA,IAAApL,WAAU,KACN6E,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,MAEjE,SAEc1S,IAAVyR,GACH,gCACc,SAAT3G,GACG,SAAC6J,GAAuB,CACpBlD,MAAOA,EACPqD,SAAU,IACV1T,IAAK0E,EAAO8L,QAAQxQ,KAAO,KAC3B6I,OAAQnE,EAAO8L,QAAQ3H,QAAU,IACjCtJ,QAAS,UAGb,SAAC,GAAU,CAAC8Q,MAAOA,EAAOgC,gBAAiB,GAAE,SACvC3S,IAEM,SAAC8T,GAAe,WACZ,SAACD,GAAuB,CACpBlD,MAAOA,EACPqD,SAAU,IACV1T,IAAK0E,EAAO8L,QAAQxQ,KAAO,KAC3B6I,OAAQnE,EAAO8L,QAAQ3H,QAAU,IACjCtJ,QAAU0S,GAAWvS,EAAKuS,SAOjDf,GAAoB,SAATxH,GACR,SAAC8F,GAAc,CACXC,aAAcY,EACdX,aAAclD,EACdoD,OAAQ,mCACRD,UAAU,EACVI,gBAAkBM,IACVuC,MAAMC,QAAQxC,IACd7J,GAAS,IAAAsM,qBAAiDnG,EAAQ,CAAE0D,YAG5ER,cAAe,KACXrJ,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,MAEpEqP,YAAa,KACTtJ,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,MACnE,UACD,SAAC,GAAqB,CAClByH,MAAO,qCACPvJ,YAAa,2CACboU,IAAK,uCACLxT,QAAS,YAIjB,4BAIR,yBC/EFoU,GAAc,IAAyBjY,iBAAiB,eACxD,GAAa,IAAyBA,iBAAiB,cACvD,GAAwB,IAAyBA,iBAAiB,sBAMlEkY,GAAuB,UAAOpW,GAAG;;;;;;;;;aASzBxB,GAAUA,EAAMC,MAAMW,MAAMe;;;;EAMpC,GAAkB,UAAOqL,MAAM;;EAI/B6K,GAA8B,CAChC7W,GAAI,EACJmD,KAAM,GACNtB,MAAO,GACPpC,IAAK,GACLgW,SAAU,2BACVqB,SAAU,GACVC,aAAc,GACd9U,aAAc,GACdR,KAAM,GACN9B,KAAM,IAGGyC,GAAkB4U,IAC3B,GAAIA,EAAK,CACL,MAAMhV,EAAYiV,KAAKC,MAAMF,GAC7B,IAAKG,MAAMnV,GACP,OAAO,IAAIiV,KAAKjV,GAAWoV,UAAY,GAE/C,GAISC,GAA+B,EACxC3P,SACA8I,QACA0D,UACAxH,WAOA,MAAM,OAAEiD,GAAWjI,GACb,KAAEkN,EAAI,UAAE0C,GAAc5P,EAAO8L,QAC7BhK,GAAW,UACXgG,GAAW,QAAgBK,GAAU,EAAA7C,OAAOzN,UAAUiQ,SAASK,EAAOF,GAAS,GAAAI,eAC9EtQ,EAAK8X,IAAU,IAAApW,eAA6BS,GAC7CzC,GAAO,EAAAC,EAAA,KAyBb,OAvBA,IAAAuF,WAAU,KACN6E,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,MAEjE,KAEH,IAAA3P,WAAU,KACN6E,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ4E,OAAQK,MAEhE,CAACA,KAEJ,IAAAjQ,WAAU,KACFiQ,GACA2C,GACI,IAAAC,cAAa,CACTxV,UAAW4S,EAAK3S,aAAeG,GAAewS,EAAK3S,cAAgBgV,KAAKQ,MACxEC,KAAM,aACN/X,KAAM,WACNF,IAAKmV,EAAKnV,QAIvB,CAACmV,KAGA,gCACc,SAATlI,IACG,SAAC,GAAU,CACP2G,MAAO,CACH,IACOwD,MACAjC,EACH+C,KAAMlY,EACNgW,SAAU,cAGlBJ,gBAAiB,GAAE,SACjB3S,IAEM,SAAC,GAAe,CAACH,QAAS,IAAMG,EAAKkS,GAAM5U,IAAM,GAAE,UAC/C,SAAC2W,GAAW,CAACD,SAAUlG,GAAS,IAAK/Q,IAAKA,EAAK6X,UAAWA,IAAa,QAOjF,SAAT5K,IACG,qCACa9K,IAARnC,IACG,SAACkX,GAAW,CAACD,SAAUlG,GAAS,IAAK/Q,IAAKA,EAAK6X,UAAWA,IAAa,IAE1EpD,IACG,SAAC1B,GAAc,CACXC,aAAc,GACdC,aAAclD,EACdoD,OAAQ,mCACRD,UAAU,EACVI,gBAAkBM,IACVuC,MAAMC,QAAQxC,SAAuBzR,IAAbyR,EAAM,IAC9B7J,GACI,IAAAsM,qBAA+CnG,EAAQ,CAAEiF,KAAMvB,EAAM,OAIjFR,cAAe,KACXrJ,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,MAEpEqP,YAAa,KACTtJ,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,MACnE,cACS7B,IAATgT,GACG,SAACgC,GAAoB,UAChBzX,EAAKY,cAAc,CAAEC,GAAI,mCAG9B,SAAC,GAAqB,CAClBkL,MAAO,mCACPvJ,YAAa,yCACboU,IAAK,uCACLxT,QAAS,kBCvJvC,GAAa,IAAyB7D,iBAAiB,cACvD,GAAwB,IAAyBA,iBAAiB,sBAClEkZ,GAAkB,IAAyBlZ,iBAAiB,gBAE5DmZ,GAAU,UAAOrX,GAAyB;;;;;;aAMlCxB,GAAUA,EAAM0X;EAGxB,GAA8B,CAChC1W,GAAI,EACJmD,KAAM,GACNtB,MAAO,GACPpC,IAAK,GACLgW,SAAU,2BACVqB,SAAU,GACVC,aAAc,GACd9U,aAAc,GACdR,KAAM,GACN9B,KAAM,IAGG,GAAkBqX,IAC3B,GAAIA,EAAK,CACL,MAAMhV,EAAYiV,KAAKC,MAAMF,GAC7B,IAAKG,MAAMnV,GACP,OAAO,IAAIiV,KAAKjV,GAAWoV,UAAY,GAE/C,GAISU,GAAgC,EACzCpQ,SACAgF,OACA8D,YAOA,MAAM,OAAEb,GAAWjI,EACb8B,GAAW,UACXgG,GAAW,QAAgBK,GAAU,EAAA7C,OAAOzN,UAAUiQ,SAASK,EAAOF,GAAS,GAAAI,cAC/E2G,EAAWlG,GAAS,KACnBuH,EAAcC,IAAmB,IAAA7W,eAA6BS,GAC/DkE,GAAM,IAAAO,QAAuB,MAC7B4R,GAAkB,IAAA1J,SACpB,IACI7G,EAAO8L,QAAQ0E,OACT,IACOxQ,EAAO8L,QAAQ0E,OAAO7W,IAAI,CAAC8W,EAAO5W,KAC1B,IACA,GACHvB,GAAImY,EAAMvD,KAAOuD,EAAMvD,KAAK5U,GAAKuB,EACjCkU,SAAU0C,EAAMvD,KAAOuD,EAAMvD,KAAKa,SAAW,GAAeA,SAC5DkC,KACIQ,EAAMvD,MAAQuD,EAAMvD,KAAKnV,KACnB,IAAA+X,cAAa,CACT7X,KAAM,WACNF,IAAK0Y,EAAMvD,KAAKnV,IAChBiY,KAAM,aACN1V,UACImW,EAAMvD,MAAQuD,EAAMvD,KAAK3S,aACnB,GAAekW,EAAMvD,KAAK3S,cAC1BgV,KAAKQ,QAEnB,OAItB,GACV,CAAC/P,EAAO8L,QAAQ0E,SAGdA,GAAS,IAAA3J,SACX,SAC8B3M,IAA1B8F,EAAO8L,QAAQ0E,OACT,IACOxQ,EAAO8L,QAAQ0E,OAAO7W,IAAK8W,GACtBA,EAAMvD,KACC,IACAuD,EACH1Y,KAAK,IAAA+X,cAAa,CACdxV,UAAWmW,EAAMvD,KAAK3S,aAChB,GAAekW,EAAMvD,KAAK3S,cAC1BgV,KAAKQ,MACX9X,KAAM,OAAOoY,GAAgBA,EAAerB,EAAWqB,EAAerB,IACtEgB,KAAM,aACNjY,IAAK0Y,EAAMvD,KAAKnV,OAIjB,IACA0Y,EACH1Y,IAAK,MAKrB,GACV,CAACiI,EAAO8L,QAAQ0E,OAAQH,EAAcrB,KAG1C,IAAA/R,WAAU,KACF6K,GAAqB,SAAT9C,GACZlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CAAExB,SAAQjQ,KAAMgI,EAAOhI,SAG/E,CAAC8P,KAEJ,IAAA7K,WAAU,KACN,MAAMyT,EAAe,KACbtS,EAAIkC,SACJgQ,EAAgBlS,EAAIkC,QAAUlC,EAAIkC,QAAQqQ,YAAc3B,IAKhE,OAFAxB,OAAOoD,iBAAiB,SAAUF,GAE3B,KACHlD,OAAOqD,oBAAoB,SAAUH,KAG1C,CAACtS,KAEJ,IAAAnB,WAAU,KACNqT,EAAgBlS,EAAIkC,QAAUlC,EAAIkC,QAAQqQ,YAAc3B,IAEzD,CAAC5Q,KAEJ,IAAAnB,WAAU,KACN6E,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAChC1E,SACA4E,OAAQ7M,EAAO8L,QAAQ0E,QAA2C,IAAjCxQ,EAAO8L,QAAQ0E,OAAO5V,WAIhE,CAACoF,EAAO8L,QAAQ0E,SAEnB,MAAMM,GAAa,IAAAjK,SACf,IAAe,SAAT7B,GAAmBkJ,MAAMC,QAAQnO,EAAO8L,QAAQ0E,SAA4C,IAAjCxQ,EAAO8L,QAAQ0E,OAAO5V,OACvF,CAACoF,EAAO8L,QAAQ0E,OAAQxL,IAGtB+L,GAAe,IAAA1U,aAAY,KAC7ByF,EACI,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CACtCxB,OAAQjI,EAAOiI,OACfjQ,KAAMgI,EAAOhI,SAGtB,CAAC8J,EAAU9B,EAAOiI,OAAQjI,EAAOhI,OAGpC,YAAqBkC,IAAjBmW,GACO,gBAAKjS,IAAKA,EAAKqM,MAAO,CAAE3B,MAAO,WAItC,UAACqH,GAAO,CAACnB,SAAUqB,GAAgBA,EAAerB,EAAWqB,EAAerB,EAAQ,WAChF,SAAC,GAAU,CAACrD,MAAO4E,EAAiB5C,gBAAiB,GAAE,SACjD3S,IAEM,SAACkV,GAAe,CACZM,OAAQA,EACRxB,SAAUqB,GAAgBA,EAAerB,EAAWqB,EAAerB,EACnEgC,QAAShR,EAAO8L,QAAQkF,UAAW,EACnCC,KAAMjR,EAAO8L,QAAQmF,OAAQ,EAC7BC,QAAS,EACTC,aAAetX,IACX,GAAa,SAATmL,GACA,GAAIhF,EAAO8L,QAAQ0E,OAAQ,CACvB,MAAMC,EAAQzQ,EAAO8L,QAAQ0E,OAAO3W,GAChC4W,GAASA,EAAMvD,MACflS,EAAKyV,EAAMvD,KAAK5U,GAExB,OAEAwJ,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CAAExB,SAAQjQ,KAAMgI,EAAOhI,aAOjG8Y,GACG,SAAC,GAAqB,CAClBtN,MAAO,oCACPvJ,YAAa,0CACboU,IAAK,uCACLxT,QAASkW,KAGb,4B,eC3MhB,MAAMK,GAAmB,IAAyBpa,iBAAiB,oBAC7Dqa,GAAQ,IAAyBra,iBAAiB,SAQ3Csa,GAAgB,EAAG/J,WAAUvM,OAAMyM,YAC5C,MAAMhQ,GAAO,EAAAC,EAAA,MACNkQ,EAAU2J,IAAe,IAAA9X,UAAS,IAEnC+X,GAAU,IAAAnV,aAAY,KACxBkV,EAAY,IACZ9J,KACD,CAACA,IAEJ,OACI,SAAC4J,GAAK,CACFlX,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,6BAChC0C,KAAMA,EACNF,aAAc0W,EACdzW,2BAAyB,EACzBuC,QAAS,CACL,CACIC,UAAU,SAAC,IAAgB,CAACjF,GAAG,kBAC/BJ,MAAO,SACPsF,aAAcgU,GAElB,CACIjU,UAAU,SAAC,IAAgB,CAACjF,GAAG,kBAC/BJ,MAAO,QACPuZ,UAAW7J,EACXpK,aAAc,KACV+J,EAAS,MAAOiI,MAAM5H,EAAU,CAAEjE,OAAO,IAAS+N,QAAQ,QAAS,aACnEF,OAGX,UACD,SAACJ,GAAgB,CAACO,MAAO/J,EAAUzC,SAAW1B,GAAM8N,EAAY9N,EAAEzJ,OAAO2X,OAAQ1N,OAAQ,aChC/F2N,GAAoB,IAAyB5a,iBAAiB,qBAE9D6a,GAAiB,UAAO/Y,GAAG;;;;;;;;;;;EAapBgZ,GAA8B,EACvC9R,SACAgF,WAMA,MAAM,OAAEiD,GAAWjI,EACbzI,GAAQ,IAAAC,aACR,KAAEgF,GAASwD,EAAO8L,QAClBhK,GAAW,UACXgG,GAAW,QAAgBK,GAAU,EAAA7C,OAAOzN,UAAUiQ,SAASK,EAAOF,GAAS,GAAAI,cAC/E0J,GAAS,QAAgB5J,GAAU,EAAA7C,OAAOzN,UAAUma,kBAAkB7J,EAAOF,IAASgK,MACtF1G,GAAQ,QAAe,EAAAjG,OAAOzN,UAAU2T,aACxC0G,GAAuB,QAAe,EAAAC,QAAQta,UAAUua,4BACxDC,GAAS,QAAe,EAAAC,MAAMza,UAAU0a,WAExC9a,GAAO,EAAAC,EAAA,MAEP,KACFsD,EAAI,SACJuM,EACAE,MAAO+K,EACP9K,IAAK+K,EACL3K,SAAU4K,GACVtL,KAEEqF,GAAU,IAAApQ,aACXqQ,IACG5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,qBAE9E,CAACwJ,EAAUrK,KAGf,IAAAwF,WAAU,KACN6E,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAChC1E,SACA4E,OAAQrQ,GAAwB,IAAhBA,EAAK5B,WAI9B,CAAC4B,IAEJ,MAAMmW,GAAsB,IAAA9L,SAAQ,KACzB,QAA0BwL,EAAQ9a,EAAOkV,GACjD,CAAC4F,EAAQ5F,EAASlV,IAGrB,OAAIwa,GACO,yBAGP,UAACF,GAAc,YACX,SAACD,GAAiB,CACdgB,UAAW9K,EACXtL,KAAMA,GAAQ,GACd+O,MAAgB,SAATvG,QAA6B9K,IAAVqR,EAAsBA,EAAQ,GACxD2G,qBACa,SAATlN,GAAmBkN,EACb,CACIW,cAAeX,EACfY,gBAAiBH,QAErBzY,EAEV8K,KAAMA,EACNG,SAAW3I,IACPsF,GAAS,IAAAsM,qBAA8CnG,EAAQ,CAAEzL,WAErEuW,qBAAsB,CAACN,GACvBO,SAAU,CAAE9F,KAAM,UAAKA,QAE1BwF,IAAoB,SAACpB,GAAa,CAAC/J,SAAUA,EAAUvM,KAAMA,EAAMyM,MAAO+K,QC9FjFS,GAAqB,IAAyBjc,iBAAiB,sBAE/D,GAAiB,UAAO8B,GAAG;;;;;;EAQ3Boa,GAAc,UAAOpa,GAAG;;;;;;wBAMLxB,GAAUA,EAAMC,MAAMW,MAAMsM;EAG/C2O,GAAO,UAAO7O,MAA6B;;;;;;;eAOjChN,GAAWA,EAAMwQ,SAAW,MAAQ;wBAC3BxQ,GAAWA,EAAMwQ,SAAWxQ,EAAMC,MAAMW,MAAMsM,MAAQlN,EAAMC,MAAMW,MAAMe;;4BAEpE3B,GAAUA,EAAMC,MAAMW,MAAMsM;;EAI5C4O,GAA+B,EACxCpT,SACAwM,UACAxH,OACA1G,aAOA,MAAM,OAAE2J,GAAWjI,GACb,KAAExD,EAAI,MAAEtE,EAAK,QAAEmb,GAAYrT,EAAO8L,QAClChK,GAAW,UACXgG,GAAW,QAAgBK,GAAU,EAAA7C,OAAOzN,UAAUiQ,SAASK,EAAOF,GAAS,GAAAI,cAYrF,OAVA,IAAApL,WAAU,KACN6E,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAChC1E,SACA4E,OAAQrQ,GAAwB,IAAhBA,EAAK5B,WAI9B,CAAC4B,KAGA,UAAC,GAAc,YACX,SAACyW,GAAkB,CACf3U,OAAQA,EACR9B,KAAMA,EACNtE,MAAOA,EACPmb,QAASA,EACTT,UAAW9K,EACX0E,QAASA,EACTxH,KAAMA,EACNG,SAAW3I,IACPsF,GAAS,IAAAsM,qBAA+CnG,EAAQ,CAAEzL,aAGzEsL,GAAqB,SAAT9C,GACT,SAACsO,GAAO,CACJD,QAASA,EACTxY,QAAUwY,IACNvR,GAAS,IAAAsM,qBAA+CnG,EAAQ,CAAEoL,iBAI1E,4BAMHC,GAAU,EAAGD,UAAU,KAAMxY,cAGlC,SAACqY,GAAW,UAFQ,CAAC,KAAM,KAAM,KAAM,MAG5BvZ,IAAI,CAAC4Z,EAAW1Z,KACnB,SAACsZ,GAAI,CAAarL,SAAUuL,IAAYE,EAAW1Y,QAAS,IAAMA,EAAQ0Y,GAAU,SAC/EA,GADM1Z,MCnFrB2Z,GAAc,IAAyBxc,iBAAiB,eACxDyc,GAAe,IAAyBzc,iBAAiB,gBACzD0c,GAAS,IAAyB1c,iBAAiB,UACnD2c,GAAY,IAAyB3c,iBAAiB,aACtD4c,GAAc,IAAyB5c,iBAAiB,eACxD6c,GAAsB,IAAyB7c,iBAAiB,uBAChE8c,GAAgB,IAAyB9c,iBAAiB,iBAC1D,GAAa,IAAyBA,iBAAiB,cACvD,GAAY,IAAyBA,iBAAiB,UAE/C+c,GAAS,UAAOjb,GAA0B;;;eAGvCxB,GAAWA,EAAM0c,SAAW,KAAO;EAGtCC,GAAY,UAAOnb,GAAG;;;;;;EAQtBob,GAAkB,UAAOpb,GAAG;wBAChBxB,GAAUA,EAAMC,MAAMW,MAAMic;aACvC7c,GAAUA,EAAMC,MAAMW,MAAMe;eAC1B3B,GAAUA,EAAMC,MAAMgE,MAAMgG;qBACtBjK,GAAUA,EAAMC,MAAMgE,MAAMgG;;;;EAMrC6S,GAAY,UAAOtb,GAAG;qBACbxB,GAAUA,EAAMC,MAAMgE,MAAMK;EASrCyY,GAAkC,CAC3CC,SAAU,GACVC,SAAU,GACVC,SAAU,GACVC,SAAU,IACVC,uBAAwB,EAAAC,eAAeC,KACvCC,YAAa,GACbC,mBAAoB,GACpBC,eAAgB,GAChBC,SAAU,IAGDC,GAA4B,KACrC,MAAMxd,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXU,GAAkB,IAAA0S,uBACjB9P,EAAQkE,IAAa,IAAA7P,WAAkB,IACvC0b,EAAWC,IAAgB,IAAA3b,WAAkB,IAC9C,QACF2F,EAAO,MACPC,EAAK,SACLgW,EAAQ,UACR5U,EAAS,MACT6H,EACAgN,WAAW,QAAEC,KACb,IAAAhW,SAAuC,CACvCV,cAAewV,GACf7U,aAAc,SAIXgW,EAAcC,IAAmB,IAAAhc,UAA2B,IAC7DgP,EAAOH,IAEPoN,EAAgC,CAClC,CAAElS,MAAO,OAAQmO,MAAO,EAAAgD,eAAeC,MACvC,CAAEpR,MAAO,MAAOmO,MAAO,EAAAgD,eAAegB,KACtC,CAAEnS,MAAO,WAAYmO,MAAO,EAAAgD,eAAeiB,WAGzCC,GAAqB,IAAAxZ,aACtByZ,IACG,UAAKC,OAAOC,mBAAmBrZ,KAAK,EAAGG,aACnCuC,EAAM,IACCvC,EACHkY,SAAWc,EAAUhI,SAAShR,EAAOkY,UAAY,IAAqBlY,EAAOkY,SAAtBc,EAAU,QAI7E,CAACzW,KAiBL,IAAApC,WAAU,KACDmI,IACLgQ,GAAa,GACb,UAAKW,OACAE,aAAa,CAAEnT,OAAQN,EAAgBM,SACvCnG,KAAK,EAAGG,aACA0F,EAAgBM,OAAOoT,UACxBT,EAAgB3Y,GAChB+Y,EAAmB/Y,EAAOnD,IAAKqb,GAAaA,EAAS1c,QAG5DyE,MAAOoZ,IACC3T,EAAgBM,OAAOoT,SACxBpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO2S,EAAIvZ,cAGjDwZ,QAAQ,KACLhB,GAAa,OAEtB,CAAChQ,EAAQ5C,EAAgBM,OAAQhB,EAAU+T,KAE9C,IAAA5Y,WAAU,KACsB,IAAxBuY,EAAa5a,QACbya,EAAS,WAAYG,EAAa,GAAGld,KAE1C,CAACkd,EAAcH,IAElB,MAAMgB,EAAc,IAAM/M,GAAU,GAE9BgN,GAAc,IAAAzP,SAAQ,IAAM2O,EAAa5a,OAAS,EAAG,CAAC4a,IAE5D,OACI,iCACI,SAACvB,GAAS,WACN,SAACP,GAAM,CACHlQ,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,6BAChCuC,QAAS,IAAMyO,GAAU,QAGjC,SAACkK,GAAW,CAACxY,KAAMoK,EAAQmR,OAAO,QAAQzb,aAAcub,EAAW,UAC/D,SAAC5C,GAAY,CACTvY,SAAU,SACVf,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,6BAChC6C,iBAAkBkb,EAAW,SAC5BlB,GACG,SAAC,GAAS,CAACld,KAAK,OAEhB,gCAC6B,IAAxBud,EAAa5a,SACV,SAACsZ,GAAe,UAAEzc,EAAKY,cAAc,CAAEC,GAAI,2BAE/C,UAACyb,GAAM,CAACC,SAAkC,IAAxBwB,EAAa5a,OAAY,UACtC0b,IACG,+BACI,UAAClC,GAAS,YACN,SAAC,GAAU,CAACnc,KAAM,IAAG,UACjB,SAAC,IAAgB,CAACK,GAAG,gCAEzB,SAACke,GAAc,CACXhT,MAAM,kCACNiT,aAAc,CACVjT,MAAOgS,EAAa,GAAGhS,MACvBmO,MAAO6D,EAAa,GAAGld,IAE3B0V,QAASwH,EAAa7b,IAAK+c,IAChB,CAAElT,MAAOkT,EAAGlT,MAAOmO,MAAO+E,EAAGpe,MAExCqe,aAAehF,IACPlR,EAAU,cAAgBkR,GAC1BtS,IAEJgW,EAAS,WAAY1D,YAMzC,UAACyC,GAAS,YACN,SAAC,GAAU,CAACnc,KAAM,IAAG,UACjB,SAAC,IAAgB,CAACK,GAAG,2BAEzB,SAACqb,GAAS,CACNvU,QAASA,EACTpH,KAAM,WACN8Q,MAAO,MACPD,YAAapR,EAAKY,cAAc,CAAEC,GAAI,kCACtCse,MAAO,CAAEC,UAAU,MAEvB,SAAClD,GAAS,CACNvU,QAASA,EACTpH,KAAM,WACN8Q,MAAO,MACPD,YAAapR,EAAKY,cAAc,CAAEC,GAAI,6BACtCse,MAAO,CAAEC,UAAU,MAEvB,SAAC/C,GAAa,CACV1U,QAASA,EACTpH,KAAM,WACN8Q,MAAO,MACPD,YAAapR,EAAKY,cAAc,CAAEC,GAAI,6BACtCse,MAAO,CAAEC,UAAU,SAG3B,UAACzC,GAAS,YACN,SAAC,GAAU,CAACnc,KAAM,IAAG,UACjB,SAAC,IAAgB,CAACK,GAAG,oCAEzB,SAACsb,GAAW,CACRxU,QAASA,EACTpH,KAAM,WACN8Q,MAAO,MACPD,YAAapR,EAAKY,cAAc,CAAEC,GAAI,8BACtCse,MAAO,CAAEC,UAAU,MAEvB,SAACL,GAAc,CACXhT,MAAM,6CACNiT,aAAcf,EAA8B,GAC5C1H,QAAS0H,EACTiB,aAAehF,GACX0D,EAAS,yBAA0B1D,MAG3C,SAACgC,GAAS,CACNvU,QAASA,EACTpH,KAAM,cACN8Q,MAAO,MACPD,YAAapR,EAAKY,cAAc,CAAEC,GAAI,iCACtCse,MAAO,CAAEC,UAAU,SAG3B,UAACzC,GAAS,YACN,SAAC,GAAU,CAACnc,KAAM,IAAG,UACjB,SAAC,IAAgB,CAACK,GAAG,uCAEzB,SAACqb,GAAS,CACNvU,QAASA,EACTpH,KAAM,iBACN8Q,MAAO,MACPD,YAAapR,EAAKY,cAAc,CAAEC,GAAI,oCACtCse,MAAO,CAAEC,UAAU,SAG3B,UAACzC,GAAS,YACN,SAAC,GAAU,CAACnc,KAAM,IAAG,UACjB,SAAC,IAAgB,CAACK,GAAG,4CAEzB,SAACqb,GAAS,CACNvU,QAASA,EACTpH,KAAM,qBACN8Q,MAAO,MACPD,YAAapR,EAAKY,cAAc,CAAEC,GAAI,yCACtCse,MAAO,CAAEC,UAAU,YAI/B,SAACnD,GAAM,CACHlQ,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,kCAChCwe,OAAQ3B,EACR1D,SAAU0D,GAAqC,IAAxBK,EAAa5a,SAAiB2a,EACrD1a,QA7KP,KACbsa,IACJC,GAAa,GACb,UAAKW,OACAgB,iBAAiBtO,GACjB9L,KAAK,IA3BQ6Q,OAAOwJ,SAASC,UA4B7Bla,MAAOoZ,GAAQrU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO2S,EAAIvZ,aACzDwZ,QAAQ,KACL9M,GAAU,GACV8L,GAAa,GACb/V,qBA6KVmX,GAAiB,EACnBhT,QACAiT,eACAzI,UACA2I,mBAOA,MAAM,QAAEvX,EAAO,MAAEkJ,IAAU,IAAA/I,SAAwD,CAC/EV,cAAe,CACXmW,SAAUyB,GAEdjX,aAAc,QAWlB,OARA,IAAAvC,WAAU,KACN,MAAMuL,EAAeF,EAAOG,IACnBA,EAAKuM,UAAavM,EAAKuM,SAASrD,OACrCgF,EAAalO,EAAKuM,SAASrD,SAE/B,MAAO,IAAMnJ,EAAaI,eAC3B,CAACN,EAAOqO,KAGP,SAAC9C,GAAmB,CAChBrQ,MAAOA,EACPxL,KAAK,WACLgW,QAASA,GAAW,GACpBkJ,SAAWC,GAAMA,EAAExF,MACnByF,SAAS,QACTC,UAAU,QACVjY,QAASA,EACTwX,MAAO,CAAEC,UAAU,MCxUlBS,GAAS,UAAOxe,GAAG;;;;EAMnBye,GAAkB,UAAOze,GAAG;;;;EAM5B0e,GAAW,UAAO1e,GAAG;;;;EAOrB2e,GAAe,EACxBC,SACAC,aACAC,aAOI,UAACN,GAAM,WACFI,GAAUA,KACX,SAACH,GAAe,WACZ,SAACC,GAAQ,UAAEG,GAAcA,QAE5BC,GAAUA,OC9BV,GAAY,UAAO9e,GAAG;;;EAKtB+e,GAAqB,EAAG5P,SAAQ1K,eACzC,MAAMyM,GAAS,QAAgB7B,GAAU,EAAA7C,OAAOzN,UAAUigB,yBAAyB3P,EAAOF,GAAS,GAAAI,cAE7F6B,GAAgB,IAAArD,SAAQ,KACnB,CACHkR,QAAS/N,GAAUA,EAAgB,QAAI,GAAGA,EAAgB,YAAQ,QAEvE,CAACA,IAEJ,OAAO,SAAC,GAAS,CAACS,MAAO,CAAEsN,QAAS7N,EAAc6N,SAAS,SAAGxa,KCfrD,GAAiB,UAAOzE,GAAG;eACxBxB,GAAUA,EAAMC,MAAMgE,MAAMK;;EAI/Boc,GAAU,UAAOlf,GAA+E;kBAC1FxB,GAAUA,EAAMkT;iBACjBlT,GAAUA,EAAMgT;mBACdhT,GAAUA,EAAMiT;aACtBjT,GAAUA,EAAMY;EAGjB+f,GAAsB,EAC/BhQ,SACAuC,YAAY,OACZF,WAAW,KACXC,aAAa,SACbrS,YAQA,MAAM6R,GAAgB,QAAgB5B,GAAU,EAAA7C,OAAOzN,UAAUuQ,aAAaD,EAAOF,GAAS,GAAAI,cAC9F,OACI,8BACK0B,GAAgD,iBAAxBA,EAAc5P,OAAqD,IAA/B4P,EAAc5P,MAAMS,SAC7E,SAAC,GAAc,WACX,SAACod,GAAO,CAACxN,UAAWA,EAAWF,SAAUA,EAAUC,WAAYA,EAAYrS,MAAOA,EAAK,SAClF6R,EAAc5P,aC7B1B+d,GAAkB,UAAOpf,GAA+B;wBAC5CxB,GAAUA,EAAM6gB;EAG5BC,GAAW,UAAOtf,GAAG;;;;EAWrBuf,IALU,UAAOvf,GAAG;eACjBxB,GAAUA,EAAMC,MAAMgE,MAAMgG,QAASjK,GAAUA,EAAMC,MAAMgE,MAAMK;aACnEtE,GAAUA,EAAMC,MAAMW,MAAMogB;EAGd,UAAOxf,GAAG;;;;WAI1BxB,GAAUA,EAAMC,MAAMgE,MAAMgd;;GAI3BC,GAAe,EACxBvQ,SACAwQ,WACAC,gBAMA,MAAMnhB,GAAQ,IAAAC,YACRwS,GAAS,QAAgB7B,GAAU,EAAA7C,OAAOzN,UAAUoS,uBAAuB9B,EAAOF,GAAS,GAAAI,cAE3FsQ,GAAc,IAAA9R,SAAQ,KACjB,CACH3O,MAAO8R,GAAUA,EAAc,MAAIG,OAAOH,EAAc,OAAKzS,EAAMW,MAAMkS,MACzEC,gBAAiBL,GAAUA,EAAO,oBAAsBG,OAAOH,EAAO,qBAAuB,cAC7FM,SAAUN,GAAUA,EAAO,aAAeG,OAAOH,EAAO,cAAgB,KACxEO,WAAYP,GAAUA,EAAO,eAAiBG,OAAOH,EAAO,gBAAkB,SAC9EQ,UAAWR,GAAUA,EAAO,cAAgBG,OAAOH,EAAO,eAAiB,SAEhF,CAACA,EAAQzS,IAEZ,OACI,SAAC2gB,GAAe,CAACC,eAAgBQ,EAAYtO,gBAAe,UACxD,UAAC+N,GAAQ,YACL,UAACC,GAAY,YACT,SAACJ,GAAmB,CAChBhQ,OAAQA,EACRsC,WAAYoO,EAAYpO,WACxBD,SAAUqO,EAAYrO,SACtBE,UAAWmO,EAAYnO,UACvBtS,MAAOygB,EAAYzgB,QAEtBwgB,GAAaA,EAAUC,EAAYzgB,UAEvCugB,GAAYA,UCtDvBG,GAAiB,IAAyB5hB,iBAAiB,kBAC3D6hB,GAAU,IAAyB7hB,iBAAiB,WAE7C8hB,GAAa,UAAOhgB,GAAG;oBACfxB,GAAUA,EAAMC,MAAMgE,MAAMgG;;sBAE1BjK,GAAUA,EAAMC,MAAMW,MAAMe;;EAItC8f,GAA6B,EACtC9Q,SACA+Q,wBAAuB,EACvBC,mBAMA,MAAMxhB,GAAO,EAAAC,EAAA,KACPoK,GAAW,KAAAoX,eAMXlL,EAA0C,CAC5C,CAAExK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,yBAA2BuC,QANhD,KACbiH,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,KAChE,UAAKga,OAAOgB,iBAAiB1C,IAAiC+B,QAAQ6C,MAO1E,OACI,SAACT,GAAY,CACTvQ,OAAQA,EACRwQ,SAAU,IAEFO,IACI,SAACF,GAAU,WACP,SAACD,GAAO,CACJze,SAAU,OACVH,YAAaxC,EAAKY,cAAc,CAAEC,GAAI,2BAA2B,UACjE,SAACsgB,GAAc,CACXO,OAAK,EACLC,mBAAmB,OACnBpL,QAASA,EACT7G,KAAM,gBACN3D,MAAO,GACPtL,MAAM,UACNE,QAAQ,oBCxCtCihB,GAAuB,IAAyBriB,iBAAiB,wBAW1DsiB,GAAiC,EAC1CtZ,SACAgF,OACAuU,oBAEA,MAAM,OAAEtR,GAAWjI,EACb8B,GAAW,WACVkX,EAAsBQ,IAA2B,IAAA/f,eAA8BS,IAC/Euf,EAAYC,IAAiB,IAAAjgB,WAAkB,GAChDkgB,GAAQ,QAAgBxR,GAAU,EAAA7C,OAAOzN,UAAU+hB,kBAAkBzR,EAAOF,GAAS,GAAAI,eAEpFgG,EAAKwL,IAAU,IAAApgB,eAA6BS,IAC5C4f,EAAMC,IAAW,IAAAtgB,UAA6B,IAE/Cwf,GAAe,IAAA5c,aACjB,CAAC8Z,EAAWc,KACJd,GAAqB,MAAdA,EAAIna,OACX,UAAK+Z,OAAOgB,iBAAiB1C,IAE7B4C,EACAzJ,OAAOwJ,SAASC,UAIpBuC,GAAwB,GACxB1X,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,EAAMje,SAAS,OAEvF,CAAC+F,EAAUmG,IAGTgS,GAAc,IAAA5d,aACfkZ,IACGiE,EAAwBjE,GACxBzT,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,MAExE,CAAClY,EAAUmG,IAGTiS,GAAgB,IAAA7d,aACjBN,GAAqB+F,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,aAC7E,CAACkM,EAAQnG,IAGPqY,GAAoB,IAAA9d,aAAY,KAClC,UAAK0Z,OACAqE,sBACAzd,KAAK,EAAGG,aACL+c,EAAO/c,EAAOud,oBAEjBjE,QAAQ,IAAM8D,GAAc,KAClC,CAACA,IAEEI,GAAY,IAAAje,aAAY,KAC1B,MAAM0T,EAAM,IAAIR,KACVgL,EAAY,EAAA/f,MAAMC,KAAK+f,SAAS,IAAIjL,KAAKQ,IAE/C,UAAKgG,OACA0E,qBAAqB,CAClBnhB,MAAO,GACPohB,UAAW,EAAAlgB,MAAMC,KAAKkgB,eAAe5K,GACrC6K,QAAS,EAAApgB,MAAMC,KAAKkgB,eAAeJ,KAEtC5d,KAAK,EAAGG,aACLid,EAAQjd,GACR4c,GAAc,KAEjB3c,MAAM,KACH+E,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,qCACtCgW,GAAwB,GACxB1X,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,EAAMje,SAAS,OAEtFqa,QAAQ,IAAM8D,GAAc,KAClC,CAACA,EAAepY,EAAUmG,IA4B7B,OA1BA,IAAAhL,WAAU,KACN,IAAKwc,EAAY,OACjB,IAAKT,EAAsB,OAC3B,GAAIW,IAAU,EAAAkB,eAAgB,OAC9B,MAAMC,EAAWC,YAAYT,EAhFZ,KAiFjB,MAAO,IAAMU,cAAcF,IAC5B,CAAC9B,EAAsBsB,EAAWb,EAAYE,KAEjD,IAAA1c,WAAU,KACNid,GAAc,GACd,UAAKnE,OACAiD,uBACArc,KAAK,EAAGG,YAAamd,EAAYnd,IACjCC,MAAMkc,IACZ,CAACA,EAAciB,EAAeD,KAEjC,IAAAhd,WAAU,KACN,GAAK+b,EACL,OAAIW,IAAU,EAAAsB,gBACVf,GAAc,QACdC,UAGJG,KACD,CAACtB,EAAsBmB,EAAmBD,EAAeI,EAAWX,IAEnEX,GAAwBW,GAASA,IAAU,EAAAkB,gBAAkBtB,GACtD,8BAAGA,EAAcI,EAAOtL,GAAO,OAItC,SAACoJ,GAAY,CACTC,OAAQ,KAEA,+BACI,SAACqB,GAA0B,CACvB9Q,OAAQA,EACR+Q,0BAA+C9e,IAAzB8e,IAA+D,IAAzBA,EAC5DC,aAAc,IAAMA,OAAa/e,GAAW,OAK5Dyd,WAAY,KAEJ,UAACE,GAAkB,CAAC5P,OAAQA,EAAM,UAC7B+Q,IAAwB,SAACK,GAAoB,CAAC6B,kBAAmBpB,SACxC5f,IAAzB8e,IAAsC,6BACb9e,IAAzB8e,IAA+D,IAAzBA,GAA2C,SAAThU,IACrE,SAACiQ,GAAyB,U,eCjJtD,MAAM,GAAY,IAAyBje,iBAAiB,UACtD,GAAiB,IAAyBA,iBAAiB,eAC3D,GAAkB,IAAyBA,iBAAiB,gBAC5D,GAAgB,IAAyBA,iBAAiB,cAMnDmkB,IAJS,UAAO7W,MAAM;eACnBhN,GAAUA,EAAMC,MAAMgE,MAAMK;EAGtB,UAAO9C,GAAG;eAChBxB,GAAUA,EAAMC,MAAMgE,MAAMK;;;GAK/Bwf,GAAe,EAAG9iB,KAAImD,OAAMwM,aACrC,MAAMnG,GAAW,UACXrK,GAAO,EAAAC,EAAA,MACN0N,EAAQkE,IAAa,IAAA7P,WAAkB,GAW9C,OACI,iCACI,SAAC,GAAa,CAACyN,SAAU,GAAIrM,QAAS,IAAMyO,GAAU,GAAOnC,KAAK,eACjE/B,IACG,UAAC,GAAc,CAACrK,2BAA2B,EAAMC,KAAMoK,EAAQtK,aAAc,IAAMwO,GAAU,GAAM,WAC/F,SAAC,GAAe,CACZpO,SAAU,SACVf,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,yBAChC6C,iBAAkB,IAAMmO,GAAU,GAAM,SACvC7R,EAAKY,cAAc,CAAEC,GAAI,yCAE9B,SAAC6iB,GAAM,WACH,SAAC,GAAS,CAAC3X,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mBAAqBuC,QArB/D,KACjB,UAASmF,OACJqb,aAAa,CAAE/iB,KAAImD,OAAMwM,WACzBtL,KAAK,KACFmF,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqG,YAAY,CAAE1B,cAE/ClL,MAAM,IAAM+E,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,wCCvBlD,GAAS,UAAO1K,GAAG;;;;4BAIHxB,GAAUA,EAAMC,MAAMW,MAAMsM;EAG5C,GAAS,UAAOF,MAAM;;;;;wBAKVhN,GAAUA,EAAMC,MAAMW,MAAMe;;4BAExB3B,GAAUA,EAAMC,MAAMW,MAAMoJ;;EAI5Cga,GAAmB,EAC5BtjB,OACAiQ,SACAjD,OACAuW,sBACAlS,uBAQA,MAAM5R,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACX0Z,GAAe,QAAgBrT,GAAU,EAAA7C,OAAOzN,UAAU4jB,mBAAmBtT,EAAOF,GAAS,GAAAI,cAC7FqT,GAAqB,QACtBvT,GAAU,EAAA7C,OAAOzN,UAAU8jB,yBAAyBxT,EAAOF,GAC5D,GAAAI,cAGEuT,GAAY,IAAA/U,SACd,IACK2U,GAAgBE,GAAsBA,EAAmBG,QACzDN,GAAuBA,EAAoBM,OAChD,CAACL,EAAcE,EAAoBH,IAGjCO,GAAY,IAAAjV,SACd,IAAM2U,GAAgBE,GAAsBA,EAAmBK,OAC/D,CAACP,EAAcE,IAGbnS,GAAgB,IAAAlN,aAAY,KAC9ByF,EACI,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CACtCxB,SACAjQ,OACAgN,WAGT,CAACiD,EAAQnG,EAAU9J,EAAMgN,IAE5B,OAAO4W,IAAa,IAAAI,wCAAuCR,IACvD,UAAC,GAAM,YACH,SAAC,GAAM,CAAC3gB,QAASwO,GAAoBE,EAAa,SAC7C9R,EAAKY,cAAc,CAAEC,GAAI,wBAE7BwjB,IAAa,SAACV,GAAY,CAAC9iB,GAAIkjB,EAAaljB,GAAImD,KAAM+f,EAAa/f,KAAMwM,OAAQA,QAGtF,yBCzEF,GAAY,IAAyBjR,iBAAiB,UACtD,GAAe,IAAyBA,iBAAiB,aAElD,GAAa,UAAO8B,GAAG;eACpBxB,GAAUA,EAAMC,MAAMgE,MAAMK;;;;;;EAQ/BqgB,GAAwB,EACjCpT,cACAqT,kBAKA,MAAMzkB,GAAO,EAAAC,EAAA,KACPoK,GAAW,WACV0B,EAAO2Y,IAAY,IAAA1iB,UAAiB,KAErC,QAAE2F,EAAO,MAAEkJ,EAAK,MAAEjJ,IAAU,IAAAE,SAAQ,CACtCV,cAAe,CAAE2E,SACjBhE,aAAc,QAUlB,OAPA,IAAAvC,WAAU,KACN,MAAMuL,EAAeF,EAAOG,IACxB0T,EAAS1T,EAAKjF,OAAS,MAE3B,MAAO,IAAMgF,EAAaI,eAC3B,CAACN,EAAOxG,KAGP,UAAC,GAAU,YACP,SAAC,GAAY,CAAC9J,KAAM,QAASoH,QAASA,EAASyJ,YAAaA,EAAaC,MAAM,UAC/E,SAAC,GAAS,CACNtF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mBAChCmZ,UAAWjO,EAAM5I,OACjBC,QAAS,KACLqhB,EAAY1Y,GACZ2Y,EAAS,IACT9c,WChDd,GAAY,IAAyBrI,iBAAiB,UAE/C,GAAU,UAAO8B,GAAG;;;;;;;EASpBsjB,GAAkB,KAEvB,SAAC,GAAO,WACJ,SAAC,GAAS,CAACnkB,KAAM,QCMvBokB,GAAkB,IAAyBrlB,iBAAiB,mBAC5DslB,GAAwB,IAAyBtlB,iBAAiB,yBAClEulB,GAAgB,IAAyBvlB,iBAAiB,cAa1DwlB,IAX2B,UAAO1jB,GAAyB;;;;;cAKlDxB,GAAWA,EAAMmlB,OAAS,aAAanlB,EAAMC,MAAMW,MAAMmJ,QAAU;;;;EAMzD,UAAOvI,GAAG;;;;;GAOtB4jB,GAA4B,UAAO5jB,GAAG;;EAWtC6jB,GAA4B,EACrC3c,SACAwM,UACAxH,OACA4X,qBAEA,MAAMnlB,GAAO,EAAAC,EAAA,MACP,OAAEuQ,EAAQ6D,QAAS+Q,GAAkB7c,EACrC8B,GAAW,WACVyJ,EAAOuR,IAAY,IAAArjB,aACnBsjB,EAAcC,IAAmB,IAAAvjB,WAAS,IAE1CwjB,EAASC,IAAc,IAAAzjB,aACvB0b,EAAWC,IAAgB,IAAA3b,WAAS,GAErC0jB,GAAiB,QAAe,EAAA7X,OAAOzN,UAAU2T,YAAa,GAAAnD,cAE9DtQ,GAAM,QAAgBoQ,GAAU,EAAA7C,OAAOzN,UAAUulB,sBAAsBjV,EAAOnI,EAAOiI,QAAS,GAAAI,cAE9FqT,GAAqB,QACtBvT,GAAU,EAAA7C,OAAOzN,UAAU8jB,yBAAyBxT,EAAOF,GAC5D,GAAAI,cAGEgV,GAAQ,QACTlV,GAAU,EAAA7C,OAAOzN,UAAUylB,wBAAwBnV,EAAOnI,EAAOiI,QAClE,GAAAI,cAGEkV,GAAuB,IAAA1W,SAAQ,IAC1B6U,GAAsBA,EAAmBG,OACjD,CAACH,IAEE8B,GAAkB,IAAA3W,SAAQ,IACrB6U,GAAsBA,EAAmB+B,aACjD,CAAC/B,IAEEjP,GAAU,IAAApQ,aACXqQ,IACG5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,qBAE9E,CAACwJ,EAAUrK,IAGTimB,GAAa,IAAArhB,aAAY,KACtBkP,GAAUwR,IACXC,GAAgB,GAChB,kBACKzR,QACA5O,KAAMgG,IACHma,EAASna,EAAI7F,QACbkgB,GAAgB,GAGhBlb,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,MAAO5I,EAAI7F,YAEvDC,MAAO0G,IACJgJ,EAAQhJ,EAAE7G,cAGvB,CAAC6P,EAASlB,EAAOwR,EAAcjb,IAE7Bqb,EAEO5R,GACRuR,EAASK,GAFTO,IAKJ,MAAMvY,GAAW,IAAA9I,aACb,CAAC4L,EAAgB6D,KACbhK,GAAS,IAAAsM,qBAAoBnG,EAAQ6D,KAEzC,CAAChK,IA0BC6b,GAAqB,IAAAthB,aAAY,KAC9BtE,IACLqd,GAAa,GACb,UAAKpV,OACA4d,UAA+B,CAAE7lB,MAAKkQ,WACtCtL,KAAMb,KACC,IAAA+hB,2BAA0B/hB,EAASgB,SACnCqI,EAAS8C,EAAQnM,EAASgB,OAAOgP,WAGxC/O,MAAOoZ,IACIA,EAAID,SAAWzJ,GAE1B2J,QAAQ,IAAMhB,GAAa,MACjC,CAACnN,EAAQwE,EAAS1U,EAAKoN,IAEpB2Y,EAAmBvS,IACrBzJ,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,kBACpCjc,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,WACzCzJ,EACI,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CACtCxB,OAAQjI,EAAOiI,OACfjQ,KAAM,EAAAwN,YAAYG,UAClBX,YAKZ,IAAA/H,WAAU,KACDsO,GAAkB,SAATvG,GACV,kBAAauG,QAAQ5O,KAAMb,IACvBgG,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,MAAOzP,EAASgB,aAGlE,CAACkI,EAAMuG,EAAOzJ,KAEjB,IAAA7E,WAAU,KACN,MAAM+gB,EAAsDhe,EAAO8L,QAAQmS,KAAKtkB,IAAKC,IAAS,CAC1F4C,KAAM5C,EAAKO,OAAS,GACpB+S,KAAMtT,EAAKsT,WAAQhT,EACnBgkB,QAAStkB,EAAK+X,QAAS,KACnB/X,EAAKukB,OAAS,CACdA,MAAOvkB,EAAKukB,UAEZvkB,EAAKwkB,MAAQ,CAAEA,KAAMxkB,EAAKwkB,WAAQlkB,MAClCN,EAAKtB,IAAM,CAAEA,GAAIsB,EAAKtB,GAAIyV,SAAU,gBAG5CmP,EAAWc,IACZ,CAAChe,EAAO8L,QAAQmS,IAAKpB,KAExB,IAAA5f,WAAU,KACN,IAAKiR,MAAMC,QAAQkP,GAAQ,OAC3B,MAAMgB,EAAShB,EAAMiB,IAAI,GACpBD,GACAtmB,GAEDsmB,EAAOlR,OAAOpV,MAAQA,GAAOsmB,EAAOpW,SAAWjI,EAAOiI,SACpC,wBAAdoW,EAAOE,IAA8C,kBAAdF,EAAOE,IAC9CZ,MAGT,CAACN,EAAOrd,EAAOiI,OAAQlQ,EAAK0U,EAAS3K,EAAU6b,IAElD,MAAMa,EAAwBhb,IAC1B,IAAKxD,EAAO8L,QAAQmS,MAAQlmB,EAAK,OAEjC,MAAM0mB,EAAkB,IACjBze,EAAO8L,QACVmS,IAAK,IAAIje,EAAO8L,QAAQmS,IAAK,CAAE9jB,MAAOqJ,EAAOmO,OAAO,KAGxD,UAAK3R,OACA0e,aAAoC,CACjC3mB,MACAkQ,OAAQjI,EAAOiI,OACf6D,QAAS2S,EACTE,IAAI,IAEPhiB,KAAK,IAAMwI,EAASnF,EAAOiI,OAAQwW,IACnC1hB,MAAOoZ,GAAQ1J,EAAQ0J,EAAIvZ,YAG9B+O,GAAQ,IAAA9E,SAAQ,KAClB,IAAKqH,MAAMC,QAAQ0O,EAAcoB,KAAM,MAAO,GAE9C,MAAMW,EAAoB,GAO1B,OANA/B,EAAcoB,IAAIne,QAAS4W,IACnBA,EAAGxJ,MACH0R,EAAGC,KAAKnI,EAAGxJ,QAIZ0R,GACR,CAAC/B,IAEJ,MAAa,SAAT7X,GACIwH,GAEI,SAACgQ,GAAgB,WACb,SAACF,GAAqB,CAClB/Q,MAAOA,EACPtD,OAAQA,EACR6D,QAAS,IACF+Q,EACHoB,IAAKpB,EAAcoB,KAAKtkB,IAAKmlB,IAAM,IAC5BA,EACH3kB,MAAO,EAAAK,MAAMukB,KAAKC,uBAAuBF,EAAE3kB,WAGnDqS,QAASA,EACTyS,gBAAiB9Z,EACjB+Z,gBAvIKpT,IACrBhK,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqF,oBAAoB,IAAKmD,MAuIvC6K,aAAe7K,GACXhK,GAAS,IAAAsM,qBAA4CpO,EAAOiI,OAAQ6D,SASxF,SAAC,KAAU,CACPqT,MAAO,MAEH,SAAYnf,EAAOiI,SACtB,SACAgV,IACG,SAACV,GAAa,CAAC5Q,MAAOA,EAAOgC,gBAAiB,GAAE,SAC1C3S,IAEM,UAAC0hB,GAAyB,YACtB,SAACL,GAAe,CACZ/iB,MAAO,GACP8lB,eAAgBnC,EAChBoC,YAAcC,GAAUA,EAAMhnB,IAAM0C,EAAKskB,EAAMhnB,IAC/CinB,sBAAwB1lB,GA5JhC,EAACvB,EAAYuB,KAC5B9B,IACDod,IACJC,GAAa,GACb,UAAKpV,OACAwf,iBAAiB,CACdznB,MACAkQ,OAAQ3P,EACRuB,MAAOA,IAEV8C,KAAK,KACEigB,GAAgBA,MAEvB7f,MAAOoZ,IACJ1J,EAAQ0J,EAAIzJ,SACZ0I,GAAa,QA6IyCqK,CAAgBzf,EAAOiI,OAAQpO,KAEpEgjB,EAAc6C,OACX,SAACzD,GAAqB,CAClBC,YAAasC,EACb3V,YAAapR,EAAKY,cAAc,CAC5BC,GAAI,4CAIfklB,GAAmBjS,IAChB,SAAC+P,GAAgB,CACbrT,OAAQjI,EAAOiI,OACfjQ,KAAMgI,EAAOhI,KACbujB,oBAAqB,CACjBM,UAAWgB,EAAc6C,OAAQnC,IAErCvY,KAAMA,EACNqE,iBAAkB,KACTkC,EAYDuS,EAAgBvS,IAXhB6J,GAAa,GACb,kBACK7J,QACA5O,KAAMb,IACHgG,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,MAAOzP,EAASgB,UAEpDghB,EAAgBhiB,EAASgB,UAE5BsZ,QAAQ,IAAMhB,GAAa,QAO/CD,IAAa,SAACiH,GAAe,MAzCFpc,EAAOiI,aClR7D,GAAiB,IAAyBjR,iBAAiB,kBAC3D,GAAU,IAAyBA,iBAAiB,WAE7C,GAAa,UAAO8B,GAAG;oBACfxB,GAAUA,EAAMC,MAAMgE,MAAMgG;;sBAE1BjK,GAAUA,EAAMC,MAAMW,MAAMe;;EAItC0mB,GAA6B,EACtC1X,SACA+Q,wBAAuB,EACvBC,mBAMA,MAAMxhB,GAAO,EAAAC,EAAA,KACPoK,GAAW,KAAAoX,eAMXlL,EAA0C,CAC5C,CAAExK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,yBAA2BuC,QANhD,KACbiH,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,KAChE,UAAKga,OAAOgB,iBAAiB1C,IAAiC+B,QAAQ6C,MAO1E,OACI,SAACT,GAAY,CACTvQ,OAAQA,EACRwQ,SAAU,IAEFO,IACI,SAAC,GAAU,WACP,SAAC,GAAO,CACJ5e,SAAU,OACVH,YAAaxC,EAAKY,cAAc,CAAEC,GAAI,2BAA2B,UACjE,SAAC,GAAc,CACX6gB,OAAK,EACLC,mBAAmB,OACnBpL,QAASA,EACT7G,KAAM,gBACN3D,MAAO,GACPtL,MAAM,UACNE,QAAQ,oBCzCtCwnB,GAAuB,IAAyB5oB,iBAAiB,wBAW1D6oB,GAAiC,EAAG7f,SAAQgF,OAAMuU,oBAC3D,MAAM,OAAEtR,GAAWjI,EACb8B,GAAW,WACVkX,EAAsBQ,IAA2B,IAAA/f,eAA8BS,IAC/EmU,EAAKwL,IAAU,IAAApgB,eAA6BS,IAC5Cuf,EAAYC,IAAiB,IAAAjgB,WAAkB,GAChDkgB,GAAQ,QAAgBxR,GAAU,EAAA7C,OAAOzN,UAAU+hB,kBAAkBzR,EAAOF,GAAS,GAAAI,eACpFyR,EAAMC,IAAW,IAAAtgB,UAAkC,IAEpDwf,GAAe,IAAA5c,aACjB,CAAC8Z,EAAWc,KACJd,GAAqB,MAAdA,EAAIna,OACX,UAAK+Z,OAAOgB,iBAAiB1C,IAE7B4C,EACAzJ,OAAOwJ,SAASC,UAIpBuC,GAAwB,GACxB1X,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,EAAMje,SAAS,OAEvF,CAAC+F,EAAUmG,IAGTgS,GAAc,IAAA5d,aACfkZ,IACGiE,EAAwBjE,GACxBzT,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,MAExE,CAAClY,EAAUmG,IAGTiS,GAAgB,IAAA7d,aACjBN,GAAqB+F,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,aAC7E,CAACkM,EAAQnG,IAGPqY,GAAoB,IAAA9d,aAAY,KAClC,UAAK0Z,OACAqE,sBACAzd,KAAK,EAAGG,aACL+c,EAAO/c,EAAOgjB,wBAEjB1J,QAAQ,IAAM8D,GAAc,KAClC,CAACA,IAEEI,GAAY,IAAAje,aAAY,KAC1B,UAAK0Z,OACAgK,0BAA0B,CAAEzmB,MAAO,KACnCqD,KAAK,EAAGG,aACLid,EAAQjd,GACR4c,GAAc,KAEjB3c,MAAM,KACH+E,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,qCACtCgW,GAAwB,GACxB1X,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,EAAMje,SAAS,OAEtFqa,QAAQ,IAAM8D,GAAc,KAClC,CAACA,EAAepY,EAAUmG,IA6B7B,OA3BA,IAAAhL,WAAU,KACN,IAAKwc,EAAY,OACjB,IAAKT,EAAsB,OAC3B,GAAIW,IAAU,EAAAkB,eAAgB,OAC9B,MAAMC,EAAWC,YAAYT,EApEZ,KAqEjB,MAAO,IAAMU,cAAcF,IAC5B,CAAC9B,EAAsBsB,EAAWb,EAAYE,KAEjD,IAAA1c,WAAU,KACNid,GAAc,GACd,UAAKnE,OACAiD,uBACArc,KAAK,EAAGG,YAAamd,EAAYnd,IACjCC,MAAMkc,GACN7C,QAAQ,IAAM8D,GAAc,KAClC,CAACD,EAAaN,EAAOQ,EAAmBD,EAAejB,KAE1D,IAAAhc,WAAU,KACN,GAAK+b,EACL,OAAIW,IAAU,EAAAsB,gBACVf,GAAc,QACdC,UAGJG,KACD,CAACtB,EAAsBmB,EAAmBD,EAAeI,EAAWX,IAEnEX,GAAwBW,GAASA,IAAU,EAAAkB,gBAAkBtB,GACtD,8BAAGA,EAAcI,EAAOtL,GAAO,OAItC,SAACoJ,GAAY,CACTC,OAAQ,KAEA,+BACI,SAACiI,GAA0B,CACvB1X,OAAQA,EACR+Q,0BAA+C9e,IAAzB8e,IAA+D,IAAzBA,EAC5DC,aAAc,IAAMA,OAAa/e,GAAW,OAK5Dyd,WAAY,KAEJ,UAACE,GAAkB,CAAC5P,OAAQA,EAAM,UAC7B+Q,IAAwB,SAAC4G,GAAoB,CAACI,gBAAiBlG,SACtC5f,IAAzB8e,IAAsC,6BACb9e,IAAzB8e,IAA+D,IAAzBA,GAA2C,SAAThU,IACrE,SAACiQ,GAAyB,UCjIhD,GAAiB,IAAyBje,iBAAiB,kBAC3D,GAAU,IAAyBA,iBAAiB,WAE7C,GAAa,UAAO8B,GAAG;oBACfxB,GAAUA,EAAMC,MAAMgE,MAAMgG;;sBAE1BjK,GAAUA,EAAMC,MAAMW,MAAMe;;EAItC,GAAU,UAAOH,GAAsB;iBAClCxB,GAAUA,EAAMC,MAAMU,KAAKsJ,GAAK;aACpCjK,GAAUA,EAAMY;EAGjB+nB,GAAyB,EAClChY,SACA+Q,wBAAuB,EACvBC,mBAMA,MAAMxhB,GAAO,EAAAC,EAAA,KACPoK,GAAW,UAEXoe,GAAQ,QAAgB/X,GAAU,EAAA7C,OAAOzN,UAAUsoB,sBAAsBhY,EAAOF,GAAS,GAAAI,cAOzF2F,EAA0C,CAC5C,CAAExK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,yBAA2BuC,QANhD,KACbiH,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,SAAS,KAChE,UAAKga,OAAOgB,iBAAiB1C,IAAiC+B,QAAQ6C,MAO1E,OACI,SAACT,GAAY,CACTvQ,OAAQA,EACRwQ,SAAU,IAEFO,IACI,SAAC,GAAU,WACP,SAAC,GAAO,CACJ5e,SAAU,OACVH,YAAaxC,EAAKY,cAAc,CAAEC,GAAI,2BAA2B,UACjE,SAAC,GAAc,CACX6gB,OAAK,EACLC,mBAAmB,OACnBpL,QAASA,EACT7G,KAAM,gBACN3D,MAAO,GACPtL,MAAM,UACNE,QAAQ,iBAOhCsgB,UAAYxgB,GAEJ8gB,GACU,IAAVkH,IACI,UAAC,GAAO,CAAChoB,MAAOA,EAAK,cACfT,EAAKY,cAAc,CAAEC,GAAI,mCAAqC,CAAE4nB,UAAQ,UC5DhGE,GAAmB,IAAyBppB,iBAAiB,oBAWtDqpB,GAA6B,EAAGrgB,SAAQgF,OAAMuU,oBACvD,MAAM,OAAEtR,GAAWjI,EACb8B,GAAW,WACVkX,EAAsBQ,IAA2B,IAAA/f,eAA8BS,IAC/Euf,EAAYC,IAAiB,IAAAjgB,WAAkB,IAC/CqgB,EAAMC,IAAW,IAAAtgB,UAA0B,KAC3C4U,EAAKwL,IAAU,IAAApgB,eAA6BS,GAC7Cyf,GAAQ,QAAgBxR,GAAU,EAAA7C,OAAOzN,UAAU+hB,kBAAkBzR,EAAOnI,EAAOiI,QAAS,GAAAI,cAE5F4Q,GAAe,IAAA5c,aACjB,CAAC8Z,EAAWc,KACJd,GAAqB,MAAdA,EAAIna,OACX,UAAK+Z,OAAOgB,iBAAiB1C,IAE7B4C,EACAzJ,OAAOwJ,SAASC,UAIpBuC,GAAwB,GACxB1X,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,EAAMje,SAAS,OAEvF,CAAC+F,EAAUmG,IAGTqY,GAAyB,IAAAjkB,aAAY,KACvC,UAAK0Z,OACAwK,gCACA5jB,KAAK,EAAGG,aACLgF,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQkd,mBAAmB,CAAEvY,SAAQiY,MAAOpjB,KAClEgF,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,OAEvEjd,MAAMkc,IACZ,CAACnX,EAAUmG,EAAQgR,IAEhBiB,GAAgB,IAAA7d,aACjBN,GAAqB+F,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQlM,aAC7E,CAACkM,EAAQnG,IAGPqY,GAAoB,IAAA9d,aAAY,KAClC,UAAK0Z,OACAqE,sBACAzd,KAAK,EAAGG,aACL+c,EAAO/c,EAAO2jB,kBAEjBrK,QAAQ,IAAM8D,GAAc,KAClC,CAACA,IAEED,GAAc,IAAA5d,aACfkZ,IACGiE,EAAwBjE,GACxBzT,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,MAExE,CAAClY,EAAUmG,IAGTqS,GAAY,IAAAje,aAAY,KAC1B,UAAK0Z,OACA2K,mBAAmB,CAAEpnB,MAAO,KAC5BqD,KAAK,EAAGG,aACLid,EAAQjd,GACR4c,GAAc,KAEjB3c,MAAM,KACH+E,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,qCACtCgW,GAAwB,GACxB1X,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ+R,aAAa,EAAMje,SAAS,OAEtFqa,QAAQ,IAAM8D,GAAc,KAClC,CAACA,EAAepY,EAAUmG,IA4C7B,OA1CA,IAAAhL,WAAU,KACN,IAAKwc,EAAY,OACjB,IAAKT,EAAsB,OAC3B,GAAIW,IAAU,EAAAsB,eAAgB,OAC9B,MAAMH,EAAWC,YAAY,KACrBpB,IAAU,EAAAgH,gBACVL,IAEA3G,IAAU,EAAAkB,iBACVyF,IACAhG,MA3FS,KA8FjB,MAAO,IAAMU,cAAcF,IAC5B,CAAC9B,EAAsBsB,EAAWb,EAAY6G,EAAwB3G,KAEzE,IAAA1c,WAAU,KACN,UAAK8Y,OACAiD,uBACArc,KAAK,EAAGG,YAAamd,EAAYnd,IACjCC,MAAMkc,IACZ,CAACgB,EAAahB,KAEjB,IAAAhc,WAAU,KACN,GAAK+b,EAAL,CACA,GAAIW,IAAU,EAAAsB,eAGV,OAFAf,GAAc,QACdC,IAGJ,GAAIR,IAAU,EAAAgH,eAIV,OAHAzG,GAAc,GACdoG,SACAnG,IAIJD,GAAc,GACdoG,IACAhG,GAfiC,GAgBlC,CAACtB,EAAsBW,EAAOQ,EAAmBG,EAAWJ,EAAeoG,EAAwBxe,IAElGkX,GAAwBW,GAASA,IAAU,EAAAkB,gBAAkBtB,GACtD,8BAAGA,EAAcI,EAAOtL,GAAO,OAItC,SAACoJ,GAAY,CACTC,OAAQ,KAEA,+BACI,SAACuI,GAAsB,CACnBhY,OAAQA,EACR+Q,0BAA+C9e,IAAzB8e,IAA+D,IAAzBA,EAC5DC,aAAc,IAAMA,OAAa/e,GAAW,OAK5Dyd,WAAY,KAEJ,UAACE,GAAkB,CAAC5P,OAAQA,EAAM,eACJ/N,IAAzB8e,IAAsC,6BACb9e,IAAzB8e,IAA+D,IAAzBA,GAA2C,SAAThU,IACrE,SAACiQ,GAAyB,IAE7B+D,IAAwB,SAACoH,GAAgB,CAACQ,UAAW9G,UC9JjE+G,GAAY,UAAO/nB,GAAG;;;;;;EAQ7BgoB,GAAqB,IAAyB9pB,iBAAiB,sBAC/D,GAAY,IAAyBA,iBAAiB,UAE/C+pB,GAA+B,EAAG9Y,aAC3C,MAAO6R,EAAMC,IAAW,IAAAtgB,UAAmC,KACpDuC,EAAOglB,IAAY,IAAAvnB,WAAS,IAC5BwnB,EAAWC,IAAgB,IAAAznB,WAAS,GAErC+I,GAAkB,UAElB2e,GAAQ,IAAAta,SAAQ,KAEd,IAAI0I,MAAO6R,cACX,MACC,IAAI7R,MAAO8R,WAAa,GAAGC,WAAWC,SAAS,EAAG,KACnD,KACA,IAAIhS,MAAOiS,UAAUF,WAAWC,SAAS,EAAG,KAC5C,YAEL,IAcH,OAZA,IAAAtkB,WAAU,KACN,UAASwkB,MACJC,WAAW,CAAEjnB,KAAM0mB,GAAS,CAAEre,OAAQN,EAAgBM,SACtDnG,KAAK,EAAGG,YAAaid,EAAQjd,IAC7BC,MAAM,KACEyF,EAAgBM,OAAOoT,SACxB8K,GAAS,KAGhB5K,QAAQ,IAAM8K,GAAa,KACjC,CAACC,EAAO3e,EAAgBM,SAEvBme,GAEI,SAACJ,GAAS,WACN,SAAC,GAAS,CAAC5oB,KAAM,QAKzB+D,GAEI,SAAC6kB,GAAS,WACN,SAAC,IAAgB,CAACvoB,GAAI,sCAM9B,SAACmf,GAAY,CACTC,OAAQ,KACG,SAACc,GAAY,CAACvQ,OAAQA,IAEjC0P,WAAY,KAEJ,SAACE,GAAkB,CAAC5P,OAAQA,EAAM,UAC9B,SAAC6Y,GAAkB,CAAChH,KAAMA,SCnErC6H,GAAe,UAAO7oB,GAAG;eACtBxB,GAAUA,EAAMC,MAAMgE,MAAMK;EAG/BgmB,GAAU,UAAO5oB,CAAC;;aAEjB1B,GAAUA,EAAMC,MAAMW,MAAM2pB;EAG7BC,GAAqB,UAAOhpB,GAAG;;;;EAS/BipB,GAA+B,EACxC/c,OACAiD,SACA6D,cAMA,MAAMrU,GAAO,EAAAC,EAAA,KACPoK,GAAW,UAEX/J,GAAM,QAAgBoQ,GAAU,EAAA7C,OAAOzN,UAAUulB,sBAAsBjV,EAAOF,GAAS,GAAAI,cAEvFqT,GAAqB,QACtBvT,GAAU,EAAA7C,OAAOzN,UAAU8jB,yBAAyBxT,EAAOF,GAC5D,GAAAI,cAGEuT,GAAY,IAAA/U,SAAiB,OAAS6U,IAAsBA,EAAmBG,QAAS,CAACH,IAEzFsG,GAAgB,IAAA3lB,aAAY,KAC9B,GAAa,SAAT2I,IAAoB4W,IAAc7jB,EAClC,OAGJ,MAAM0mB,EAAkB,IAAK3S,EAASmW,UAAU,GAEhD,UAASjiB,OACJ0e,aAAa,CACV3mB,MACAkQ,SACA6D,QAAS2S,EACTE,IAAI,IAEPhiB,KAAK,IAAMmF,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQob,aAAa,CAAEzW,SAAQ6D,QAAS2S,MACzE1hB,MAAM,IAAM+E,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,6BACxD,CAACwB,EAAMiD,EAAQ2T,EAAW7jB,EAAK+T,EAAShK,IAE3C,OACI,8BACK8Z,IAAc9P,EAAQmW,WACnB,SAACN,GAAY,WACT,SAACG,GAAkB,WACf,SAACF,GAAO,CAAC/mB,QAASmnB,EAAa,SAC1BvqB,EAAKY,cAAc,CAAEC,GAAI,qCCpDhD4pB,GAAoB,IAAyBlrB,iBAAiB,kBAC9DmrB,GAAgB,IAAyBnrB,iBAAiB,iBAEnDorB,GAA2B,UAAOtpB,GAAG;;;;;EAiBrCupB,IAVyB,UAAOvpB,GAAG;;;;;;;;EAUP,UAAOA,GAAG;;;eAGnCxB,GAAUA,EAAMC,MAAMgE,MAAMK;yBAClBtE,GAAUA,EAAMC,MAAMW,MAAMic;;;qBAGhC7c,GAAUA,EAAMC,MAAMgE,MAAMgG;cACnCjK,GAAUA,EAAMC,MAAMgE,MAAMgG;GAG9B+gB,GAA2B,EACpCtiB,SACAgF,WAMA,MAAMvN,GAAO,EAAAC,EAAA,KACPoK,GAAW,WACX,MAAExI,EAAK,WAAEipB,EAAU,QAAEC,EAAO,SAAEP,GAAajiB,EAAO8L,SAClD,OAAE7D,GAAWjI,GACZlE,EAAUK,IAAe,IAAA1C,UAAiC,CAC7DgpB,WAAY,EACZC,kBAAmB,GACnBC,oBAAqB,GACrBC,mBAAoB,EACpBC,qBAAsB,KAEnBC,EAAmBC,IAAwB,IAAAtpB,WAAkB,IAC7D+I,IAAmB,IAAA/I,UAA0B,IAAIupB,kBACjDC,EAAgBC,IAAqB,IAAAzpB,WAAS,IAC9C0pB,EAAgBC,IAAqB,IAAA3pB,aACrC4pB,EAAWC,IAAgB,IAAA7pB,YAC5B2E,GAAM,IAAAO,QAAwB6D,GAE9BzK,GAAM,QAAgBoQ,GAAU,EAAA7C,OAAOzN,UAAUulB,sBAAsBjV,EAAOF,GAAS,GAAAI,cAEvFgV,GAAQ,QAAgBlV,GAAU,EAAA7C,OAAOzN,UAAUylB,wBAAwBnV,EAAOF,GAAS,GAAAI,cAK3Fkb,GAAc,IAAAlnB,aAChB,IAAMyF,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,2BAC5C,CAAC1B,IAGC0hB,GAAa,IAAA3c,SACf,MAAQvN,GAASipB,GAAczmB,EAAS8mB,oBAAsBL,GAC9D,CAACjpB,EAAOipB,EAAYzmB,EAAS8mB,qBAG3Ba,GAAuB,IAAA5c,SAAQ,IACzB2b,GAAWP,GAAsB,SAATjd,EACjC,CAACwd,EAASP,EAAUjd,IAEjB0e,GAAsB,IAAArnB,aAAY,KAC/BtE,IAAO0rB,IACPD,GAKLT,GAAqB,GACrB,UAAK/iB,OACA2jB,eAAe,CAAE5rB,MAAKkQ,WACtBlL,MAAMwmB,GACNnN,QAAQ,IAAM2M,GAAqB,KARpCjhB,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,4CAS3C,CAAC1B,EAAUmG,EAAQsb,EAAaxrB,EAAKyrB,EAAYC,IAE9CG,GAAgB,IAAAvnB,aACjBsV,IACQ5Z,IAAO0rB,IAEZV,GAAqB,GACrB,UAAK/iB,OACA6jB,gBACG,CACI9rB,MACAkQ,SACA0J,SAEJvT,EAAIkC,QAAQwC,QAEf/F,MAAMwmB,GACNnN,QAAQ,IAAM2M,GAAqB,MAE5C,CAAChrB,EAAKkQ,EAAQsb,EAAaE,IAGzBK,GAAiB,IAAAznB,aAAY,KAClB,SAAT2I,GAAoBjN,IACxBgrB,GAAqB,GACrB,UAAK/iB,OACA+jB,oBAAoB,CAAEhsB,MAAKkQ,UAAU7J,EAAIkC,QAAQwC,QACjDnG,KAAMb,IACHK,EAAYL,EAASgB,UAExBC,MAAOoZ,IAASA,EAAID,SAAWqN,KAC/BnN,QAAQ,IAAM2M,GAAqB,MACzC,CAAChrB,EAAKwrB,EAAatb,EAAQjD,IAExBgf,EAAsB,CAACnqB,EAAeoqB,KACnClsB,GACL,UAAKiI,OACAkkB,4BAA4B,CAAEnsB,MAAKkQ,SAAQpO,QAAOoqB,OAAM3qB,MAAO,GAAK8E,EAAIkC,QAAQwC,QAChFnG,KAAMb,IACHwnB,EAAa,IACNxnB,EAASgB,OACZ2L,KAAM,IAAI3M,EAASgB,OAAO2L,MAC1B0b,IAAKroB,EAASgB,OAAOqnB,QAG5BpnB,MAAOoZ,IACIA,EAAID,SAAWqN,IAI7B5F,GAAqB,IAAAthB,aAAY,KAC9BtE,IACLgrB,GAAqB,GACrB,UAAK/iB,OACA4d,UAA8B,CAAE7lB,MAAKkQ,WACrCtL,KAAMb,IACHgG,GAAS,IAAAsM,qBAAoBnG,EAAQnM,EAASgB,WAEjDC,MAAOoZ,IACIA,EAAID,SAAWqN,GAE1BnN,QAAQ,IAAM2M,GAAqB,MACzC,CAACjhB,EAAUyhB,EAAaxrB,EAAKkQ,IA4BhC,OA1BA,IAAAhL,WAAU,KACN,MAAMmnB,EAAMhmB,EAAIkC,QAChB,MAAO,KACH8jB,EAAIC,UAET,KAEH,IAAApnB,WAAU,KACN6mB,KACD,CAACA,KAEJ,IAAA7mB,WAAU,KACN,IAAKiR,MAAMC,QAAQkP,GAAQ,OAC3B,MAAMgB,EAAShB,EAAMiB,IAAI,GACpBD,GAAWtmB,GAEZsmB,EAAOlR,OAAOpV,MAAQA,GAAOsmB,EAAOpW,SAAWA,IAC7B,6BAAdoW,EAAOE,IACPuF,IAEc,kBAAdzF,EAAOE,IACPZ,MAGT,CAACN,EAAOyG,EAAgB7b,EAAQlQ,EAAK4lB,KAGpC,SAAC,KAAU,CACPwB,MAAO,MAEH,SAAYnf,EAAOiI,SACtB,UACD,UAACma,GAAwB,YACrB,SAACF,GAAiB,CACd5oB,MAAOA,EACPipB,WAAYA,EACZG,kBAAmB5mB,EAAS4mB,kBAC5BC,oBAAqB7mB,EAAS6mB,oBAC9BF,UAAW3mB,EAAS2mB,UACpBG,mBAAoB9mB,GAAU8mB,mBAC9BC,qBAAsB/mB,GAAU+mB,qBAChCZ,SAAUO,GAAWP,EACrBqC,qBAvIa,IAA8B,IAAvBxoB,EAAS2mB,UAAkBiB,IAAwBE,EAAc,GAwIrFW,uBAvIe,IAA8B,IAAvBzoB,EAAS2mB,UAAkBiB,IAAwBE,EAAc,GAwIvFY,qBAAuB3qB,IACnBypB,EAAa,CACThqB,MAAO,EACP2qB,KAAM,EACNxb,KAAM,GACN0b,IAAK,IAETf,EAAkBvpB,GAClBmqB,EAAoBnqB,GACpBqpB,GAAkB,MAGzBV,GAAWP,IACR,SAACI,GAAyB,UACrB5qB,EAAKY,cAAc,CAAEC,GAAI,gCAGjCkqB,IAAYP,IACT,SAACF,GAA4B,CAAC/c,KAAMA,EAAMiD,OAAQjI,EAAOiI,OAAQ6D,QAAS9L,EAAO8L,UAE3E,SAAT9G,IAAmB,SAACsW,GAAgB,CAACrT,OAAQjI,EAAOiI,OAAQjQ,KAAMgI,EAAOhI,KAAMgN,KAAMA,IACrF8d,IAAqB,SAAC1G,GAAe,KACtC,SAAC+F,GAAa,CACVnnB,KAAMioB,EACNI,UAAWA,EACXlpB,MACuB,IAAnBgpB,EACM1rB,EAAKY,cAAc,CAAEC,GAAI,uBACzBb,EAAKY,cAAc,CAAEC,GAAI,wBAEnCyJ,QAASmhB,EACTxhB,QAAS,KACL4hB,EAAa,CACThqB,MAAO,EACP2qB,KAAM,EACNxb,KAAM,GACN0b,IAAK,KAGbH,oBAAsBC,IAClBD,EAAoBb,GAAkB,EAAGc,YC1O3DQ,GAAoB,IAAyBztB,iBAAiB,qBAC9D0tB,GAA0B,IAAyB1tB,iBAAiB,2BACpE,GAAgB,IAAyBA,iBAAiB,iBAC1D,GAAgB,IAAyBA,iBAAiB,cAE1D2tB,GAAmB,UAAO7rB,GAA8B;;;;;MAKvDxB,GAAUA,EAAMstB,aAAe;;EAUzBC,GAA8B,EAAG7kB,SAAQwM,UAASxH,WAC3D,MAAMvN,GAAO,EAAAC,EAAA,KACPoK,GAAW,WACX,OAAEmG,EAAQ6D,QAAS+Q,GAAkB7c,GACpClE,EAAUK,IAAe,IAAA1C,UAAoC,CAChEqrB,cAAe,GACfC,gBAAiB,EACjBC,cAAe,EACfC,oBAAqB,MAElBhC,EAAgBC,IAAqB,IAAAzpB,WAAS,IAC9C0b,EAAWC,IAAgB,IAAA3b,WAAS,IACpC0pB,EAAgBC,IAAqB,IAAA3pB,aACrC4pB,EAAWC,IAAgB,IAAA7pB,aAE3B+I,IAAmB,IAAA/I,UAA0B,IAAIupB,iBAClD5kB,GAAM,IAAAO,QAAwB6D,GAE9B+I,GAAQ,QAAe,EAAAjG,OAAOzN,UAAU2T,YAAa,GAAAnD,cAErDtQ,GAAM,QAAgBoQ,GAAU,EAAA7C,OAAOzN,UAAUulB,sBAAsBjV,EAAOnI,EAAOiI,QAAS,GAAAI,cAE9FqT,GAAqB,QACtBvT,GAAU,EAAA7C,OAAOzN,UAAU8jB,yBAAyBxT,EAAOF,GAC5D,GAAAI,cAGEgV,GAAQ,QACTlV,GAAU,EAAA7C,OAAOzN,UAAUylB,wBAAwBnV,EAAOnI,EAAOiI,QAClE,GAAAI,cAGElD,GAAW,IAAA9I,aACb,CAAC4L,EAAgB6D,KACbhK,GAAS,IAAAsM,qBAAoBnG,EAAQ6D,KAEzC,CAAChK,IAOCgc,EAAmBvS,IACrBzJ,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,kBACpCjc,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,WACzCzJ,EACI,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CACtCxB,OAAQjI,EAAOiI,OACfjQ,KAAM,EAAAwN,YAAYK,gBAKxB0d,GAAc,IAAAlnB,aAChB,IAAMyF,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO,2BAC5C,CAAC1B,IAGCgiB,GAAiB,IAAAznB,aAClB4L,IACgB,SAATjD,GAAoBjN,IACxBqd,GAAa,GACb,UAAKpV,OACAklB,uBAAuB,CAAEntB,MAAKkQ,UAAU7J,EAAIkC,QAAQwC,QACpDnG,KAAMb,IACHK,EAAYL,EAASgB,UAExBC,MAAOoZ,IACIA,EAAID,SAAWqN,GAE1BnN,QAAQ,IAAMhB,GAAa,MAEpC,CAACmO,EAAaxrB,EAAKiN,IAGjBmgB,GAAkB,IAAA9oB,aAAY,KAC3BtE,IACLqd,GAAa,GACb,UAAKpV,OACA4d,UAAiC,CAAE7lB,MAAKkQ,UAAU7J,EAAIkC,QAAQwC,QAC9DnG,KAAMb,IACHqJ,EAAS8C,EAAQnM,EAASgB,OAAOgP,WAEpC/O,MAAOoZ,IACIA,EAAID,SAAWqN,GAE1BnN,QAAQ,IAAMhB,GAAa,MACjC,CAACnN,EAAQsb,EAAaxrB,EAAKoN,IAcxBigB,EAAoB,KACtB,GAAKrtB,GACD8kB,EAAc2F,QAAS,CACvB,MAAM6C,EAAe,IAAKxI,EAAeoF,UAAU,GAEnD,UAAKjiB,OACA0e,aAAoC,CACjC3mB,MACAkQ,SACA6D,QAASuZ,IAEZtoB,MAAM,KACHwmB,KAEZ,GAGE+B,EAA0BzrB,IA7BV,CAACA,IACN,SAATmL,GAAoBjN,IACxBqd,GAAa,GACb,UAAKpV,OACAulB,mBAAmB,CAAExtB,MAAK8B,QAAO2rB,MAAO3I,EAAc2I,MAAQ,EAAI,EAAGvd,UAAU7J,EAAIkC,QAAQwC,QAC3FnG,KAAK,KACFmnB,EAAe9jB,EAAOiI,UAEzBlL,MAAOoZ,IAASA,EAAID,SAAWqN,GAC/BnN,QAAQ,IAAMhB,GAAa,MAqBhCwO,CAAc/pB,IAmBZmqB,EAAsB,CAACnqB,EAAeoqB,KACnClsB,GACL,UAAKiI,OACAylB,+BAA+B,CAAE1tB,MAAKkQ,SAAQpO,QAAOoqB,OAAM3qB,MAAO,GAAK8E,EAAIkC,QAAQwC,QACnFnG,KAAMb,IACHwnB,EAAa,IACNxnB,EAASgB,OACZ2L,KAAM,IAAI3M,EAASgB,OAAO2L,MAC1B0b,IAAKroB,EAASgB,OAAOqnB,QAG5BpnB,MAAOoZ,IACIA,EAAID,SAAWqN,IAI7B3H,GAAY,IAAA/U,SAAQ,IAAM6U,GAAsBA,EAAmBG,OAAQ,CAACH,KAElF,IAAAze,WAAU,KACN6mB,EAAe9jB,EAAOiI,SACvB,CAAC6b,EAAgB9jB,EAAOiI,UAE3B,IAAAhL,WAAU,KACN,IAAKiR,MAAMC,QAAQkP,GAAQ,OAC3B,MAAMgB,EAAShB,EAAMiB,IAAI,GACpBD,GACAtmB,GAEDsmB,EAAOlR,OAAOpV,MAAQA,GAAOsmB,EAAOpW,SAAWjI,EAAOiI,SACpC,iCAAdoW,EAAOE,IACPuF,EAAe9jB,EAAOiI,QAER,kBAAdoW,EAAOE,IACP4G,MAGT,CAAC9H,EAAOtlB,EAAKiI,EAAOiI,OAAQkd,EAAiBrB,IAEhD,MAAMnY,GAAQ,IAAA9E,SAAQ,KAClB,IAAKqH,MAAMC,QAAQ0O,EAAcoB,KAAM,MAAO,GAE9C,MAAMW,EAAoB,GAO1B,OANA/B,EAAcoB,IAAIne,QAAS4W,IACnBA,EAAGxJ,MACH0R,EAAGC,KAAKnI,EAAGxJ,QAIZ0R,GACR,CAAC/B,IAUJ,OARA,IAAA5f,WAAU,KACDsO,GAAkB,SAATvG,GACV,kBAAauG,QAAQ5O,KAAMb,IACvBgG,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,MAAOzP,EAASgB,aAGlE,CAACkI,EAAMuG,EAAOzJ,IAEJ,SAATkD,GACIwH,GAEI,SAACmY,GAAgB,CAACC,aAAa,EAAI,UAC/B,SAACF,GAAuB,CACpBnZ,MAAOA,EACPtD,OAAQA,EACR6D,QAAS9L,EAAO8L,QAChBmT,gBAAiB9Z,EACjB+Z,gBAxKKpT,IACrBhK,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqF,oBAAoB,IAAKmD,MAwKvC6K,aAAe7K,GAAY3G,EAAS8C,EAAQ6D,GAC5CU,QAASA,OAQzB,SAAC,KAAU,CACP2S,MAAO,MAEH,SAAYnf,EAAOiI,SACtB,UACD,UAAC0c,GAAgB,YACb,SAAC,GAAa,CAAChZ,MAAOA,EAAOgC,gBAAiB,GAAE,SAC1C3S,IAEM,SAACypB,GAAiB,CACdnrB,MAAOwC,EAASkpB,eAAiB,EACjCtlB,OAAQmd,EAAcoB,KAAO,GAC7B6G,cAAehpB,EAASgpB,cACxBY,oBAAqB5pB,EAASmpB,oBAAoBrqB,OAAS,EAC3D+qB,eAAgB3lB,EAAO8L,QAAQ0W,UAAW,EAC1CP,SAAUjiB,EAAO8L,QAAQmW,WAAY,EACrCjnB,KAAMgF,EAAO8L,QAAQ9Q,OAAQ,EAC7B4qB,UAAW5lB,EAAO8L,QAAQ8Z,YAAa,EACvCC,iBAAkB7lB,EAAO8L,QAAQ+Z,mBAAoB,EACrDjK,UAAWA,EACXkK,gBAAkBxG,GAAUA,EAAMhnB,IAAM0C,EAAKskB,EAAMhnB,IACnD8sB,kBAAmBA,EACnBE,uBAAwBA,EACxBpC,kBAAoBrpB,IAChBupB,EAAkBvpB,GAClBmqB,EAAoBnqB,GACpBqpB,GAAkB,QAOrCrG,EAAc7hB,OACX,SAACihB,GAAqB,CAClBC,YAjIU/hB,IAC1B,IAAKpC,EAAK,OAEV,MAAMguB,EAAa,IACZlJ,EACHoB,IAAK,IAAKpB,EAAcoB,KAAO,GAAK,CAAE9jB,WAG1C,UAAK6F,OACAgmB,mBAAmB,CAAEjuB,MAAKkQ,SAAQzE,MAAOrJ,IACzCwC,KAAK,KACFmF,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQob,aAAa,CAAEzW,SAAQ6D,QAASia,OAEjEhpB,MAAMwmB,IAqHK1a,YAAapR,EAAKY,cAAc,CAAEC,GAAI,wBAG7CsjB,IACG,SAACN,GAAgB,CACbrT,OAAQjI,EAAOiI,OACfjQ,KAAMgI,EAAOhI,KACbujB,oBAAqB,CACjBM,SAAUD,GAEd5W,KAAMA,EACNqE,iBAAkB,KACTkC,EAUDuS,EAAgBvS,IAThB6J,GAAa,GACb,kBACK7J,QACA5O,KAAMb,IACHgG,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,MAAOzP,EAASgB,UACzDghB,EAAgBhiB,EAASgB,UAE5BsZ,QAAQ,IAAMhB,GAAa,QAO/CD,IAAa,SAACiH,GAAe,KAC9B,SAAC,GAAa,CACVphB,KAAMioB,EACNI,UAAWA,EACXlpB,MAAO0iB,EAAcoB,MAAMkF,GAAkB,IAAIhpB,OAAS,GAC1D4H,QAASmhB,EACTc,oBAAsBC,IAClBD,EAAoBb,GAAkB,EAAGc,IAE7CviB,QAAS,KACL4hB,EAAa,CACThqB,MAAO,EACP2qB,KAAM,EACNxb,KAAM,GACN0b,IAAK,aC1U3B8B,GAAoB,IAAyBjvB,iBAAiB,qBAQvDkvB,GAA8B,EAAGlmB,SAAQgF,WAClD,MAAMlD,GAAW,WACX,OAAEmG,EAAM,KAAEjQ,EAAI,QAAE8T,GAAY9L,EAE5BmmB,GAAc,QAAe,EAAAC,YAAYvuB,UAAU+K,KAsBzD,OApBA,IAAA3F,WAAU,KACN6E,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,KACzD,KACH9K,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,OAErE,CAAC3E,EAAQnG,KAEZ,IAAA7E,WAAU,KACO,SAAT+H,IACAlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,kBACpCjc,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CAAExB,SAAQjQ,YAElE,CAAC8J,EAAUkD,EAAMhN,EAAMiQ,KAE1B,IAAAhL,WAAU,KACO,SAAT+H,GAA4B,YAATA,GACnBlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,mBAEzC,CAAC/Y,EAAMlD,KAGN,SAACmkB,GAAiB,CACdE,YAAaA,EACbE,YAAava,EAAQua,YACrBC,YAAaxa,EAAQya,WACrB1oB,IAAKiO,EAAQjO,OCvCnB2oB,GAAgB,IAAyBxvB,iBAAiB,iBAQnDyvB,GAA0B,EAAGzmB,SAAQgF,WAC9C,MAAMlD,GAAW,WACX,OAAEmG,EAAM,KAAEjQ,EAAI,QAAE8T,GAAY9L,EAE5BmmB,GAAc,QAAe,EAAAC,YAAYvuB,UAAU+K,KAsBzD,OApBA,IAAA3F,WAAU,KACN6E,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,KACzD,KACH9K,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,OAErE,CAAC3E,EAAQnG,KAEZ,IAAA7E,WAAU,KACO,SAAT+H,IACAlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,kBACpCjc,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CAAExB,SAAQjQ,YAElE,CAAC8J,EAAUkD,EAAMhN,EAAMiQ,KAE1B,IAAAhL,WAAU,KACO,SAAT+H,GAA4B,YAATA,GACnBlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,mBAEzC,CAAC/Y,EAAMlD,KAGN,SAAC0kB,GAAa,CACVL,YAAaA,EACb/rB,SAAU0R,EAAQ1R,SAClBssB,UAAW5a,EAAQ4a,UACnBha,QAASZ,EAAQY,QACjB4Z,YAAaxa,EAAQya,WACrB1oB,IAAKiO,EAAQjO,OCzCnB8oB,GAAc,IAAyB3vB,iBAAiB,eAQjD4vB,GAAwB,EAAG5mB,SAAQgF,WAC5C,MAAMlD,GAAW,WACX,OAAEmG,EAAM,KAAEjQ,EAAI,QAAE8T,GAAY9L,EAsBlC,OApBA,IAAA/C,WAAU,KACN6E,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,KACzD,KACH9K,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,SAAQ2E,SAAS,OAErE,CAAC3E,EAAQnG,KAEZ,IAAA7E,WAAU,KACO,SAAT+H,IACAlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,kBACpCjc,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CAAExB,SAAQjQ,YAElE,CAAC8J,EAAUkD,EAAMhN,EAAMiQ,KAE1B,IAAAhL,WAAU,KACO,SAAT+H,GAA4B,YAATA,GACnBlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,mBAEzC,CAAC/Y,EAAMlD,KAEH,SAAC6kB,GAAW,CAACtc,gBAAiByB,EAAQzB,mBCpCpCwc,GAA4B,EACrC5e,SACA6e,oBAKA,MAAMC,GAAO,IAAAlgB,SAAQ,IAAM,oBAAoBigB,KAAiB7e,IAAU,CAAC6e,EAAe7e,IAO1F,OALA,IAAAhL,WAAU,KACD6pB,GACLE,EAAEC,MAAMC,QAAQJ,EAAe,CAAEK,SAAUJ,KAC5C,CAACD,EAAeC,KAEZ,gBAAKzuB,GAAIyuB,KCfPK,GAAoB,CAACC,EAA0CC,KACxE,MAAM3nB,EAA6B,GAUnC,OATA0nB,EACKE,OAAQ9e,GAASA,EAAK+e,WACtB1nB,QAAS2I,IACN,MAAMtE,EAASmjB,EAAQrnB,KAAMyW,GAAOA,EAAG1e,OAASyQ,EAAKzQ,MACjDmM,GACAxE,EAAMkf,KAAK1a,KAIhBxE,GCGL,GAAY,IAAyB3I,iBAAiB,UAEtDywB,GAAc,IAAyBzwB,iBAAiB,eACxD,GAAS,IAAyBA,iBAAiB,UAI5C0wB,IAFU,UAAO5uB,GAAG,GAEF,UAAOA,GAAG;;;;;;;WAO7BxB,GAAUA,EAAMC,MAAMgE,MAAMK;GAG3B+rB,GAAoC,EAC7C5vB,MACAuB,QACAsuB,iBACAC,qBACAC,qBACAC,gBACAC,oBACAX,mBAAmB,GACnBY,oBACAC,oBACAC,yBACAnjB,WAEA,MAAMlD,GAAW,WACVmf,EAAWC,IAAgB,IAAAznB,WAAkB,IAC7C2uB,EAAgBC,IAAqB,IAAA5uB,UAAmD,KACxF6uB,EAAiBC,IAAsB,IAAA9uB,UAA8B,IAEtE8L,GAAa,IAAAsB,SAAQ,IAAM,EAAAvB,OAAOC,WAAW,EAAAC,YAAYgjB,sBAAuB,KAEtF,IAAAvrB,WAAU,UACM/C,IAARnC,GAAiD,IAA5BsvB,EAAiBzsB,QAA2C,IAA3B0tB,EAAgB1tB,SACtEsmB,GAAa,GACb,UAASuH,WACJ7lB,IAAI7K,EAAK,EAAA2wB,OAAOC,MAChBhsB,KAAMb,IACHysB,EAAmBzsB,EAASgB,OAAO8rB,OACnCP,EAAkBvsB,EAASgB,OAAO2L,QAErC2N,QAAQ,IAAM8K,GAAa,MAErC,CAACnpB,EAAKsvB,EAAkBiB,KAE3B,IAAArrB,WAAU,KACDlF,GACDwwB,EAAmB,KAExB,CAACxwB,KAEJ,IAAAkF,WAAU,KACO,SAAT+H,GAA4B,YAATA,GACnBlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,mBAEzC,CAAC/Y,EAAMlD,IAEV,MAAMwlB,GAAU,IAAAzgB,SACZ,IAAMugB,GAAkBC,EAAkBiB,GAC1C,CAACjB,EAAkBiB,IAGvB,OAAgC,IAA5BjB,EAAiBzsB,QAAiBqmB,GAAsB,SAATjc,EAY5Cic,GACH,SAACyG,GAAe,WACZ,SAAC,GAAM,OAGX,8BACMzG,GAAuC,IAA1BmH,EAAextB,QAAyB,SAAToK,GAM1C,SAACyiB,GAAW,CACRoB,KAAMT,EACNd,QAASA,EACThuB,MAAOA,EACPsuB,eAAgBA,EAChBC,mBAAoBA,EACpBC,mBAAoBA,EACpBC,cAAeA,EACfC,kBAAmBA,EACnBC,kBAAmBA,EACnBZ,iBAAkBA,EAClBa,kBAAmBA,EACnBC,uBAAwBA,KAjB5B,UAACT,GAAe,YACZ,gBAAKphB,IAAK,sBAAsB,EAAAd,YAAYgjB,2BAA4BnuB,IAAI,MAC5E,SAAC,IAAgB,CAAC/B,GAAI,uCAnB9B,+BACI,UAACovB,GAAe,YACZ,gBAAKphB,IAAK,sBAAsB,EAAAd,YAAYgjB,2BAA4BnuB,IAAI,MAC5E,SAAC,IAAgB,CAAC/B,GAAIiN,EAAW/B,SACjC,SAAC,GAAS,CAACA,MAAM,0BCvE/B,GAAY,IAAyBxM,iBAAiB,UACtD,GAAc,IAAyBA,iBAAiB,eACxD,GAAS,IAAyBA,iBAAiB,UAI5C,IAFU,UAAO8B,GAAG,GAEF,UAAOA,GAAG;;;;;;;WAO7BxB,GAAUA,EAAMC,MAAMgE,MAAMK;GAG3BktB,GAA+B,EACxC/wB,MACAuB,QACAsuB,iBACAC,qBACAC,qBACAC,gBACAC,oBACAX,mBAAmB,GACnBY,oBACAC,oBACAC,yBACAnjB,WAEA,MAAMlD,GAAW,WACVmf,EAAWC,IAAgB,IAAAznB,WAAkB,IAC7C2uB,EAAgBC,IAAqB,IAAA5uB,UAAmD,KACxF6uB,EAAiBC,IAAsB,IAAA9uB,UAA8B,KACrEsvB,EAAgBC,IAAqB,IAAAvvB,UAA+B,CAAEwvB,MAAO,YAAajxB,KAAM,aAChGkxB,EAAgBC,IAAqB,IAAA1vB,eAAqCS,IAC1EkvB,EAAsBC,IAA2B,IAAA5vB,UAAiB,IAEnE8L,GAAa,IAAAsB,SAAQ,IAAM,EAAAvB,OAAOC,WAAW,EAAAC,YAAY8jB,iBAAkB,IAC3EC,GAAe,IAAA1iB,SAAmB,IACb,WAAnBqiB,EACO,CAAC,CAAEztB,KAAM,CAAC2tB,KAGd,GACR,CAACF,EAAgBE,IACdI,GAAa,IAAA3iB,SAAkB,IACV,QAAnBqiB,EACO,CAACE,GAGL,GACR,CAACF,EAAgBE,KAEd,aAAEK,IAAiB,SAAaF,EAAcC,GAE9CE,GAAkB,IAAArtB,aAAY,KAC3BtE,IAILmpB,GAAa,GACb,UAASuH,WACJ7lB,IAAI7K,EAAK,EAAA2wB,OAAOC,MAChBhsB,KAAMb,IACHysB,EAAmBzsB,EAASgB,OAAO8rB,OACnCP,EAAkBvsB,EAASgB,OAAO2L,MAClCugB,EAAkBltB,EAASgB,OAAO6sB,MAClCR,EAAkBrtB,EAASgB,OAAO2rB,WAAWS,gBAC7CG,EAAwBvtB,EAASgB,OAAO2rB,WAAWW,wBAEtDhT,QAAQ,IAAM8K,GAAa,MACjC,CAACnpB,KAEJ,IAAAkF,WAAU,UACM/C,IAARnC,GAAiD,IAA5BsvB,EAAiBzsB,QAA2C,IAA3B0tB,EAAgB1tB,QACtE8uB,KAEL,CAAC3xB,EAAKsvB,EAAkBiB,EAAiBoB,KAE5C,IAAAzsB,WAAU,KACDwsB,GAILC,KACD,CAACD,EAAcC,KAElB,IAAAzsB,WAAU,KACDlF,GACDwwB,EAAmB,KAExB,CAACxwB,KAEJ,IAAAkF,WAAU,KACO,SAAT+H,GAA4B,YAATA,GACnBlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,mBAEzC,CAAC/Y,EAAMlD,IAEV,MAAMwlB,GAAU,IAAAzgB,SACZ,IAAMugB,GAAkBC,EAAkBiB,GAC1C,CAACjB,EAAkBiB,IAGvB,OAAgC,IAA5BjB,EAAiBzsB,QAAiBqmB,GAAsB,SAATjc,EAY5Cic,GACH,SAAC,GAAe,WACZ,SAAC,GAAM,OAGX,8BACMA,GAAuC,IAA1BmH,EAAextB,QAAyB,SAAToK,GAM1C,SAAC,GAAW,CACR6jB,KAAMT,EACNd,QAASA,EACThuB,MAAOA,EACPsuB,eAAgBA,EAChBC,mBAAoBA,EACpBC,mBAAoBA,EACpBC,cAAeA,EACfC,kBAAmBA,EACnBC,kBAAmBA,EACnBZ,iBAAkBA,EAClBa,kBAAmBA,EACnBC,uBAAwBA,EACxByB,sBAAuBb,EAAeE,MACtCY,qBAAsBd,EAAe/wB,QAnBzC,UAAC,GAAe,YACZ,gBAAKsO,IAAK,sBAAsB,EAAAd,YAAY8jB,sBAAuBjvB,IAAI,MACvE,SAAC,IAAgB,CAAC/B,GAAI,uCAnB9B,+BACI,UAAC,GAAe,YACZ,gBAAKgO,IAAK,sBAAsB,EAAAd,YAAY8jB,sBAAuBjvB,IAAI,MACvE,SAAC,IAAgB,CAAC/B,GAAIiN,EAAW/B,SACjC,SAAC,GAAS,CAACA,MAAM,0BC3H/BsmB,GAAoB,UAAOhxB,GAAG;;;;;;aAMtBxB,GAAUA,EAAMC,MAAMW,MAAMic;EAG7B4V,GAAuB,EAAGxsB,WAAUvF,WAC7C,MAAMgyB,GAAO,QAAgB7hB,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAOnQ,IAClEP,GAAO,EAAAC,EAAA,KAEb,OAAIsyB,IAASA,EAAKG,YAEV,SAACL,GAAiB,UACbryB,EAAKY,cAAc,CAAEC,GAAI,0BAA4B,CAAEkL,MAAO,UAAWwmB,EAAOA,EAAKxmB,MAAQ,QAKnG,8BAAGjG,KCwBD6sB,GAAqB,UAAOtxB,GAAG;;;;EAM/BuxB,GAAgB,EACzBrqB,SACA8I,QACA0D,WAAU,EACVxH,OAAO,OACP4X,iBACA0N,yBACA/Q,gBACAjb,aAWA,MAAM,KAAEtG,GAASgI,EAEjB,OAAI,IAAAuqB,+BAA8BvqB,IACvB,SAAC0O,GAA6B,CAAC1O,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,KACvE,IAAAwlB,gCAA+BxqB,IAC/B,SAAC+O,GAA8B,CAAC/O,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,KACxE,IAAAylB,8BAA6BzqB,IAEhC,SAACoqB,GAAkB,WACf,SAACL,GAAoB,CAAC/xB,KAAM,mBAAkB,UAC1C,SAAC+oB,GAA4B,CAAC9Y,OAAQjI,EAAOiI,cAIlD,IAAAyiB,mCAAkC1qB,IAClC,SAACuM,GAAiC,CAACvM,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,KAC3E,IAAA2lB,8BAA6B3qB,IAC7B,SAAC2P,GAA4B,CAAC3P,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,KACtE,IAAA4lB,+BAA8B5qB,IAC9B,SAACoQ,GAA6B,CAACpQ,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,EAAM8D,MAAOA,GAAS,OAC7F,IAAA+hB,8BAA6B7qB,IAC7B,SAACoT,GAA4B,CAACpT,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,EAAM1G,OAAQA,KACpF,IAAAwsB,6BAA4B9qB,IAC5B,SAAC8R,GAA2B,CAAC9R,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,KACrE,IAAA+lB,sCAAqC/qB,IAExC,UAACoqB,GAAkB,YACf,SAACtgB,GAAW,CAAC7B,OAAQjI,EAAOiI,UAC5B,SAAC0f,GAAiC,IAAK3nB,EAAO8L,QAAS7D,OAAQjI,EAAOiI,OAAQjD,KAAMA,QAGrF,IAAAgmB,iCAAgChrB,IAEnC,UAACoqB,GAAkB,YACf,SAACtgB,GAAW,CAAC7B,OAAQjI,EAAOiI,UAC5B,SAAC6gB,GAA4B,IAAK9oB,EAAO8L,QAAS7D,OAAQjI,EAAOiI,OAAQjD,KAAMA,QAGhF,IAAA6Y,2BAA0B7d,EAAwB,sBAAhBA,EAAOhI,OAE5C,UAACoyB,GAAkB,WACL,SAATplB,GACG,SAACoE,GAAgB,CAACpR,KAAMgI,EAAOhI,KAAMiQ,OAAQjI,EAAOiI,UAEpD,SAAC6B,GAAW,CAAC7B,OAAQjI,EAAOiI,UAEhC,SAAC0U,GAAyB,CACtB3c,OAAQA,EACRwM,QAASA,EACTxH,KAAMA,EACN4X,eAAgBA,QAIrB,IAAAqO,0BAAyBjrB,IAE5B,UAACoqB,GAAkB,WACL,SAATplB,GACG,SAACoE,GAAgB,CAACpR,KAAMgI,EAAOhI,KAAMiQ,OAAQjI,EAAOiI,UAEpD,SAAC6B,GAAW,CAAC7B,OAAQjI,EAAOiI,UAEhC,SAACqa,GAAwB,CAACtiB,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,QAGnE,IAAAkmB,6BAA4BlrB,IAE/B,UAACoqB,GAAkB,WACL,SAATplB,GACG,SAACoE,GAAgB,CAACpR,KAAMgI,EAAOhI,KAAMiQ,OAAQjI,EAAOiI,UAEpD,SAAC6B,GAAW,CAAC7B,OAAQjI,EAAOiI,UAEhC,SAAC4c,GAA2B,CAAC7kB,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,QAGtE,IAAAmmB,gCAA+BnrB,IAElC,SAACoqB,GAAkB,WACf,SAACL,GAAoB,CAAC/xB,KAAM,aAAY,UACpC,SAACshB,GAA8B,CAC3BtZ,OAAQA,EACRwM,QAASA,EACTxH,KAAMA,EACNuU,cAAeA,SAKxB,IAAA6R,gCAA+BprB,IAElC,SAACoqB,GAAkB,WACf,SAACL,GAAoB,CAAC/xB,KAAM,aAAY,UACpC,SAAC6nB,GAA8B,CAC3B7f,OAAQA,EACRwM,QAASA,EACTxH,KAAMA,EACNuU,cAAeA,SAKxB,IAAA8R,4BAA2BrrB,IAE9B,SAACoqB,GAAkB,WACf,SAACL,GAAoB,CAAC/xB,KAAM,aAAY,UACpC,SAACqoB,GAA0B,CACvBrgB,OAAQA,EACRwM,QAASA,EACTxH,KAAMA,EACNuU,cAAeA,SAKxB,IAAA+R,6BAA4BtrB,IAE/B,SAACoqB,GAAkB,WACf,SAAClE,GAA2B,CAAClmB,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,OAGtE,IAAAumB,uBAAsBvrB,IAEzB,SAACoqB,GAAkB,WACf,SAACxD,GAAqB,CAAC5mB,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,OAGhE,IAAAwmB,yBAAwBxrB,IAE3B,SAACoqB,GAAkB,WACf,SAAC3D,GAAuB,CAACzmB,OAAQA,EAAQwM,QAASA,EAASxH,KAAMA,OAGlE,IAAAymB,2BAA0BzrB,IAAWA,EAAO8L,QAAQgb,eAEvD,SAACsD,GAAkB,WACf,SAACvD,GAAyB,CACtB5e,OAAQjI,EAAOiI,OACfjQ,KAAMgI,EAAOhI,KACb8uB,cAAe9mB,EAAO8L,QAAQgb,kBAMnCwD,GAAyB,8BAAGA,EAAuBtyB,MAAY,0DAA0BA,EAAI,QC5N/F0zB,GAAiB,UAAO5yB,GAAwE;;;eAG7FxB,GAAUA,EAAMq0B;wBACPr0B,GAAUA,EAAM+S;sBAClB/S,GAAUA,EAAMs0B;ECGjCC,GAAsB,IAAyB70B,iBAAiB,eAMzD80B,GAAc,EAAG7jB,SAAQjD,WAClC,MAAM+mB,GAAS,QAAgB5jB,GAAUA,EAAM9C,QAAQ2mB,IAAI/jB,GAAQjI,OAAO+rB,OAAQ,GAAA1jB,cAClF,OACI,8BACK0jB,GAAQpyB,IAAI,CAACsyB,EAAOpyB,KAEN,SAACqyB,GAAK,CAACjkB,OAAQgkB,EAAmBjnB,KAAM,QAAbnL,OAShDqyB,GAAQ,EAAGjkB,SAAQjD,WACrB,MAAMinB,GAAQ,QAAgB9jB,GAAUA,EAAM9C,QAAQ0mB,OAAO9jB,IAC7D,MAAa,SAATjD,GAEI,SAAC0mB,GAAc,CAACC,QAAS,EAAGthB,gBAAiB,cAAeuhB,cAAe,OAAM,SAC5EK,EAAM5mB,QAAQ1L,IAAI,CAACoQ,EAAelQ,KAE3B,SAACsyB,GAAW,CAERC,QAASH,EAAMhkB,OACfA,OAAQ8B,EAAc/J,OAAOiI,OAC7BjD,KAAM,QAHDnL,OAYzB,SAAC6xB,GAAc,CACXC,QAASM,EAAMI,QAAU,EAAI,EAC7BhiB,gBAAiB4hB,EAAMI,QAAU,uBAAyB,cAC1DT,cAAeK,EAAMK,OAAS,OAAS,MAAK,SAC3CL,EAAM5mB,QAAQ1L,IAAI,CAACoQ,EAAelQ,KAE3B,SAACsyB,GAAW,CAERC,QAASH,EAAMhkB,OACfA,OAAQ8B,EAAc/J,OAAOiI,OAC7BjD,KAAM,QAHDnL,OAcvBsyB,GAAc,EAAGlkB,SAAQmkB,UAASpnB,WACpC,MAAMlD,GAAW,UACXiI,GAAgB,QAAgB5B,GAAUA,EAAM9C,QAAQ2mB,IAAI/jB,GAAS,GAAAI,cACrE4jB,GAAQ,QAAgB9jB,GAAUA,EAAM9C,QAAQ0mB,OAAOK,IAE7D,OAAKriB,GAIAkiB,GAIAA,EAAM7xB,SAeE,SAAT4K,GAEI,gBAAKyF,MAAO,CAAErQ,SAAU,WAAYmyB,IAAKN,EAAM7xB,SAASiB,EAAGmxB,KAAMP,EAAM7xB,SAASqyB,GAAG,UAC/E,SAAC,GAAiB,CACdxkB,OAAQA,EACRjI,OAAQ+J,EACR/E,KAAMA,EACNwH,SAAS,EACTkgB,QAAS,eAOrB,SAACC,GAAgB,CACbvyB,SAAU,CAAEqyB,EAAGR,EAAM7xB,SAASqyB,EAAGpxB,EAAG4wB,EAAM7xB,SAASiB,GACnDuxB,UAAYxyB,KAEH6xB,EAAM7xB,UAAY6xB,EAAM7xB,SAASqyB,IAAMryB,EAASqyB,GAChDR,EAAM7xB,UAAY6xB,EAAM7xB,SAASiB,IAAMjB,EAASiB,IAxB/C,CAACjB,IACf0H,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQupB,YAAY,CAAE5kB,OAAQmkB,EAAS90B,MAAO,CAAE8C,gBAyB1DwyB,CAAUxyB,IAEjB,UACD,SAACyxB,GAAmB,CAChBiB,YAAa,IArCL,EAAC7kB,EAAgBjQ,KAIjC8J,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CAAExB,SAAQjQ,WAiClC80B,CAAY/iB,EAAc/J,OAAOiI,OAAQ8B,EAAc/J,OAAOhI,MAAK,UACtF,SAAC,GAAiB,CACdiQ,OAAQA,EACRjI,OAAQ+J,EACR/E,KAAMA,EACNwH,SAAS,EACTkgB,QAAS,iBAtDd,yBAqEFC,GAAmB,EAC5BvyB,WACAmD,WACAqvB,gBAMA,MAAOG,EAAaC,IAAgB,IAAAvzB,WAAkB,IAC/CwzB,EAAOC,IAAY,IAAAzzB,UAAiB,CAAEgzB,EAAG,EAAGpxB,EAAG,KAC/C8xB,EAAOC,IAAY,IAAA3zB,UAAiB,CAAEgzB,EAAG,EAAGpxB,EAAG,KAC/CgyB,EAAOC,IAAY,IAAA7zB,UAAiB,CAAEgzB,EAAGryB,EAASqyB,EAAGpxB,EAAGjB,EAASiB,IAElE+C,GAAM,IAAAO,QAAuB,MAE7B4uB,GAAkB,IAAAlxB,aACnBmxB,IACGR,GAAa,GACT5uB,EAAIkC,UACJ4sB,EAAS,CAAET,EAAGe,EAAMC,YAAYC,QAASryB,EAAGmyB,EAAMC,YAAYE,UAC9DP,EAAS,CAAEX,EAAGY,EAAMZ,EAAGpxB,EAAGgyB,EAAMhyB,MAGxC,CAACgyB,EAAMZ,EAAGY,EAAMhyB,IAGduyB,GAAkB,IAAAvxB,aACnBmxB,IACG,GAAIT,GAAe3uB,EAAIkC,QAAS,CAC5B,MAAMutB,EAAKV,EAAMV,GAAKe,EAAME,QAAUT,EAAMR,GACtCqB,EAAKX,EAAM9xB,GAAKmyB,EAAMG,QAAUV,EAAM5xB,GAE5CiyB,EAAS,CAAEb,EAAGoB,EAAIxyB,EAAGyyB,GACzB,GAEJ,CAACb,EAAMR,EAAGQ,EAAM5xB,EAAG0xB,EAAaI,EAAMV,EAAGU,EAAM9xB,IAG7C0yB,GAAgB,IAAA1xB,aAAY,KAC9B2wB,GAAa,GACbJ,EAAU,CAAEH,EAAGY,EAAMZ,EAAGpxB,EAAGgyB,EAAMhyB,KAClC,CAACgyB,EAAMZ,EAAGY,EAAMhyB,EAAGuxB,IAWtB,OATA,IAAA3vB,WAAU,KACN+wB,SAASpd,iBAAiB,YAAagd,GACvCI,SAASpd,iBAAiB,UAAWmd,GAC9B,KACHC,SAASnd,oBAAoB,YAAa+c,GAC1CI,SAASnd,oBAAoB,UAAWkd,KAE7C,CAACH,EAAiBG,KAGjB,gBAAKtjB,MAAO,CAAErQ,SAAU,WAAYmyB,IAAKc,EAAMhyB,EAAGmxB,KAAMa,EAAMZ,GAAKruB,IAAKA,EAAK6vB,YAAaV,EAAe,SACpGhwB,KCrMP,GAAY,IAAyBvG,iBAAiB,UAO/Ck3B,GAAc,EAAGjmB,SAAQuE,cAClC,MAAMrE,GAAQ,QAAgBA,GAAU,EAAA7C,OAAOzN,UAAUma,kBAAkB7J,EAAOF,IAElF,OAAIE,GAAOpM,SAEH,gBACI0O,MAAO,CACHrQ,SAAU,WACV+zB,MAAO,EACP9jB,gBAAiB,uBACjB+jB,QAAS,OACTC,KAAM,EACNC,eAAgB,SAChBC,WAAY,UACf,UACD,SAAC,GAAS,MAKlBpmB,GAAOqmB,OAEH,gBACI/jB,MAAO,CACHrQ,SAAU,WACV+zB,MAAO,EACP9jB,gBAAiB,uBACjB+jB,QAAS,OACTC,KAAM,EACNC,eAAgB,SAChBC,WAAY,aAMjB,yBCvCT,GAAU,IAAyBv3B,iBAAiB,QAE7Cy3B,GAAkB,UAAOnqB,MAAM;;;;;;;WAOhChN,GAAUA,EAAMC,MAAMgE,MAAMK;aAC1BtE,GAAUA,EAAMC,MAAMW,MAAMC;;;wBAGjBb,GAAUA,EAAMC,MAAMW,MAAMC;;4BAExBb,GAAUA,EAAMC,MAAMW,MAAMmJ;;;;OAInD,IAAAqD;EAGOgqB,GAA6B,EAAGzmB,SAAQjQ,WACjD,MAAM8J,GAAW,UACXrK,GAAO,EAAAC,EAAA,KAEP+R,GAAiB,IAAApN,aAAY,KAC/ByF,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,kBACpCjc,EACI,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CACtCxB,SACAjQ,WAGT,CAAC8J,EAAUmG,EAAQjQ,IAChB22B,EAAM,EAAArpB,OAAOC,WAAWvN,GAE9B,OACI,SAACy2B,GAAe,CAAC5zB,QAAS4O,EAAc,UACpC,SAAC,GAAO,CACJkB,OAAQ,GAAGlT,EAAKY,cAAc,CAAEC,GAAI,4BAA6Bb,EAAKY,cAAc,CAChFC,GAAIq2B,EAAInrB,mBC5Cf,GAAY,UAAO1K,GAAG;;;EAyCtB81B,GAjCO,EAAG3mB,SAAQpN,UAAS0C,eACpC,MAAMhG,GAAQ,IAAAC,YACRwS,GAAS,QAAgB7B,GAAU,EAAA7C,OAAOzN,UAAUigB,yBAAyB3P,EAAOF,GAAS,GAAAI,cAE7F6B,GAAgB,IAAArD,SAAQ,KACnB,CACH3O,MAAO8R,GAAUA,EAAc,MAAIG,OAAOH,EAAc,OAAKzS,EAAMW,MAAMkS,MACzEC,gBACIL,GAAUA,EAAO,oBAAsBG,OAAOH,EAAO,qBAAuBzS,EAAMW,MAAMe,MAC5F2V,aAAc5E,GAAUA,EAAO,iBAAmB,GAAGA,EAAO,qBAAuB,MACnF6kB,YAAa7kB,EAAO,gBAAkBG,OAAOH,EAAO,iBAAmBzS,EAAMW,MAAMkS,MACnF0kB,YAAa9kB,EAAO,gBAAkB,GAAGA,EAAO,oBAAsB,MACtE+kB,YAAa/kB,EAAO,gBAAkBG,OAAOH,EAAO,iBAAmB,SAE5E,CAACA,EAAQzS,IAEZ,OACI,SAAC,GAAS,CACNsD,QAASA,EACT4P,MAAO,CACHvS,MAAOgS,EAAchS,MACrB22B,YAAa3kB,EAAc2kB,YAC3BE,YAAa7kB,EAAc6kB,YAC3BngB,aAAc1E,EAAc0E,aAC5BkgB,YAAa5kB,EAAc4kB,YAC3BzkB,gBAAiBH,EAAcG,gBAC/BnP,SAAU8zB,OAAO9kB,EAAc0E,cAAgB,EAAI,SAAW,WACjE,SACArR,KClCP0xB,GAAa,IAAyBj4B,iBAAiB,cAEhDk4B,GAAmB,UAAOl2B,CAAgC;;;;;;;;;;aAUzD1B,GAAWA,EAAMY,MAAQZ,EAAMY,MAAQZ,EAAMC,MAAMW,MAAMkS;;;;iBAIrD9S,GAAWA,EAAMY,MAAQZ,EAAMY,MAAQZ,EAAMC,MAAMW,MAAMkS;;EAI9D+kB,GAAuB,EAChClnB,SACAjQ,OACAqW,MACAsL,YAOA,MAAMgV,EAAM,EAAArpB,OAAOC,WAAWvN,GACxBkoB,GAAQ,QACT/X,GAAqB,IAAVwR,EAAc,EAAArU,OAAOzN,UAAUsoB,sBAAsBhY,EAAOF,GAAU,EAClF,GAAAI,cAEE2B,GAAS,QAAgB7B,GAAU,EAAA7C,OAAOzN,UAAUigB,yBAAyB3P,EAAOF,GAAS,GAAAI,cAEnG,OACI,SAAC6mB,GAAgB,CACbp1B,KAAMuU,EACNrU,OAAO,SACP9B,MAAOiS,OAAOH,EAAO9R,aAAUgC,EAC/Bk1B,IAAI,aAAY,aACJT,EAAInrB,MAAK,UACrB,SAACyrB,GAAU,CAAC/O,MAAOA,EAAO3Z,IAAKooB,EAAIpoB,IAAK/C,MAAOmrB,EAAInrB,MAAO6rB,SAAU,SCtBnEC,GAAoB,EAC7BrnB,SACAuT,eACAxb,SACAwM,WAAU,EACVxH,OACA8D,QACA4jB,UACA9P,iBACA0N,yBACAhsB,aAEA,MAAMwD,GAAW,UACXiI,GAAgB,QAAgB5B,GAAU,EAAA7C,OAAOzN,UAAUuQ,aAAaD,EAAOF,IAC/EsnB,GAAa,QAAgBpnB,GAAUA,EAAM9C,QAAQmqB,YAAYvnB,GAAS,GAAAI,cAC1EonB,GAA0B,QAAgBtnB,GAAUA,EAAM9C,QAAQoqB,wBAAyB,GAAApnB,cAC3FP,GAAW,QAAgBK,GAAUA,EAAM9C,QAAQoqB,0BAA4BxnB,EAAQ,GAAAI,eACvF,mBAAEqnB,EAAkB,sBAAEC,IAA0B,UAAoB,IAE1E,IAAA1yB,WAAU,KACFue,GACA1Z,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQssB,qBAAqB,CAAE3nB,SAAQkF,OAAQqO,MAG1E,KAEH,IAAAve,WAAU,KACF+C,GAIA8B,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQusB,eAAe,CAAE5nB,SAAQjI,SAAQ0sB,cAGpE,KAEH,IAAAzvB,WAAU,KACDyyB,GACGznB,IAAWwnB,GACX3tB,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwsB,oBAAoB,CAAE7nB,YAAQ/N,MAIrE,CAACw1B,KAEJ,IAAAzyB,WAAU,KACFyyB,IAAuB5nB,GACvB6nB,EAAsB7nB,IAG3B,CAACA,IAEJ,MAAM2B,GAAiB,IAAApN,aAAY,KAC/B,QAAsBnC,IAAlB6P,GAAwC,SAAT/E,EAC/B,OAEJlD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,kBAIpC,MAAM,OAAE/d,GAAW+J,EACnBjI,EACI,EAAA0H,aAAad,MAAMpF,QAAQmG,eAAe,CACtCxB,OAAQjI,EAAOiI,OACfjQ,KAAMgI,EAAOhI,SAGtB,CAAC8J,EAAUkD,EAAM+E,IAEpB,YAAsB7P,IAAlB6P,GACO,kEAGPyC,GAAoB,SAATxH,GAEP,UAAC4pB,GAAkB,CACf3mB,OAAQA,EACRpN,QAAS,KACL80B,GAAsB,GAClBJ,IACAztB,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQysB,iBAAiB,CAAEl2B,MAAO01B,EAAW11B,SACnEiI,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwsB,oBAAoB,CAAE7nB,cAE3D,WACD,SAACoiB,GAAa,CACV/rB,OAAQA,EACRwK,MAAOA,EACP9I,OAAQ,IACD+J,EAAc/J,UACb+J,EAAc5P,OAAS,CACvBA,MAAO4P,EAAc5P,QAG7BqS,QAASA,EACTxH,KAAMA,EACNuU,cAAe,CAACI,EAAOtL,IAEfsL,GAAS,IACL,SAACwV,GAAoB,CACjBlnB,OAAQjI,EAAOA,OAAOiI,OACtBjQ,KAAMgI,EAAOA,OAAOhI,KACpB2hB,MAAOA,EACPtL,IAAKA,OAMzB,SAACyd,GAAW,CAAC7jB,OAAQA,EAAQjD,KAAMA,KACnC,SAACkpB,GAAW,CAACl2B,KAAM+R,EAAc/J,OAAOhI,KAAMiQ,OAAQ8B,EAAc/J,OAAOiI,OAAQuE,QAASA,QAMpG,UAACoiB,GAAkB,CAAC3mB,OAAQA,EAAQpN,QAAS4O,EAAc,WACvD,SAAC4gB,GAAa,CACV/rB,OAAQA,EACR0B,OAAQ,IACD+J,EAAc/J,UACb+J,EAAc5P,OAAS,CACvBA,MAAO4P,EAAc5P,QAG7BqS,QAASA,EACTxH,KAAMA,EACN8D,MAAOA,EACP8T,eAAgBA,EAChB0N,uBAAwBA,EACxB/Q,cAAe,CAACI,EAAOtL,IAEfsL,GAAS,IACL,SAACwV,GAAoB,CACjBlnB,OAAQjI,EAAOA,OAAOiI,OACtBjQ,KAAMgI,EAAOA,OAAOhI,KACpB2hB,MAAOA,EACPtL,IAAKA,OAMzB,SAACyd,GAAW,CAAC7jB,OAAQA,EAAQjD,KAAMA,IACzB,SAATA,IAAmB,SAAC0pB,GAA0B,CAACzmB,OAAQA,EAAQjQ,KAAMgI,EAAOA,OAAOhI,QACpF,SAACk2B,GAAW,CAACl2B,KAAM+R,EAAc/J,OAAOhI,KAAMiQ,OAAQ8B,EAAc/J,OAAOiI,OAAQuE,QAASA,QAKxG,MCnLawjB,GAA+B,UAAOl3B,GAAG;qBAChCxB,GAAUA,EAAMC,MAAMgE,MAAMgG;wBACzBjK,GAAUA,EAAMC,MAAMW,MAAMsM;wBAC5BlN,GAAUA,EAAMC,MAAMW,MAAMe;;ECM/Cg3B,GAAa,IAAyBj5B,iBAAiB,WAEhDk5B,GAAuC,EAAG7qB,cACnD,MAAM5N,GAAO,EAAAC,EAAA,KACPy4B,GAAiB,QAAe,EAAA7qB,OAAOzN,UAAUu4B,qBAAsB,GAAA/nB,cAE7E,OACI,8BACKhD,EACIkiB,OAAQ7Q,IAAQyZ,EAAeriB,SAAS4I,EAAG1W,OAAOiI,SAClDtO,IACIqG,GACGA,GACAA,EAAOA,SACH,SAACgwB,GAA4B,WACzB,SAAC,GAAiB,CACd/nB,OAAQjI,EAAOA,OAAOiI,OACtBjI,OAAQA,EACRwM,SAAO,EACPxH,KAAM,OACNslB,uBAAyBtqB,IACrB,SAACiwB,GAAU,CACP73B,QAAS,OACTsU,QAASjV,EAAKY,cAAc,CAAEC,GAAI,yBAA2B,CAAE0H,aAGvE0sB,QAAS,aAZkB1sB,EAAOA,OAAOiI,YCdvE,GAAa,IAAyBjR,iBAAiB,WAEhDq5B,GAAqC/4B,IAQ9C,MAAMG,GAAO,EAAAC,EAAA,MACP,QAAE2N,EAAO,QAAEnD,EAAO,QAAEsK,EAAO,KAAExH,EAAI,mBAAEsrB,GAAuBh5B,EAC1D64B,GAAiB,QAAe,EAAA7qB,OAAOzN,UAAUu4B,qBAAsB,GAAA/nB,cAE7E,OACI,8BACKhD,EACIkiB,OAAQ7Q,IAAQyZ,EAAeriB,SAAS4I,EAAG1W,OAAOiI,SAClDtO,IACIqG,GACGA,IACI,SAACgwB,GAA4B,WACzB,SAAC,GAAiB,CACd/nB,OAAQjI,EAAOA,OAAOiI,OACtBuT,aAActZ,EACdlC,OAAQA,EACRwM,QAASA,EACTxH,KAAMA,EACN4X,eAAgB0T,EAChBhG,uBAAyBtqB,IAEjB,SAAC,GAAU,CACP5H,QAAS,OACTsU,QAASjV,EAAKY,cACV,CAAEC,GAAI,yBACN,CAAE0H,aAKlB0sB,QAAS,aAnBkB1sB,EAAOA,OAAOiI,YC5BhEsoB,GAAe,KAOxB,MAAOv1B,EAAM+G,IAAW,IAAAtI,WAAS,IAC1B4N,EAAQC,IAAa,IAAA7N,YAS5B,MAAO,CACHuB,OACAw1B,SAAWrwB,IACPkH,GAAQG,YAAY,cAAc,EAAO,aAAarH,gBACtD4B,GAAQ,IAEZ0F,MAAO,IAAM1F,GAAQ,GACrB2F,KAfQ,IAAAb,SACR,IACI,EAAAc,2BAA2B8oB,KACtB5oB,GAAOP,EAAUO,GAClB,IAAM9F,GAAQ,IAEtB,IAUA+F,UAAU,ICpBZ4oB,GAAe,IAAyB15B,iBAAiB,gBACzD,GAAQ,IAAyBA,iBAAiB,SAU3C25B,GAAY,EAAGH,WAAUx1B,OAAMyM,YACxC,MAAM3F,GAAW,UACXU,GAAkB,WACjBzG,EAAS60B,IAAc,IAAAn3B,WAAS,IAChCg3B,EAAMI,IAAW,IAAAp3B,UAAgB,KACjCyC,EAAO40B,IAAY,IAAAr3B,UAAyC,CAAEs3B,OAAG72B,EAAW82B,OAAQ,IAErFxf,GAAU,IAAAnV,aAAY,KACxBoL,IACAqpB,EAAS,CAAEC,OAAG72B,EAAW82B,OAAQ,KAClC,CAACvpB,IAwBJ,OAtBA,IAAAxK,WAAU,KACFjC,IACA41B,GAAW,GACX,UAAKK,SACAC,QACG,CAAEH,EAAG70B,EAAM60B,GAAK,UAAWz3B,MAnBxB,GAmB+C03B,OAAQ90B,EAAM80B,QAChE,CAAEluB,OAAQN,EAAgBM,SAE7BnG,KAAMgG,IACHkuB,EAAyB,IAAjB30B,EAAM80B,OAAeruB,EAAI7F,OAAUq0B,GAAS,IAAIA,KAASxuB,EAAI7F,WAExEC,MAAO0G,IACCA,EAAEyS,SACHpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAY,oBAG3DwZ,QAAQ,KACLwa,GAAW,OAGxB,CAACpuB,EAAiBV,EAAU9G,EAAMkB,KAGjC,SAAC,GAAK,CACF/B,MAAO,MACPa,KAAMA,EACNF,aAAc0W,EACdzW,2BAAyB,EACzB3C,QAAS,eACTkF,QAAS,CACL,CACIC,UAAU,SAAC,IAAgB,CAACjF,GAAG,kBAC/BJ,MAAO,SACPsF,aAAcgU,IAErB,UACD,SAACkf,GAAY,CACTD,KAAMA,EACNW,YAAaZ,EACbz0B,QAASA,EACTs1B,SAAWN,GAAMD,EAAS,CAAEC,IAAGC,OAAQ,IACvCM,WAAY,KACRR,EAAUK,IAAS,IAAMA,EAAMH,OAAQG,EAAKH,OAxDzC,YCejBO,GAAkB,IAAyBv6B,iBAAiB,mBAe5Dw6B,GAAsB,UAAO14B,GAAG;;;;;;;EASzB24B,GAAe,EACxB9vB,YACAvJ,UAAU,SACVs5B,aACAC,cAAc,UACdC,iBACAhwB,iBAEA,MAAMnK,GAAO,EAAAC,EAAA,KACPH,GAAQ,IAAAC,YACRsK,GAAW,WAEVyJ,EAAOuR,IAAY,IAAArjB,aACnBsC,EAAS60B,IAAc,IAAAn3B,WAAS,IAChC4L,EAASwsB,IAAc,IAAAp4B,UAA+B,KAEtDsjB,EAAcC,IAAmB,IAAAvjB,WAAS,GAE3C0sB,GAAc,QAAe,EAAAC,YAAYvuB,UAAU+K,KACnDkvB,GAAY,QAAe,EAAAxsB,OAAOzN,UAAUk6B,eAC5C7f,GAAuB,QAAe,EAAAC,QAAQta,UAAUua,4BACxD4f,GAAyB,QAAe,EAAA7f,QAAQta,UAAUo6B,8BAC1D5f,GAAS,QAAe,EAAAC,MAAMza,UAAU0a,WACxC2f,GAAiB,QAAe,EAAAC,SAASt6B,UAAUu6B,sBACnDC,GAAe,QAAgBlqB,GAAU,EAAAmqB,QAAQz6B,UAAU06B,YAAYpqB,EAAOxG,IAC9E6wB,GAAY,QAAgBrqB,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,cACvEsqB,GAAW,QAAgBtqB,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,iBAC7EuqB,GAAa,QAAgBvqB,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,gBACvEwqB,EAAuBC,IAA4B,IAAAn5B,UAASm4B,IAC5DiB,EAAaC,IAAkB,IAAAr5B,UAAsD,OACtF,KACFuB,EAAI,SACJuM,EACAE,MAAO+K,EACP9K,IAAK+K,EACL3K,SAAU4K,GACVtL,MAEApM,KAAM+3B,EACNtrB,MAAOurB,EACPxC,SAAUY,EACV1pB,IAAKurB,EACLnrB,SAAUorB,GACV3C,MAEJ,EAAA4C,GAAA,GAAaxxB,G1DhGS,EAACyxB,EAAkCvwB,KACzD,MAAMf,GAAW,UACXuxB,GAAc,IAAAxsB,SAAQ,IAAMysB,GAAA,EAAQ,IACpCC,GAAa,IAAA1sB,SACf,IAAM,EAAAyrB,QAAQkB,0BAA0B1xB,EAAUsxB,EAAYvwB,GAC9D,CAACf,EAAUsxB,EAAYvwB,KAG3B,IAAA5F,WAAU,KACNs2B,EAAWzzB,QAAS2zB,IAChBJ,EAAYK,UAAUD,EAAQvuB,UAAWuuB,EAAQE,SAAUF,EAAQA,WAEhE,KACHF,EAAWzzB,QAAS2zB,IAChBJ,EAAYO,WAAWH,EAAQvuB,UAAWuuB,EAAQE,SAAUF,EAAQA,aAG7E,CAACF,EAAYF,K0DiFhB,CACIhB,EAAa14B,IAAKuG,GAAMA,EAAE5H,IAC1BqJ,GAGJ,MAAM8K,GAAU,IAAApQ,aACXqQ,IACG5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,qBAE9E,CAACwJ,EAAUrK,IA0BTmlB,EAAiB,KACnB9a,EAAS,EAAAwwB,QAAQhvB,QAAQuwB,cAAc,CAAEhxB,UAAWlB,KACpD+b,KAGEA,GAAa,IAAArhB,aAAY,KACtBkP,GAAUwR,IACXC,GAAgB,GAChB,kBACKzR,QACA5O,KAAMgG,IACHma,EAASna,EAAI7F,QACbkgB,GAAgB,GAGhBlb,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQwZ,SAAS,CAAEvR,MAAO5I,EAAI7F,YAEvDC,MAAO0G,IACJgJ,EAAQhJ,EAAE7G,cAGvB,CAAC6P,EAASlB,EAAOwR,EAAcjb,IAE5BgyB,GAAY,IAAAz3B,aACdsH,MAAOowB,IACH,GAAIxoB,EAAO,CACPqlB,GAAW,GACX,MAAMoD,EAAoCp0B,OAAOC,KAAKiyB,GACjDn4B,IAAKrB,GACE+M,GAAS4uB,KAAMnV,GAAMA,EAAE9e,OAAOiI,SAAW3P,GAClCw5B,EAAUx5B,GAEd,MAEVivB,OAAQzI,GAAqC,OAANA,GAE5C,UAGU,UAAK9c,QACNkyB,WAAW,IACLH,EACH1uB,QAAS2uB,EACTzoB,QACA1I,UAAWlB,EACXlG,KAAMk2B,IAETh1B,KAAK,KACFk1B,EAAW,MAEnBnU,GACJ,CAAE,MAAOja,GAEL,MADAgJ,EAAQhJ,EAAE7G,UACJ6G,CACV,C,QACImtB,GAAW,EACf,CACJ,GAEJ,CAACjvB,EAAWgwB,EAAajU,EAAYjR,EAASlB,EAAOumB,EAAWzsB,IA4BpE,OAzBA,IAAApI,WAAU,KACNygB,KACD,CAACA,KAEJ,IAAAzgB,WAAU,KACN6E,EAAS,EAAAwwB,QAAQhvB,QAAQuwB,cAAc,CAAEhxB,UAAWlB,MACrD,CAACA,EAAWG,KAEf,IAAA7E,WAAU,KACDo1B,GAGLA,EAAavyB,QAASoC,IAClBA,EAAQiyB,UAAUr0B,QAASE,IACvB8B,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQssB,qBAAqB,CAAE3nB,OAAQjI,EAAOA,OAAOiI,OAAQkF,OAAQjL,KAC3FJ,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQ8wB,2BAA2B,CAC5CnsB,OAAQjI,EAAOA,OAAOiI,OACtBosB,OAAQnyB,EAAQoyB,eAKjC,CAACjC,EAAcvwB,KAGd,gCACKoQ,GAAwB8f,IACrB,+BACI,SAACR,GAAmB,WAChB,SAACD,GAAe,CACZG,WAAYA,EACZ31B,QAASA,EACTwP,MAAOA,EACPgpB,SAAUlC,EACVyB,UAAWA,EACXU,gBAzHA7wB,MAAOwC,IAC3B,MAAMsuB,EAA4CpC,EAAapyB,KAAMrG,GAASA,EAAKtB,KAAO6N,EAAKuuB,WAC/F,GAAKD,EACL,OAAO,UAAKzyB,QACP2yB,cAAc,CACXD,UAAWvuB,EAAKuuB,UAChBz6B,YAAakM,EAAKlM,aAAew6B,EAAgBx6B,kBAAeC,EAChEqR,MAAOpF,EAAKoF,MACZlG,QAASc,EAAKd,UAEjB1I,KAAK,KACFmF,EAAS,EAAAwwB,QAAQhvB,QAAQuwB,cAAc,CAAEhxB,UAAWlB,KACpD+b,MAEH3gB,MAAO0G,IACJgJ,EAAQhJ,EAAE7G,aA2GEg4B,gBAvGAjxB,MAAO+wB,IAC3B5yB,EAAS,EAAAwwB,QAAQhvB,QAAQuxB,cAAc,CAAEH,YAAW7xB,UAAWlB,MAuG3CmzB,kBAAmBpC,GAAY5qB,WAAY4qB,GAAYqC,UAAUjnB,SAAS,YAC1EknB,mBAEQtC,GAAY5qB,UACZ4qB,GAAYuC,QACZvC,GAAYqC,UAAUjnB,SAAS,YAGvConB,qBACI,SAACnwB,GAAU,CACPC,KAAM,UACNE,UAAW,UACXC,SAAWnF,IACP6xB,EAAW,CAAC7xB,IACZ8B,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQusB,eAAe,CAChC5nB,OAAQjI,EAAOA,OAAOiI,OACtBjI,OAAQA,EACR0sB,QAAS,aAGjB5P,OAAS5iB,GACTwjB,KAEJzY,KAAM,SAGdkwB,4BAA4B,SAACjF,GAAoC,CAAC7qB,QAASA,IAC3E+vB,gCAAiC,CAAClzB,EAASmD,EAASL,EAAMwH,GAAU,KAChE,SAAC6jB,GAAiC,CAC9BnuB,QAASA,EACTmD,QAASA,EACTL,KAAMA,EACNwH,QAASA,EACT8jB,mBAAoB1T,EACpByY,mBAAoB3X,IAG5ByI,YAAaA,EACbmP,cAAe,CACXziB,cAAe,IACRX,EACHqjB,QAASvD,EAAuBwD,iBAEpC1iB,iBAAiB,QAA0BT,EAAQ9a,EAAOkV,IAE9DA,QAASA,EACTgpB,gBAAiBvD,EAAewD,oBAChCC,kBAAmBzD,EAAeyD,kBAClCC,UAAWvjB,EAAOpS,KAAM41B,GAAiB,SAAXA,EAAEp6B,MAChCq6B,eAAiBppB,GACb5K,EACI,EAAAuB,MAAMC,QAAQtH,MAAM,CAChBwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,oBAIvDy9B,aACI,IACQtD,GAAYD,EAAY,CAAC,YAAc,MACxC,EAAAvI,KAAK+L,MAAMC,2BAA2BzD,GAAW0D,SAG5D99B,QAASA,EACT4a,SAAU,CACNmjB,MAAO,UAAKA,MACZC,SAAU,UAAKA,SACflpB,KAAM,UAAKA,KACXmpB,cAAe,UAAKA,cACpBjY,KAAM,UAAKA,KACXkY,OAAQ,UAAKA,OACbC,eAAgB,UAAKA,gBAEzB3E,eACIe,EACM,IACOA,EACH6D,iBAAmBC,IACf7D,EAAyB,IAClBD,EACH8D,aACAC,YAAY,KAGpBC,mBAAoB,KAChB/D,EAAyB,IAClBD,EACH8D,gBAAYv8B,EACZw8B,YAAY,WAIxBx8B,EAEVyH,UAAWA,EACXoR,qBAAsB,CAACN,EAAawgB,GACpC2D,SAAW/0B,GAAeixB,EAAe,CAAEnxB,YAAWE,aAAYD,qBAKjF8Q,IAAoB,SAACpB,GAAa,CAAC/J,SAAUA,EAAUvM,KAAMA,EAAMyM,MAAO+K,IAC1EqgB,IAAe,SAACpxB,EAAc,CAACC,QAAS,IAAMoxB,EAAe,SAAWD,IACxEK,IAAgB,SAACvC,GAAS,CAAC31B,KAAM+3B,EAAetrB,MAAOurB,EAAgBxC,SAAUY,QC7UxFyF,GAAmB,UAAOC,EAAE;;EAI5BC,GAAuB,UAAO/9B,CAAC;;;WAG1B,EAAGzB,WAAYA,EAAMgE,MAAMgG;;aAEzB,EAAGhK,WAAYA,EAAMy/B,KAAK9+B;eACxB,EAAGX,WAAYA,EAAMgE,MAAMgG,QAAQ,EAAGhK,WAAYA,EAAMgE,MAAMK,QAAQ,EAAGrE,WAAYA,EAAMgE,MAAMgG;UACtG,EAAGhK,WAAYA,EAAMgE,MAAMgd;qBAChB,EAAGhhB,WAAYA,EAAMU,KAAKsJ;;;;4BAInB,EAAGhK,WAAYA,EAAMW,MAAMsM;iBACtC,EAAGjN,WAAYA,EAAMy/B,KAAK9+B;;EAIrC,GAAO,IAAyBlB,iBAAiB,QACjDigC,GAAU,IAAyBjgC,iBAAiB,WACpD,GAAa,IAAyBA,iBAAiB,cACvDkgC,GAAW,IAAyBlgC,iBAAiB,YAE9CmgC,GAAiB,KAC1B,MAAM5/B,GAAQ,IAAAC,YACRC,GAAO,EAAAC,EAAA,KACP0/B,GAAkB,QAAgBjvB,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,wBACpFkvB,GAAc,QAAgBlvB,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,aAChFmvB,GAAa,QAAgBnvB,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,mBAErF,OAAKkvB,GAKD,UAACJ,GAAO,CAAC57B,EAAG,SAAQ,WAChB,SAAC,GAAI,CAACrD,KAAM,QAAUq/B,EAAYlwB,KAAM/O,QAAQ,SAASF,MAAOm/B,EAAYn/B,MAAOD,KAAM,MACzF,SAAC,GAAU,CAACG,QAAQ,KAAKH,KAAK,KAAKs/B,OAAO,SAAQ,SAC7CF,EAAY7zB,SAEf8zB,GAAcF,KACZ,iCACI,SAAC,GAAU,CAACn/B,KAAK,KAAKC,MAAO,QAAO,gBAGpC,SAACg/B,GAAQ,CACLM,YAAU,EACV3I,YAAa,QACb4I,SACI,UAACR,GAAO,CAAC57B,EAAG,SAAUC,IAAK/D,EAAMgE,MAAMgd,GAAE,WACrC,SAAC,GAAU,CAACtgB,KAAK,KAAKC,MAAO,QAAO,SAC/BT,EAAKY,cAAc,CAAEC,GAAI,uBAE9B,SAAC,GAAI,CAACN,KAAM,oBAAqBE,MAAO,QAASD,KAAM,QAG/DwgB,SAAU,KACN,UAACwe,GAAO,CAACryB,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMgG,GAAImJ,GAAI,KAAI,UACtD4sB,IACG,SAACT,GAAgB,WACb,UAACE,GAAoB,CAACj9B,KAAMw9B,EAAWjpB,IAAG,WACtC,SAAC,GAAI,CACDrW,KAAM,QAAUs/B,EAAWnwB,KAC3BlP,KAAM,GACNG,QAAS,SACTF,MAAOo/B,EAAWp/B,SAEtB,SAAC,GAAU,CAACD,KAAK,IAAG,SAAEq/B,EAAW9zB,aAI5C4zB,IACG,SAACP,GAAgB,WACb,UAACE,GAAoB,CAACj9B,KAAMs9B,EAAgB/oB,IAAG,WAC3C,SAAC,GAAI,CACDrW,KAAM,QAAUo/B,EAAgBjwB,KAChClP,KAAM,GACNG,QAAS,SACTF,MAAOk/B,EAAgBl/B,SAE3B,SAAC,GAAU,CAACD,KAAK,IAAG,SAAEm/B,EAAgB5zB,wBAjDnE,MClCT,GAAa,IAAyBxM,iBAAiB,cACvD,GAAU,IAAyBA,iBAAiB,WACpD,GAAiB,IAAyBA,iBAAiB,kBAC3D0gC,GAAW,IAAyB1gC,iBAAiB,YACrD2gC,GAAa,IAAyB3gC,iBAAiB,cACvD4gC,GAAiB,IAAyB5gC,iBAAiB,kBAC3D6gC,GAAmB,IAAyB7gC,iBAAiB,oBAC7D,GAAa,IAAyBA,iBAAiB,cAEvD8gC,IAAQ,aAAO,GAAW;;oBAEZ,EAAGvgC,WAAYA,EAAMgE,MAAMK;EAGzCm8B,GAAe,UAAOj/B,GAAG;;;;EAMzBk/B,GAAoB,UAAOl/B,GAAG;iBACnB,EAAGvB,WAAYA,EAAMgE,MAAMK;EAS/Bq8B,GAAkB,EAC3Bz0B,QACAyB,OACAizB,eACAC,cACAlX,YACAmX,oBACAC,UACAC,kBACAC,yBAYA,MAAM9gC,GAAO,EAAAC,EAAA,KACPoK,GAAW,WACX,MAAE02B,IAAU,QAAe,EAAAC,SAAS5gC,UAAU6gC,sBAC9CtB,GAAkB,QAAgBjvB,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,wBACpFwwB,GAAsB,QAAgBxwB,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,wBACjFywB,GAAU,QAAgBzwB,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,gBAC5E0wB,GAAY,QAAgB1wB,GAAU,EAAA4E,YAAYlV,UAAUmV,WAAW7E,EAAO,kBAE9E2wB,GAA6B,IAAAjyB,SAC/B,IAAM,CACF,CACIrD,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,gCAChCuC,QAAS,KACLy9B,EAAgB,oBAGpBM,EACE,CACI,CACIp1B,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,4BAChCuC,QAAS,KACLy9B,EAAgB,cAI5B,MACFlB,GAAmBuB,GAAqB1D,OACtC,CACI,CACIzxB,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oCAChCwB,KAAM,iDAGd,IAEV,CAACs9B,EAAiBuB,GAAqB1D,OAAQx9B,EAAMmhC,EAASN,IAE5DS,GAAoB,IAAAlyB,SACtB,IAAM,CACF,CACIrD,OAAO,SAAC,IAAgB,CAAClL,GAAG,0BAC5BqZ,MAAO,kBAEPinB,EACE,CACI,CACIp1B,OAAO,SAAC,IAAgB,CAAClL,GAAG,sBAC5BqZ,MAAO,YAGf,MACFylB,EACE,CACI,CACI5zB,OAAO,SAAC,IAAgB,CAAClL,GAAG,8BAC5BqZ,MAAO,oBAGf,MACFknB,EACE,CACI,CACIr1B,OAAO,SAAC,IAAgB,CAAClL,GAAG,wBAC5BqZ,MAAO,cAGf,IAEV,CAACylB,EAAiByB,EAAWD,IAGjC,OACI,UAAC,GAAO,CAACv9B,EAAG,SAAQ,WAChB,SAACy8B,GAAK,CAAC7/B,KAAM,IAAKs/B,OAAQ,SAAQ,SAC7B/zB,KAEL,UAAC,GAAO,YACJ,SAACm0B,GAAU,CAACxwB,KAAM,oBAAqBtM,QAAS,IAAMs9B,GAAahH,OAAQj5B,MAAO,WAClF,SAACy/B,GAAU,CAACxwB,KAAM,qBAAsBtM,QAAS,IAAMs9B,GAAaa,OAAQ9gC,MAAO,cAEvF,SAACy/B,GAAU,CACPxwB,KAAM,gBACNtM,QAAS,IAAMs9B,GAAahX,QAC5B8X,QAAS,CAAEh/B,YAAa,iBAAkBG,SAAU,UACpDlC,MAAO,WAEX,SAAC6/B,GAAY,WACT,SAACH,GAAc,CACXzyB,SAAUkzB,EACV1mB,MAAO1M,EACPjN,KAAM,aACNgW,QAASkqB,EACT9gB,SAAWnK,GAAWA,EAAOzJ,MAC7B0T,SAAWjK,GAAWA,EAAO0E,MAC7BkF,UAAQ,EACRpQ,UAAU,EACV1K,QAASklB,EACTiY,UAAQ,OAGhB,SAAC,GAAc,CACXA,UAAQ,EACRhhC,MAAO,UACPiP,KAAM,YACN3D,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,eAChC0V,QAAS8qB,EACTx6B,OAAQ,8BAEZ,SAACo5B,GAAQ,CACLD,SACI,SAACE,GAAU,cACKlgC,EAAKY,cAAc,CAAEC,GAAI,kBACrC6gC,aAAc,QACdhyB,KAAM,cACNiyB,YAAaZ,EAAM59B,SAG3B6d,SAAU,KACN,SAAC,EAAA4gB,SAAQ,CAACC,UAAU,wBAAK,UACrB,SAACtB,GAAiB,WACd,UAAC,GAAO,CAACpzB,UAAW,SAAQ,WACxB,SAAC,GAAU,CAAC2yB,OAAQ,SAAUr/B,MAAO,UAAS,SACzCT,EAAKY,cAAc,CAAEC,GAAI,qBAE9B,SAACu/B,GAAgB,CACb0B,cAAe,SACfC,aAAc,WACd50B,UAAW,SACXO,SAAW0I,IACP/L,EAAS,EAAA22B,SAASn1B,QAAQm2B,SAAS5rB,IACnCuqB,EAAkB,CAAEI,MAAO3qB,KAE/BG,QAAS+qB,EACTpnB,MAAO6mB,EACPxgC,KAAM,OAEV,SAAC,GAAU,CACP6C,QAAS,KACLiH,EAAS,EAAA22B,SAASn1B,QAAQm2B,SAAS,KACnCrB,EAAkB,CAAEI,MAAO,MAE/B9tB,GAAI,SACJxS,MAAO,SACPuZ,SAA2B,IAAjB+mB,EAAM59B,OAAY,SAC3BnD,EAAKY,cAAc,CAAEC,GAAI,0BAM9Ck/B,YAAU,EACV75B,MAAO,WAEX,SAAC,GAAc,CACXu7B,UAAQ,EACR/f,OAAK,EACLC,mBAAoB,OACpBlhB,MAAO,UACPE,QAAS,WACT+O,KAAM,kBACN3D,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mBAChC0V,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2CAChCuC,QAAS,IAAM09B,GAAmB,W,0BCxNnD,MAAMmB,GAA6C,CACtD,CACIl2B,MAAO,gCACPmO,MAAO,CAAC,GAEZ,CACInO,MAAO,iCACPmO,MAAO,CACHgoB,KAAM,UAGd,CACIn2B,MAAO,oCACPmO,MAAO,CACHgoB,KAAM,SACNC,MAAO,CAAC,KAAM,KAAM,KAAM,KAAM,QAGxC,CACIp2B,MAAO,kCACPmO,MAAO,CACHgoB,KAAM,WAGd,CACIn2B,MAAO,mCACPmO,MAAO,CACHgoB,KAAM,YAGd,CACIn2B,MAAO,kCACPmO,MAAO,CACHgoB,KAAM,YAKLE,GAAW,CAAC7gC,EAAe8gC,IAC1B,OAAN9gC,GAAoB,OAAN8gC,GAEd9gC,GAAG2gC,OAASG,GAAGH,OACd3gC,GAAG4gC,OAAO3F,KAAM8F,IAAOD,GAAGF,OAAO9rB,SAASisB,MAC1CD,GAAGF,OAAO3F,KAAM8F,IAAO/gC,GAAG4gC,OAAO9rB,SAASisB,IAItCC,GAAaC,GACfA,GAAcr6B,OAAOqd,QAAQgd,GAAYr/B,OAAS,E,eC3CtD,MAAMs/B,GAAQ,KACjB,MAAOh+B,EAAO40B,IAAY,IAAAr3B,YACpBhC,GAAO,EAAAC,EAAA,KAEPoQ,GAAW,IAAAjB,SAAQ,IAEjBmgB,EAAEmT,OAAOC,eAAetyB,UACxBkf,EAAEmT,OAAOC,eAAeC,WACxBrT,EAAEmT,MAAMC,cAAcC,UAAUz/B,OAErC,IAEG0/B,GAAqB,IAAAj+B,aAAaH,IASpC40B,EAAS,IACF50B,EACHmB,OANoBsU,IACpBzV,EAAMmB,OAAOsU,GACbmf,OAAS52B,IAKTuD,QAXqBkU,IACrBzV,EAAMuB,QAAQkU,GACdmf,OAAS52B,OAWd,IAEGqgC,GAAQ,IAAAl+B,aACV,CAACG,EAAcE,IACJ,IAAI+F,QAAgB,CAAChF,EAASJ,KACjCi9B,EAAmB,CACfj9B,SACAI,UACAjB,OACAE,iBAIZ,CAAC49B,IAGCE,GAAiB,IAAA3zB,SAAQ,KACpB,CACH4zB,QAAUj+B,GAAiB+9B,EAAM/9B,EAAM,WACvCk+B,UAAYl+B,GAAiB+9B,EAAM/9B,EAAM,aACzCm+B,KAAOn+B,GAAiB+9B,EAAM/9B,EAAM,QACpCo+B,GAAKp+B,GAAiB+9B,EAAM/9B,EAAM,MAClCq+B,GAAKr+B,GAAiB+9B,EAAM/9B,EAAM,MAClCs+B,OAASt+B,GAAiB+9B,EAAM/9B,EAAM,UACtCu+B,MAAQv+B,GAAiB+9B,EAAM/9B,EAAM,WAE1C,CAAC+9B,IAIJ,MAAO,CAAEr+B,QAAOwL,KAFJ,IAAAb,SAAQ,IAAM,EAAAc,2BAA2BrL,IAAIk+B,EAAgB/iC,GAAO,CAACA,EAAM+iC,IAElE1yB,aCnDnBkzB,GAAkB,IAAyBhkC,iBAAiB,gBAOrDikC,GAA+D3jC,IACxE,MAAMG,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXvK,GAAQ,IAAAC,YACR6a,GAAS,QAAe,EAAAC,MAAMza,UAAU0a,YACxC,MAAErW,EAAOwL,IAAKwzB,EAAOpzB,SAAUqzB,GAAejB,MAC9C,KACFl/B,EAAI,SACJuM,EACAE,MAAO+K,EACP9K,IAAK+K,EACL3K,SAAU4K,GACVtL,MAEAK,MAAOurB,EACPh4B,KAAM+3B,EACNjrB,SAAUorB,EAAY,SACtB1C,EACA9oB,IAAK0zB,GACL7K,KAEE8K,GAAW,IAAAx0B,SAAQ,IACd,IACC6L,EAAmB,CAACD,GAAe,MACnC0oB,EAAa,CAACD,GAAS,MACvBhI,EAAe,CAACkI,GAAW,IAEpC,CAACF,EAAOzoB,EAAa2oB,EAASD,EAAYjI,EAAcxgB,IAErD4oB,GAAuB,IAAAj/B,aACxBqQ,IACG5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,qBAE9E,CAACwJ,EAAUrK,IAGTkb,GAAsB,IAAA9L,SAAQ,KACzB,QAA0BwL,EAAQ9a,EAAO+jC,GACjD,CAACjpB,EAAQipB,EAAsB/jC,IAE5Bsb,GAAgB,IAAAhM,SAAQ,IAAM,MAAsB,IAE1D,OACI,gCACKgM,IACG,SAACmoB,GAAe,CACZnoB,cAAeA,EACfE,qBAAsBsoB,EACtBvoB,gBAAiBH,KACbrb,IAGX6jC,IAAc,SAACl/B,EAAO,CAACC,MAAOA,IAC9BwW,IAAoB,SAACpB,GAAa,CAAC/J,SAAUA,EAAUvM,KAAMA,EAAMyM,MAAO+K,IAC1E0gB,IAAgB,SAACvC,GAAS,CAACH,SAAUA,EAAUx1B,KAAM+3B,EAAetrB,MAAOurB,QCnDlFuI,GAAa,IAAyBvkC,iBAAiB,cACvD,GAAY,IAAyBA,iBAAiB,aACtDwkC,GAAgB,IAAyBxkC,iBAAiB,iBAC1D,GAAmB,IAAyBA,iBAAiB,oBAC7D,GAAc,IAAyBA,iBAAiB,eACxDykC,GAAgB,IAAyBzkC,iBAAiB,iBAC1D0kC,GAAuB,IAAyB1kC,iBAAiB,wBACjE,GAAa,IAAyBA,iBAAiB,cACvD2kC,GAAa,IAAyB3kC,iBAAiB,cACvD4kC,GAAgB,IAAyB5kC,iBAAiB,iBAC1D6kC,GAAmB,IAAyB7kC,iBAAiB,oBAC7D,GAAU,IAAyBA,iBAAiB,WACpD8kC,GAAoB,IAAyB9kC,iBAAiB,qBAC9D,GAAiB,IAAyBA,iBAAiB,kBAC3D+kC,GAAc,IAAyB/kC,iBAAiB,eACxDglC,GAAU,IAAyBhlC,iBAAiB,WAiCpDilC,GAAqB,UAAOnjC,GAAG;mBAClB,EAAGvB,WAAYA,EAAMgE,MAAMgG;sBACxB,EAAGhK,WAAYA,EAAMgE,MAAMC;EAG3C0gC,GAAW,UAAOpjC,GAAuB;MACzC,EAAGqjC,YACAA,GACD;EAeKC,GAAkC,EAC3Cn+B,OACAo+B,mBACAC,qBACAt3B,WAEA,MAAMvN,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXvK,GAAQ,IAAAC,YACR+kC,GAAiB,IAAA59B,QAAuB,OACvC69B,EAAqBC,IAA0B,IAAAhjC,WAAS,IACxDijC,EAAWC,IAAgB,IAAAljC,UAC9B6iC,GAAoBI,WAAa,WAE9BE,EAAcC,IAAmB,IAAApjC,UAAS6iC,GAAoBM,eAAgB,IAC9EE,EAAWC,IAAgB,IAAAtjC,aAC3BujC,EAAaC,IAAkB,IAAAxjC,YAChCyjC,GAAe,QAAgB/0B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,iBAC1Eg1B,GAAe,QAAgBh1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,iBAC1Ei1B,GAAW,QAAgBj1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,aACtEk1B,GAAsB,QAAgBl1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,wBACjFqqB,GAAY,QAAgBrqB,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,cACvEm1B,GAAmB,QAAgBn1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,qBAC9Eo1B,GAAU,QAAgBp1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,sBACrEq1B,GAAoB,QAAgBr1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,sBAC/EkK,GAAS,QAAe,EAAAC,MAAMza,UAAU0a,YACvCkrB,EAAOC,IAAY,IAAAjkC,UAA6B6iC,GAAoBmB,OAG3ElB,EAAej8B,SAASgI,MAAOnI,IAC3BP,OAAOC,KAAKM,GAAGL,QAAS69B,IACpB1/B,EAAKoX,SAASsoB,EAAoDx9B,EAAEw9B,QAI5E,MAAMC,GAAY,IAAAC,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,eAC1D,IAAAiF,WAAU,KACD2gC,GACD3/B,EAAKoX,SAAS,eAAe,IAElC,CAACpX,EAAM2/B,IAEV,MAAMljB,GAAY,IAAAmjB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,cACpD4iB,GAAU,IAAAijB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,YAClD8lC,GAA0B,IAAAj3B,SAAQ,IAC7B6T,GAAaE,IAAW,EAAAmjB,GAAA,GAAQ,IAAIxuB,KAAKmL,GAAY,IAAInL,KAAKqL,IACtE,CAACF,EAAWE,IAETojB,GAAmB,IAAAn3B,SACrB,IAAM,CACF,CAAErD,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,qBAAuBqZ,MAAO,UAChE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mBAAqBqZ,MAAO,SAC9D,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oBAAsBqZ,MAAO,WAEnE,CAACla,IAGCwmC,GAAgB,IAAAp3B,SAA4B,KAC9C,MAAMlE,EAA+B,GAgBrC,OAdIy6B,GAAYA,EAASt1B,UAAYs1B,EAASjT,YAC1CxnB,EAAIkc,KAAK,SAGblc,EAAIkc,KAAK,QAELse,GAAgBA,EAAar1B,UAC7BnF,EAAIkc,KAAK,UAGTwe,GAAuBA,EAAoBv1B,UAC3CnF,EAAIkc,KAAK,mBAGNlc,GACR,CAAC06B,EAAqBF,EAAcC,IAEjC3wB,GAAU,IAAApQ,aACXqQ,GACG5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,oBAC9E,CAACwJ,EAAUrK,IAGT8T,GAAQ,IAAAsyB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,UAEhDkmC,GAAa,IAAA7hC,aACfsH,MAAOrL,IACH,GAAKiT,EACL,UACU,UAAK2B,KAAKgxB,WAAW5lC,EAAI,aAAciT,EACjD,CAAE,MAAO9H,GACDgJ,GAASA,EAAQhJ,EACzB,GAEJ,CAACgJ,EAASlB,IAaR4yB,GAAe,IAAAt3B,SACjB,IAAM,CACF,CACI8K,MAAO,QACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,6BAEhCglC,GAAoBA,EAAiBx1B,UAAYw1B,EAAiBnT,WAChE,CACI,CACIxY,MAAO,eACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,kCAGxC,MACFilC,GAAWA,EAAQz1B,UAAYy1B,EAAQpT,WACrC,CACI,CACIxY,MAAO,MACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAEhCklC,GAAqBA,EAAkB11B,SACrC,CACI,CACI6J,MAAO,aACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,gCAGxC,IAEV,GACN,CACIqZ,MAAO,QACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAGxC,CAACilC,EAAS9lC,EAAM+lC,EAAmBF,KAEhCc,EAAaC,IAAkB,IAAA5kC,UAAsB0kC,EAAaA,EAAavjC,OAAS,IAEzF0jC,GAAoB,IAAAjiC,aACrB4Q,IAEG,OADAoxB,EAAepxB,GACPA,EAAO0E,OACX,IAAK,QACD1T,EAAKoX,SAAS,QAAS,SAAW2R,EAAEuX,QAAU,6BAA8B,WAC5E,MACJ,IAAK,eACDtgC,EAAKoX,SAAS,QAAS,gBACvB,MACJ,IAAK,QACDpX,EAAKoX,SAAS,QAAS,IACvB,MACJ,IAAK,MACDpX,EAAKoX,SAAS,QAAS,OACvB,MACJ,IAAK,aACDpX,EAAKoX,SAAS,QAAS,gBAInC,CAACpX,IAGCugC,GAAQ,IAAAX,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,UAChDymC,GAAU,IAAAZ,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,YAElD0mC,IAAkB,IAAAriC,aACnB8D,GACGw8B,EAAcxL,IACVsL,GAAuB,GACV,UAATtL,GAA6B,WAATA,GACpB4L,EAAayB,GAEJ,WAATrN,GAA8B,WAATA,GACrB8L,EAAewB,GAET,WAANt+B,GACAlC,EAAKoX,SAAS,QAAS,MACV,WAAT8b,GACAlzB,EAAKoX,SAAS,UAAW2nB,IAEhB,UAAN78B,GACPlC,EAAKoX,SAAS,UAAW,MACZ,WAAT8b,GACAlzB,EAAKoX,SAAS,QAASynB,IAEd,WAAN38B,IACM,WAATgxB,GACAlzB,EAAKoX,SAAS,UAAW2nB,GAEhB,UAAT7L,GACAlzB,EAAKoX,SAAS,QAASynB,IAGxB38B,IAEf,CAACs+B,EAASxgC,EAAMugC,EAAOxB,EAAaF,IAGlC7C,IAAa,IAAA4D,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,oBAC3D,IAAAiF,WAAU,KACFg9B,IAAcD,GAAUC,KAAeA,GAAWwD,QAAUA,GAC5Dx/B,EAAKoX,SAAS,iBAAkB,IAAK4kB,GAAYwD,MAAOA,QAASvjC,KAEtE,CAAC+D,EAAMg8B,GAAYwD,IACtB,MAAMkB,IAAgB,IAAA93B,SAAQ,IAAMmzB,GAAUC,IAAa,CAACA,KAEtD2E,IAAS,IAAAf,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,WACjD6mC,IAAY,IAAAhB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,cACpD8mC,IAAU,IAAAjB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,YAClD+mC,IAAwB,IAAAlB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,0BAEtE,OACI,UAAC,GAAO,CAAC4M,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMC,EAAC,WAC5C,SAAC0gC,GAAQ,OAAiB,WAATl3B,KAAuB25B,GAAa,UACjD,SAAC3C,GAAO,CAAC5jC,QAAS,UAAWsU,QAASjV,EAAKY,cAAc,CAAEC,GAAI,0CAEnE,SAACijC,GAAU,CACPxyB,OAAQ,IACR/Q,KAAM,QACNgnC,aAAc,CAAEl2B,MAAO,OAAQ7E,OAAQ,KACvC7E,QAASnB,EAAKmB,QACdmM,MAAOA,EACP0zB,YAAa,EACbC,kBAAgB,EAChBC,cAAe,CACXC,KAAM,GACNC,YAAa,MAGrB,SAAC,GAAS,CACNt2B,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,iBAChCN,KAAM,QACNoH,QAASnB,EAAKmB,QACdwX,MAAO,CAAEC,UAAU,MAEvB,UAAC,GAAO,CAACjS,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMgG,GAAE,UAC5Cu8B,IACG,SAAC9B,GAAO,CACJtvB,QAASjV,EAAKY,cAAc,CAAEC,GAAI,uCAClCF,QAAS,WAGjB,UAAC,GAAO,CAACkD,IAAK/D,EAAMgE,MAAMK,GAAIP,EAAG,SAAQ,WACrC,SAACugC,GAAa,CACV52B,KAAM45B,GAAS,OAAS,WACxB71B,OAAQ,IACRD,MAAO,OACPtF,MAAO,0BACPpE,QAASnB,EAAKmB,QACdpH,KAAM,YACN4e,MAAO,CAAEC,UAAU,GACnByoB,cAAe,UAEnB,SAAC1D,GAAa,CACV52B,KAAM45B,GAAS,OAAS,WACxB71B,OAAQ,IACRD,MAAO,OACPtF,MAAO,wBACPpE,QAASnB,EAAKmB,QACdpH,KAAM,UACN4e,MAAO,CAAEC,UAAU,SAG3B,SAAC2kB,GAAa,CACVp8B,QAASnB,EAAKmB,QACd2J,OAAQ,IACR/Q,KAAM,SACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,qBAChCqZ,MAAO,aAKb,WAAT3M,GAAqBk4B,GAAcsC,yBAChC,SAACzD,GAAW,CACR7C,UAAQ,EACR11B,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,8BAChCN,KAAM,iBACNoH,QAASnB,EAAKmB,QACd4O,QAAS0rB,GACT9iB,MAAO,CAAEC,UAAU,GACnB4oB,gBAAiB5F,MAGzB,SAACqC,GAAQ,SAAUyC,GAAa,UAC5B,UAAC,GAAO,CAAC/5B,UAAW,SAAQ,WACxB,SAAC,GAAU,UAAEnN,EAAKY,cAAc,CAAEC,GAAI,4CACtC,SAACujC,GAAgB,CACb72B,KAAM,OACN8D,MAAO,OACP6I,MAAO8rB,EACPt4B,SAAWhF,GAAMu9B,EAASv9B,QAAKjG,WAI3C,UAAC,GAAO,CAAC0K,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMK,GAAE,UACnC,WAAToJ,GAAqBw3B,IAAwBvC,KAC1C,SAAC+B,GAAO,CAAC5jC,QAAS,OAAQsU,QAASjV,EAAKY,cAAc,CAAEC,GAAI,6BAEhE,SAAC4jC,GAAQ,QAASyC,GAAa,UAC3B,SAAC,GAAgB,CACb51B,OAAQ,IACRywB,aAAc,QACd50B,UAAW,MACX+M,MAAO+qB,EACP1kC,KAAK,QACLmN,SAAUu5B,GACV1wB,QAASgwB,OAGjB,SAAC9B,GAAQ,OAAsB,WAAdQ,GAAwC,WAAdA,KAA4BiC,GAAa,UAChF,SAAC,GAAS,CACN51B,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChCN,KAAM,UACNoH,QAASnB,EAAKmB,aAGtB,SAAC88B,GAAQ,QAAuB,UAAdQ,GAAuC,WAAdA,KAA4BiC,GAAa,UAChF,UAAC,GAAO,CAAC/5B,UAAW,SAAQ,WACxB,SAAC,GAAU,UAAEnN,EAAKY,cAAc,CAAEC,GAAI,4BACtC,UAAC,GAAO,CAACgD,IAAK/D,EAAMgE,MAAMK,GAAIP,EAAG,WAAU,WACvC,SAAC,GAAO,CAACgzB,KAAM,IAAKtlB,OAAQ,YAAW,UACnC,SAAC,GAAc,CACXmwB,UAAQ,EACRlhC,KAAM,QACNmN,SAAUm5B,EACVtwB,QAASmwB,EACTxsB,MAAOysB,EACPvnB,UAAQ,EACRO,SAAWD,GAAMA,EAAE3T,MACnB0T,SAAWC,GAAMA,EAAExF,WAGH,UAAtBysB,EAAYzsB,OAA2C,UAAtBysB,EAAYzsB,SAC3C,SAAC,GAAO,CAAC0c,KAAM,IAAG,UACd,SAAC,GAAS,CACNvlB,MAAO,OACPC,OAAQ,IACR/Q,KAAM,QACNoH,QAASnB,EAAKmB,QACdqS,SAAgC,UAAtB2sB,EAAYzsB,mBAO9C,SAACuqB,GAAQ,SAAUgB,GAAcwC,kBAAoBf,GAAa,UAC9D,SAAC,GAAS,CACN51B,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChC2B,YAAaxC,EAAKY,cAAc,CAAEC,GAAI,uCACtCN,KAAM,aACNoH,QAASnB,EAAKmB,aAGtB,SAAC67B,GAAsB,CACnBlyB,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,uBAChC8G,QAASnB,EAAKmB,QACdpH,KAAM,cACNgb,SAAU,CACN9F,KAAM,UAAKA,SAGnB,SAAC+uB,GAAkB,WACf,SAACz9B,EAAW,CACR/C,KAAM,cACNsD,OAAQ,CAAC,CAAE+O,SAAU,SACrB1P,IAAKm+B,EACL19B,cAAey9B,GAAoBqD,UAG3C,SAACzD,GAAQ,QAASyC,GAAa,UAC3B,SAAC7C,GAAiB,CACd5C,UAAQ,EACR95B,QAASnB,EAAKmB,QACdpH,KAAK,eACLwL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,uBAChCsnC,YAAU,EACVC,aAzSUC,GAC1B,UAAK99B,QACA8X,KAAK,CAAE5d,MAAO4jC,EAAOC,QAAS,CAAC,CAAE/nC,KAAM,OAAQ2Z,MAAO,gBAAiBquB,SAAU,SACjFrjC,KAAMgG,GACHA,GAAK7F,QAAQ2L,KAAK9O,IAAKX,IACnB,MAAM4vB,EAAQvW,EAAOpS,KAAM41B,GAAMA,EAAEp6B,OAASzC,EAAEyC,MAC9C,MAAO,CAAE1D,IAAKiB,EAAEjB,IAAKoC,MAAOnB,EAAEmB,MAAOgN,KAAMyhB,GAAOzhB,KAAMjP,MAAO0wB,GAAO1wB,eAsS1E,UAAC,GAAO,CAAC0M,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMK,GAAE,WAC7C,SAAC,GAAgB,CACbmN,OAAQ,IACR5D,SAAWhF,IACHA,GACAlC,EAAKoX,SAAS,YAAa9d,EAAMW,MAAM+nC,OACvChiC,EAAKoX,SAAS,UAAW9d,EAAMW,MAAMsM,SAErCvG,EAAKoX,SAAS,YAAa,MAC3BpX,EAAKoX,SAAS,UAAW,OAE7BwnB,EAAgB18B,IAEpBwR,MAAOirB,EACP5kC,KAAK,GACLwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChCqZ,MAAO,WAInB,UAACuqB,GAAQ,OAAQU,EAAY,WAIzB,SAACV,GAAQ,QAASyC,GAAa,UAC3B,SAAChD,GAAU,CACP5yB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,YACNwL,MAAO,sBACPiT,aAAcooB,IAAatnC,EAAMW,MAAM+nC,WAG/C,SAACtE,GAAU,CACP5yB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,UACNwL,MAAO,4BACPiT,aAAcqoB,IAAWvnC,EAAMW,MAAMsM,eAIjD,SAAC03B,GAAQ,QAASyC,GAAa,UAC3B,UAAC,GAAO,CAAC/5B,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMgG,GAAE,WAC7C,SAACi6B,GAAa,CACVzyB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,wBACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,+BAChCqZ,MAAO,WAInB,SAACuqB,GAAQ,SAAU6C,GAAqB,UACpC,SAAC,GAAW,CAACh2B,OAAQ,IAAK3J,QAASnB,EAAKmB,QAASpH,KAAM,+BAInE,SAACyjC,GAAa,CACV1yB,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oBAChC8G,QAASnB,EAAKmB,QACdpH,KAAM,YACN4nC,YAAU,EACV30B,UAAQ,EACRi1B,MAAO,CACHC,YAAalC,EACbjrB,SAAU,CACNoL,KAAM,UAAKA,KACXgY,SAAU,UAAKA,SACfgK,MAAO,UAAKA,OAEhB3zB,cAGR,SAAC,GAAU,UAAEhV,EAAKY,cAAc,CAAEC,GAAI,0BACtC,SAACojC,GAAoB,CACjBnwB,MAAOA,EACPN,UAAQ,EACRjT,KAAM,aACNkmC,WAAYA,EACZnI,aACI,IACQoH,GAAgB3K,EAAY,CAAC,YAAc,MAC5C,EAAAvI,KAAK+L,MAAMC,2BAA2BzD,GAAW0D,SAG5DljB,SAAU,CACN9F,KAAM,UAAKA,KACXkpB,SAAU,UAAKA,SACfD,MAAO,UAAKA,OAEhBkK,gBAAiB5zB,EACjBtB,cAAe,IAAMkxB,GAAiB,GACtChxB,gBAAiB,IAAMgxB,GAAiB,GACxCiE,cAAehE,GAAoBiE,aAAe,MAEtD,SAAC,GAAU,UAAE9oC,EAAKY,cAAc,CAAEC,GAAI,6BACtC,4BACI,SAAC4jC,GAAQ,QAASyC,GAAa,UAC3B,SAACnD,GAAa,CACVzyB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,YACNwhC,aAAc,WACd+F,oBAAkB,EAClBiB,U,EACAxyB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mCAChCqZ,MAAO,aAKvB,SAACuqB,GAAQ,QAASyC,GAAa,UAC3B,SAACnD,GAAa,CACVzyB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,mBACNwhC,aAAc,WACd+F,oBAAkB,EAClBiB,U,EACAxyB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,8BAChCqZ,MAAO,aAKvB,SAACuqB,GAAQ,QAASyC,GAAa,UAC3B,SAACnD,GAAa,CACVzyB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,YACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,yBAChCqZ,MAAO,YAKb,WAAT3M,IACG,iCACI,SAACw2B,GAAa,CACVzyB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,YACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,sBAChCqZ,MAAO,WAInB,SAAC6pB,GAAa,CACVzyB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,cACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,wBAChCqZ,MAAO,QAGfF,UAAWmsB,iBCnpBrC,GAAY,IAAyB5mC,iBAAiB,aAE/CypC,GAA2B,EACpC3lC,eACAuD,WACAd,WACAU,OACAyiC,gBACAjlC,OACAM,UACA4F,gBAEA,MAAMlK,GAAO,EAAAC,EAAA,KAEb,OACI,SAAC,GAAS,CACN2G,SAAUA,EACVtC,QAASA,EACTf,OAAQ2G,EACR7G,aAAcA,EACdwC,QAAS,CACL,CACIpF,MAAO,SACPqF,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,kBACnCkF,aAAc1C,GAElB,CACI5C,MAAO,QACPyoC,UAAU,EACV5kC,UACA0V,UAAWxT,EAAKqX,UAAUC,SAAWxZ,GAAW2kC,EAChDnjC,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,kBAG3CsoC,gBACIj/B,EACM,CACI,CACIwF,KAAM,cACNrN,KAAM,mCAAmC6H,MAGjD,GAEVxH,MAAO1C,EAAKY,cAAc,CACtBC,GACa,gBAATmD,EACM,oCACS,YAATA,EACE,gCACA,yCACd,SACD8B,K,0BC5Cb,MAAM,GAAa,IAAyBvG,iBAAiB,cACvD,GAAQ,IAAyBA,iBAAiB,SAQlD6pC,GAAqB,CACvBp4B,EACA1Q,KACoB,IACjB0Q,EACHq4B,WAAW,SAAsBr4B,EAAKq4B,WACtCC,aAAct4B,EAAKs4B,aAAet4B,EAAKs4B,aAAahpC,IAAM,GAC1D6lC,UAAWn1B,EAAKm1B,UAAY,IAAM,IAClCoD,YAAav4B,EAAKu4B,YAAc,IAAM,QACnC,IAAAC,2CAA0Cx4B,EAAM,QAAUwV,GAAkBA,EAAI7d,KAAK,MACxFrI,IAAKA,GAAO,GACZ0D,KAAM,gBAGGylC,GAAyB,EAAGpmC,eAAcqmC,WAAU3T,YAC7D,MAAM/1B,GAAO,EAAAC,EAAA,KACP8K,GAAkB,EAAA0S,GAAA,MACjBksB,EAAmBC,IAAsB,IAAA5nC,WAAS,GACnDwE,GAAO,IAAAsB,WACPuC,GAAW,WACVw/B,EAAgBC,IAAqB,IAAA9nC,WAAS,IAC9CsC,EAAS60B,IAAc,IAAAn3B,WAAS,IAChCinC,EAAerE,IAAoB,IAAA5iC,WAAS,IAEnD,IAAAwD,WAAU,KACN,GAAIuwB,EAAO,CACP,MAAMgU,EAAwB,EAAAhnC,MAAMC,KAAKC,eAAe8yB,EAAMjzB,cAC9D,kBACKgR,MAAM/I,EAAgBM,QACtBnG,KAAMgG,IACH1E,EAAKoB,MAAM,CACPoiC,mBAAoBjU,EAAMiU,mBAC1BtnC,MAAOqzB,EAAMrzB,MACbunC,UAAWlU,EAAMkU,UACjB9mB,QAAS4S,EAAM5S,QACfF,UAAW8S,EAAM9S,UACjBqkB,sBAAuBvR,EAAMuR,sBAC7BN,QAASjR,EAAMiR,QACfG,OAAQpR,EAAMoR,OACdE,QAAStR,EAAMsR,QACf6C,MACIH,GAAyBhU,EAAMmU,MACzB,CACIlmC,KAAM,cACNnD,GAAIk1B,EAAMl1B,GACVgC,UAAW6P,OAAOq3B,SAEtBtnC,EACVskC,MAAOhR,EAAMgR,MACboD,iBAAkBpU,EAAMoU,iBACxB/C,UAAWrR,EAAMqR,UACjBgD,UAAWrU,EAAMqU,UACjB5nC,YAAauzB,EAAMvzB,kBAAeC,EAClC4nC,WAAYtU,EAAMsU,iBAAc5nC,EAChC4mC,UAAWtT,EAAMuU,UAAUpoC,IAAK+c,IAAO,CAAG3e,IAAK2e,EAAG3e,IAAKoC,MAAOuc,EAAGvc,SACjE4mC,aACIvT,EAAMuT,cAAgBvT,EAAMuT,aAAanmC,OAAS,EAC5C,CAAE7C,IAAKy1B,EAAMuT,aAAa,GAAGhpC,IAAKoC,MAAOqzB,EAAMuT,aAAa,GAAG5mC,YAC/DD,EACVqR,MAAO5I,EAAI7F,SAEfykC,GAAkB,KAErBxkC,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,qBAEzF,GACD,CAACkK,EAAgBM,OAAQhB,EAAU0rB,EAAOvvB,EAAMxG,IAEnD,MAAM6kC,GAAqB,IAAAz1B,SAAuD,KAC9E,IAAK2mB,EAAO,OACZ,IAAIkP,EAA2C,SAU/C,OARIA,EADAlP,EAAMgR,OAAShR,EAAMiR,QACT,SACLjR,EAAMiR,QACD,SACLjR,EAAMgR,MACD,QAEA,SAET,CACH9B,YACAE,eAAgBpP,EAAMqR,aAAerR,EAAMsR,QAC3CyB,YAAa/S,EAAMwU,eACnBrC,MAAM,IAAAsC,6BAA4BzU,KAEvC,CAACA,IAEEnvB,GAAW,IAAAhC,aACZoM,IACGmoB,GAAW,GACX,UAAK5uB,QACA6Z,OACG,IACOglB,GAAmBp4B,EAA+C+kB,GAAOz1B,MAEhF,CAAE+K,OAAQN,EAAgBM,OAAQC,OAAQ,EAAA2lB,OAAOwZ,SAEpDvlC,KAAMgG,IACHw+B,IACAr/B,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO,4BACP2+B,KAAM,CACF3+B,MAAO,uBACP6K,IAAK1L,EAAI7F,OAAO/C,WAK/BgD,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAEhF8d,QAAQ,KACD5T,EAAgBM,OAAOoT,SAC3B0a,GAAW,MAGvB,CAACpuB,EAAgBM,OAAQhB,EAAU0rB,GAAOz1B,IAAKN,EAAM0pC,IAGnDzhC,GAAS,IAAAm+B,UAAS,CAAEz+B,QAASnB,EAAKmB,UAClCmW,GAAU,IAAA1O,SACZ,IACI,EAAAu7B,wBAAwBC,UACpBxB,GAAmBnhC,EAAiD8tB,GAAOz1B,MAC7EwL,QACN,CAACiqB,GAAOz1B,IAAK2H,IAGjB,OACI,iCACI,SAAC+gC,GAAwB,CACrB9+B,UAAW6rB,GAAOl1B,GAClBmD,KAAM,cACNX,aAAcA,EACduD,SAAUJ,EAAKkB,aAAad,GAC5BJ,KAAMA,EACNlC,QAASA,EACTwZ,QAASA,EACTmrB,cAAeA,EAAa,SAC3BY,EAAiB,MACd,SAAClF,GAA+B,CAC5Bp3B,KAAM,SACN/G,KAAMA,EACNo+B,iBAAkBA,EAClBC,mBAAoBA,OAIhC,SAAC,GAAK,CACFthC,KAAMomC,EACNtmC,aAAc,IAAMumC,GAAmB,GACvClnC,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,gBAChCgF,QAAS,CACL,CACIpF,MAAO,SACPsF,aAAc,IAAM6jC,GAAmB,GACvC9jC,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,mBAEvC,CACIJ,MAAO,SACPsF,aAAcS,EAAKkB,aAAad,GAChCtC,QAASA,EACTwB,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,gBACnCgG,OAAQ,oBAEf,UACD,SAAC,GAAU,UACN7G,EAAKY,cAAc,CAChBC,GAAI,mDC1LtB,GAAa,IAAyBtB,iBAAiB,cACvD,GAAY,IAAyBA,iBAAiB,aACtD,GAAgB,IAAyBA,iBAAiB,iBAC1D,GAAmB,IAAyBA,iBAAiB,oBAC7D,GAAgB,IAAyBA,iBAAiB,iBAC1D,GAAuB,IAAyBA,iBAAiB,wBACjE,GAAa,IAAyBA,iBAAiB,cACvD,GAAa,IAAyBA,iBAAiB,cACvD,GAAgB,IAAyBA,iBAAiB,iBAC1D,GAAU,IAAyBA,iBAAiB,WACpD,GAAoB,IAAyBA,iBAAiB,qBAC9D,GAAiB,IAAyBA,iBAAiB,kBAC3DsrC,GAAW,IAAyBtrC,iBAAiB,YACrD,GAAU,IAAyBA,iBAAiB,WA6BpD,GAAqB,UAAO8B,GAAG;mBAClB,EAAGvB,WAAYA,EAAMgE,MAAMgG;sBACxB,EAAGhK,WAAYA,EAAMgE,MAAMC;EAG3C+mC,GAAgB,UAAOzpC,GAAG;eACjB,EAAGvB,WAAYA,EAAMgE,MAAMK;wBAClB,EAAGrE,WAAYA,EAAMW,MAAMoJ;qBAC9B,EAAG/J,WAAYA,EAAMU,KAAKsJ;wBACvB,EAAGhK,WAAYA,EAAMW,MAAMsM;EAG7C,GAAW,UAAO1L,GAAuB;eAChC,EAAGqjC,WAAaA,EAAQ,QAAU;EAQpCqG,GAAc,EAAGvkC,OAAMo+B,mBAAkBC,qBAAoBt3B,WACtE,MAAMvN,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXvK,GAAQ,IAAAC,YACR+kC,GAAiB,IAAA59B,QAAuB,OACvC69B,EAAqBC,IAA0B,IAAAhjC,WAAS,IACxDijC,EAAWC,IAAgB,IAAAljC,UAC9B6iC,GAAoBI,WAAa,WAE9BE,EAAcC,IAAmB,IAAApjC,UAAS6iC,GAAoBM,eAAgB,IAC9EE,EAAWC,IAAgB,IAAAtjC,aAC3BujC,EAAaC,IAAkB,IAAAxjC,YAChCyjC,GAAe,QAAgB/0B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,iBAC1Eg1B,GAAe,QAAgBh1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,iBAC1Ei1B,GAAW,QAAgBj1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,aACtEk1B,GAAsB,QAAgBl1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,wBACjFqqB,GAAY,QAAgBrqB,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,cACvEm1B,GAAmB,QAAgBn1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,qBAC9Eo1B,GAAU,QAAgBp1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,sBACrEq1B,GAAoB,QAAgBr1B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,sBAC/EkK,GAAS,QAAe,EAAAC,MAAMza,UAAU0a,WAG9CgqB,EAAej8B,SAASgI,MAAOnI,IAC3BP,OAAOC,KAAKM,GAAGL,QAAS69B,IACpB1/B,EAAKoX,SAASsoB,EAAgCx9B,EAAEw9B,QAIxD,MAAMC,GAAY,IAAAC,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,eAC1D,IAAAiF,WAAU,KACD2gC,GACD3/B,EAAKoX,SAAS,eAAe,IAElC,CAACpX,EAAM2/B,IAEV,MAAMljB,GAAY,IAAAmjB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,cACpD4iB,GAAU,IAAAijB,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,YAClD8lC,GAA0B,IAAAj3B,SAAQ,IAC7B6T,GAAaE,IAAW,EAAAmjB,GAAA,GAAQ,IAAIxuB,KAAKmL,GAAY,IAAInL,KAAKqL,IACtE,CAACF,EAAWE,IAETojB,GAAmB,IAAAn3B,SACrB,IAAM,CACF,CAAErD,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,qBAAuBqZ,MAAO,UAChE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mBAAqBqZ,MAAO,SAC9D,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oBAAsBqZ,MAAO,WAEnE,CAACla,IAGCwmC,GAAgB,IAAAp3B,SAA4B,KAC9C,MAAMlE,EAA+B,GAgBrC,OAdIy6B,GAAYA,EAASt1B,UAAYs1B,EAASjT,YAC1CxnB,EAAIkc,KAAK,SAGblc,EAAIkc,KAAK,QAELse,GAAgBA,EAAar1B,UAC7BnF,EAAIkc,KAAK,UAGTwe,GAAuBA,EAAoBv1B,UAC3CnF,EAAIkc,KAAK,mBAGNlc,GACR,CAAC06B,EAAqBF,EAAcC,IAEjC3wB,GAAU,IAAApQ,aACXqQ,GACG5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,oBAC9E,CAACwJ,EAAUrK,IAGTymC,GAAa,IAAA7hC,aACfsH,MAAOrL,IACH,MAAMiT,EAAQtN,EAAKqK,MAAM,SACzB,GAAKiD,EACL,UACU,UAAK2B,KAAKgxB,WAAW5lC,EAAI,aAAciT,EACjD,CAAE,MAAO9H,GACDgJ,GAASA,EAAQhJ,EACzB,GAEJ,CAACxF,EAAMwO,IAgBL0xB,GAAe,IAAAt3B,SACjB,IAAM,CACF,CACI8K,MAAO,QACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,6BAEhCglC,GAAoBA,EAAiBx1B,UAAYw1B,EAAiBnT,WAChE,CACI,CACIxY,MAAO,eACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,kCAGxC,MACFilC,GAAWA,EAAQz1B,UAAYy1B,EAAQpT,WACrC,CACI,CACIxY,MAAO,MACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAEhCklC,GAAqBA,EAAkB11B,SACrC,CACI,CACI6J,MAAO,aACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,gCAGxC,IAEV,GACN,CACIqZ,MAAO,QACPnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAGxC,CAACilC,EAAS9lC,EAAM+lC,EAAmBF,KAEhCc,EAAaC,IAAkB,IAAA5kC,UAAsB0kC,EAAaA,EAAavjC,OAAS,IAEzF0jC,GAAoB,IAAAjiC,aACrB4Q,IAEG,OADAoxB,EAAepxB,GACPA,EAAO0E,OACX,IAAK,QACD1T,EAAKoX,SAAS,QAAS,SAAW2R,EAAEuX,QAAU,6BAA8B,WAC5E,MACJ,IAAK,eACDtgC,EAAKoX,SAAS,QAAS,gBACvB,MACJ,IAAK,QACDpX,EAAKoX,SAAS,QAAS,IACvB,MACJ,IAAK,MACDpX,EAAKoX,SAAS,QAAS,OACvB,MACJ,IAAK,aACDpX,EAAKoX,SAAS,QAAS,gBAInC,CAACpX,IAGCugC,GAAQ,IAAAX,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,UAChDymC,GAAU,IAAAZ,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,YAElD0mC,GAAkB,IAAAriC,aACnB8D,GACGw8B,EAAcxL,IACVsL,GAAuB,GACV,UAATtL,GAA6B,WAATA,GACpB4L,EAAayB,GAEJ,WAATrN,GAA8B,WAATA,GACrB8L,EAAewB,GAET,WAANt+B,GACAlC,EAAKoX,SAAS,QAAS,MACV,WAAT8b,GACAlzB,EAAKoX,SAAS,UAAW2nB,IAEhB,UAAN78B,GACPlC,EAAKoX,SAAS,UAAW,MACZ,WAAT8b,GACAlzB,EAAKoX,SAAS,QAASynB,IAEd,WAAN38B,IACM,WAATgxB,GACAlzB,EAAKoX,SAAS,UAAW2nB,GAEhB,UAAT7L,GACAlzB,EAAKoX,SAAS,QAASynB,IAGxB38B,IAEf,CAACs+B,EAASxgC,EAAMugC,EAAOxB,EAAaF,IAGxC,OACI,UAAC,GAAO,CAACl4B,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMC,EAAC,WAC5C,SAAC,GAAU,CACPuN,OAAQ,IACR/Q,KAAM,QACNgnC,aAAc,CAAEl2B,MAAO,OAAQ7E,OAAQ,KACvC7E,QAASnB,EAAKmB,QACdmM,MAAOtN,EAAKqK,MAAM,SAClB22B,YAAa,EACbC,kBAAgB,EAChBC,cAAe,CACXC,KAAM,GACNC,YAAa,MAGrB,SAAC,GAAS,CACNt2B,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,iBAChCN,KAAM,QACNoH,QAASnB,EAAKmB,QACdwX,MAAO,CAAEC,UAAU,MAEvB,UAAC,GAAO,CAACjS,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMgG,GAAE,UAC5Cu8B,IACG,SAAC,GAAO,CACJpxB,QAASjV,EAAKY,cAAc,CAAEC,GAAI,uCAClCF,QAAS,WAGjB,UAAC,GAAO,CAACkD,IAAK/D,EAAMgE,MAAMK,GAAIP,EAAG,SAAQ,WACrC,SAAC,GAAa,CACV2J,KAAM/G,EAAKqK,MAAM,UAAY,OAAS,WACtCS,OAAQ,IACRD,MAAO,OACPtF,MAAO,0BACPpE,QAASnB,EAAKmB,QACdpH,KAAM,YACN4e,MAAO,CAAEC,UAAU,GACnByoB,cAAe,UAEnB,SAAC,GAAa,CACVt6B,KAAM/G,EAAKqK,MAAM,UAAY,OAAS,WACtCS,OAAQ,IACRD,MAAO,OACPtF,MAAO,wBACPpE,QAASnB,EAAKmB,QACdpH,KAAM,UACN4e,MAAO,CAAEC,UAAU,SAG3B,SAAC,GAAa,CACVzX,QAASnB,EAAKmB,QACd2J,OAAQ,IACR/Q,KAAM,SACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,qBAChCqZ,MAAO,cAKvB,UAAC,GAAO,CAAC/M,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMK,GAAE,WAC7C,SAAC,GAAQ,OAAiB,WAAToJ,GAAqBw3B,EAAmB,UACrD,SAAC,GAAO,CAACpkC,QAAS,OAAQsU,QAASjV,EAAKY,cAAc,CAAEC,GAAI,+BAEhE,SAAC,GAAgB,CACbyQ,OAAQ,IACRywB,aAAc,QACd50B,UAAW,MACX+M,MAAO+qB,EACP1kC,KAAK,QACLmN,SAAUu5B,EACV1wB,QAASgwB,KAEG,WAAdtB,GAAwC,WAAdA,KACxB,SAAC,GAAS,CACN3zB,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChCN,KAAM,UACNoH,QAASnB,EAAKmB,WAGN,UAAds9B,GAAuC,WAAdA,KACvB,UAAC,GAAO,CAAC93B,UAAW,SAAQ,WACxB,SAAC,GAAU,UAAEnN,EAAKY,cAAc,CAAEC,GAAI,4BACtC,UAAC,GAAO,CAACgD,IAAK/D,EAAMgE,MAAMK,GAAIP,EAAG,WAAU,WACvC,SAAC,GAAO,CAACgzB,KAAM,IAAKtlB,OAAQ,YAAW,UACnC,SAAC,GAAc,CACXmwB,UAAQ,EACRlhC,KAAM,QACNmN,SAAUm5B,EACVtwB,QAASmwB,EACTxsB,MAAOysB,EACPvnB,UAAQ,EACRO,SAAWD,GAAMA,EAAE3T,MACnB0T,SAAWC,GAAMA,EAAExF,WAGH,UAAtBysB,EAAYzsB,OAA2C,UAAtBysB,EAAYzsB,SAC3C,SAAC,GAAO,CAAC0c,KAAM,IAAG,UACd,SAAC,GAAS,CACNvlB,MAAO,OACPC,OAAQ,IACR/Q,KAAM,QACNoH,QAASnB,EAAKmB,QACdqS,SAAgC,UAAtB2sB,EAAYzsB,gBAO7CurB,GAAcwC,kBACX,SAAC,GAAS,CACN32B,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChC2B,YAAaxC,EAAKY,cAAc,CAAEC,GAAI,uCACtCN,KAAM,aACNoH,QAASnB,EAAKmB,WAGtB,SAAC67B,GAAsB,CACnBlyB,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,uBAChC8G,QAASnB,EAAKmB,QACdpH,KAAM,SACNgb,SAAU,CACN9F,KAAM,UAAKA,SAGnB,SAAC,GAAkB,WACf,SAAC1O,EAAW,CACR/C,KAAM,UACNsD,OAAQ,CAAC,CAAE+O,SAAU,SACrB1P,IAAKm+B,EACL19B,cAAey9B,GAAoBqD,UAG3C,SAAC,GAAiB,CACdzG,UAAQ,EACR95B,QAASnB,EAAKmB,QACdpH,KAAK,eACLwL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,uBAChCsnC,YAAU,EACVC,aAnQcC,GAC1B,UAAK99B,QACA8X,KAAK,CACF5d,MAAO4jC,EACPC,QAAS,CAAC,CAAE/nC,KAAM,OAAQ2Z,MAAO,gBAAiBquB,SAAU,SAE/DrjC,KAAMgG,GACHA,GAAK7F,QAAQ2L,KAAK9O,IAAKX,IACnB,MAAM4vB,EAAQvW,EAAOpS,KAAM41B,GAAMA,EAAEp6B,OAASzC,EAAEyC,MAC9C,MAAO,CAAE1D,IAAKiB,EAAEjB,IAAKoC,MAAOnB,EAAEmB,MAAOgN,KAAMyhB,GAAOzhB,KAAMjP,MAAO0wB,GAAO1wB,aA4P1E,UAAC,GAAO,CAAC0M,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMK,GAAE,WAC7C,SAAC,GAAgB,CACbmN,OAAQ,IACR5D,SAAWhF,IACHA,GACAlC,EAAKoX,SAAS,YAAa9d,EAAMW,MAAM+nC,OACvChiC,EAAKoX,SAAS,UAAW9d,EAAMW,MAAMsM,SAErCvG,EAAKoX,SAAS,YAAa,MAC3BpX,EAAKoX,SAAS,UAAW,OAE7BwnB,EAAgB18B,IAEpBwR,MAAOirB,EACP5kC,KAAK,GACLwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChCqZ,MAAO,WAInB,UAAC,GAAQ,OAAQirB,EAAY,WACzB,SAAC,GAAU,CACP7zB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,YACNwL,MAAO,sBACPiT,aAAcxY,EAAKqK,MAAM,cAAgB/Q,EAAMW,MAAM+nC,SAEzD,SAAC,GAAU,CACPl3B,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,UACNwL,MAAO,4BACPiT,aAAcxY,EAAKqK,MAAM,YAAc/Q,EAAMW,MAAMsM,eAI/D,SAAC,GAAa,CACVuE,OAAQ,IACRvF,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oBAChC8G,QAASnB,EAAKmB,QACdpH,KAAM,YACN4nC,YAAU,EACV30B,UAAQ,EACRi1B,MAAO,CACHC,YAAalC,EACbjrB,SAAU,CACNoL,KAAM,UAAKA,KACXgY,SAAU,UAAKA,SACfgK,MAAO,UAAKA,OAEhB3zB,cAGR,SAAC,GAAU,UAAEhV,EAAKY,cAAc,CAAEC,GAAI,0BACtC,SAAC,GAAoB,CACjBiT,MAAOtN,EAAKqK,MAAM,SAClB2C,UAAQ,EACRjT,KAAM,aACNkmC,WAAYA,EACZnI,aACI,IACQoH,GAAgB3K,EAAY,CAAC,YAAc,MAC5C,EAAAvI,KAAK+L,MAAMC,2BAA2BzD,GAAW0D,SAG5DljB,SAAU,CACN9F,KAAM,UAAKA,KACXkpB,SAAU,UAAKA,SACfD,MAAO,UAAKA,OAEhBkK,gBAAiB5zB,EACjBtB,cAAe,IAAMkxB,GAAiB,GACtChxB,gBAAiB,IAAMgxB,GAAiB,GACxCiE,cAAehE,GAAoBiE,aAAe,MAEtD,SAACgC,GAAa,WACV,SAACD,GAAQ,CACLG,cAAwB,WAATz9B,EACf0S,QAAQ,SAAC,GAAU,UAAEjgB,EAAKY,cAAc,CAAEC,GAAI,sBAC9CwT,SACI,UAAC,GAAO,CAAClH,UAAW,SAAUtJ,IAAK/D,EAAMgE,MAAMC,EAAC,WAC5C,SAACy/B,GAAsB,CACnBlyB,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,SACNgb,SAAU,CACN9F,KAAM,UAAKA,SAGnB,SAAC,GAAU,UAAEzV,EAAKY,cAAc,CAAEC,GAAI,4BACtC,SAAC,GAAoB,CACjBiT,MAAOtN,EAAKqK,MAAM,SAClB2C,UAAQ,EACRjT,KAAM,aACNkmC,WAAYA,EACZnI,aACI,IACQoH,GAAgB3K,EAAY,CAAC,YAAc,MAC5C,EAAAvI,KAAK+L,MAAMC,2BAA2BzD,GAAW0D,SAG5DljB,SAAU,CACN9F,KAAM,UAAKA,KACXkpB,SAAU,UAAKA,SACfD,MAAO,UAAKA,OAEhBkK,gBAAiB5zB,EACjBtB,cAAe,IAAMkxB,GAAiB,GACtChxB,gBAAiB,IAAMgxB,GAAiB,GACxCiE,cACIhE,GAAoBoG,WAAa,CAACpG,EAAmBoG,YAAc,aAO3F,SAAC,GAAU,UAAEjrC,EAAKY,cAAc,CAAEC,GAAI,6BACtC,4BACI,SAAC,GAAa,CACVyQ,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,YACNwhC,aAAc,WACd+F,oBAAkB,EAClBiB,U,EACAxyB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mCAChCqZ,MAAO,UAIT,WAAT3M,IACG,iCACI,SAAC,GAAa,CACV+D,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,YACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,sBAChCqZ,MAAO,WAInB,SAAC,GAAa,CACV5I,OAAQ,IACR3J,QAASnB,EAAKmB,QACdpH,KAAM,cACNwhC,aAAc,WACd+F,oBAAkB,EAClBvxB,QAAS,CACL,CACIxK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,wBAChCqZ,MAAO,QAGfF,UAAWmsB,iBC9jBrC,GAAqB,CAACn1B,EAAyB1Q,KAA2C,IACzF0Q,EACHq4B,WAAW,SAAsBr4B,EAAKq4B,WACtCC,aAAct4B,EAAKs4B,aAAet4B,EAAKs4B,aAAahpC,IAAM,GAC1D6lC,UAAWn1B,EAAKm1B,UAAY,IAAM,IAClCoD,YAAav4B,EAAKu4B,YAAc,IAAM,QACnC,IAAAC,2CAA0Cx4B,EAAM,QAAUwV,GAAkBA,EAAI7d,KAAK,MACxFrI,IAAKA,GAAO,GACZ0D,KAAM,YAGGknC,GAAqB,EAAG7nC,eAAcqmC,WAAUvI,cACzD,MAAMnhC,GAAO,EAAAC,EAAA,KACP8K,GAAkB,EAAA0S,GAAA,KAClBjX,GAAO,IAAAsB,WACPuC,GAAW,WACVw/B,EAAgBC,IAAqB,IAAA9nC,WAAS,IAC9CsC,EAAS60B,IAAc,IAAAn3B,WAAS,IAChCinC,EAAerE,IAAoB,IAAA5iC,WAAS,GAE7CiG,GAAS,IAAAm+B,UAAS,CAAEz+B,QAASnB,EAAKmB,UAClCmW,GAAU,IAAA1O,SACZ,IAAM,EAAA+7B,oBAAoBP,UAAU,GAAmB3iC,EAA6Bk5B,GAAS7gC,MAAMwL,QACnG,CAACq1B,GAAS7gC,IAAK2H,KAGnB,IAAAzC,WAAU,KACN,GAAI27B,EAAS,CACT,MAAM4I,EAAwB,EAAAhnC,MAAMC,KAAKC,eAAek+B,EAAQr+B,cAChE,kBACKgR,MAAM/I,EAAgBM,QACtBnG,KAAMgG,IACH1E,EAAKoB,MAAM,CACPlF,MAAOy+B,EAAQz+B,MACfunC,UAAW9I,EAAQ8I,UACnB9mB,QAASge,EAAQhe,QACjBF,UAAWke,EAAQle,UACnB+jB,QAAS7F,EAAQ6F,QACjBG,OAAQhG,EAAQgG,OAChBE,QAASlG,EAAQkG,QACjB6C,MACIH,GAAyB5I,EAAQ+I,MAC3B,CACIlmC,KAAM,UACNnD,GAAIsgC,EAAQtgC,GACZgC,UAAW6P,OAAOq3B,SAEtBtnC,EACVskC,MAAO5F,EAAQ4F,MACfK,UAAWjG,EAAQiG,UACnBgE,OAAQjK,EAAQiK,aAAU3oC,EAC1B4oC,OAAQlK,EAAQkK,aAAU5oC,EAC1B4nC,WAAYlJ,EAAQkJ,iBAAc5nC,EAClC4mC,UAAWlI,EAAQmJ,UAAUpoC,IAAK+c,IAAO,CAAG3e,IAAK2e,EAAG3e,IAAKoC,MAAOuc,EAAGvc,SACnE4mC,aACInI,EAAQmI,cAAgBnI,EAAQmI,aAAanmC,OAAS,EAChD,CAAE7C,IAAK6gC,EAAQmI,aAAa,GAAGhpC,IAAKoC,MAAOy+B,EAAQmI,aAAa,GAAG5mC,YACnED,EACVqR,MAAO5I,EAAI7F,SAEfykC,GAAkB,KAErBxkC,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,qBAEzF,GACD,CAACsgC,EAAS36B,EAAMuE,EAAgBM,OAAQhB,EAAUrK,IAErD,MAAM6kC,GAAqB,IAAAz1B,SAAmD,KAC1E,IAAK+xB,EAAS,OACd,IAAI8D,EAA2C,SAU/C,OARIA,EADA9D,EAAQ4F,OAAS5F,EAAQ6F,QACb,SACL7F,EAAQ6F,QACH,SACL7F,EAAQ4F,MACH,QAEA,SAET,CACH9B,YACAE,eAAgBhE,EAAQiG,aAAejG,EAAQkG,QAC/CyB,YAAa3H,EAAQoJ,eACrBU,WAAY9J,EAAQ8J,WACpB/C,MAAM,IAAAsC,6BAA4BrJ,KAEvC,CAACA,IAEEv6B,GAAW,IAAAhC,aACZoM,IACGmoB,GAAW,GACX,UAAK5uB,QACA6Z,OAAqC,GAAmBpT,EAAMmwB,GAAS7gC,KAAM,CAC1E+K,OAAQN,EAAgBM,OACxBC,OAAQ,EAAA2lB,OAAOwZ,SAElBvlC,KAAMgG,IACHw+B,IACAr/B,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO,4BACP2+B,KAAM,CACF3+B,MAAO,uBACP6K,IAAK1L,EAAI7F,OAAO/C,WAK/BgD,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAEhF8d,QAAQ,KACD5T,EAAgBM,OAAOoT,SAC3B0a,GAAW,MAGvB,CAACpuB,EAAgBM,OAAQhB,EAAUrK,EAAMmhC,GAAS7gC,IAAKopC,IAG3D,OACI,SAACV,GAAwB,CACrB9+B,UAAWi3B,GAAStgC,GACpBmD,KAAM,UACNX,aAAcA,EACduD,SAAUJ,EAAKkB,aAAad,GAC5BJ,KAAMA,EACNlC,QAASA,EACT2kC,cAAeA,EACfnrB,QAASA,EAAO,SACf+rB,EAAiB,MACd,SAACkB,GAAW,CACRx9B,KAAM,SACN/G,KAAMA,EACNo+B,iBAAkBA,EAClBC,mBAAoBA,OC1IlC,GAAa,IAAyBtlC,iBAAiB,cACvD,GAAQ,IAAyBA,iBAAiB,SAQlD,GAAqB,CACvByR,EACA1Q,KACuB,IACpB0Q,EACHq4B,WAAW,SAAsBr4B,EAAKq4B,WACtClD,UAAWn1B,EAAKm1B,UAAY,IAAM,IAClCoD,YAAav4B,EAAKu4B,YAAc,IAAM,QACnC,IAAAC,2CAA0Cx4B,EAAM,QAAUwV,GAAkBA,EAAI7d,KAAK,MACxFrI,IAAKA,GAAO,GACZ0D,KAAM,mBAGGsnC,GAA4B,EACrCjoC,eACAqmC,WACA3T,MAAOwV,MAEP,MAAMxV,EAAQwV,GAA0BC,SAASC,qBAC3CzrC,GAAO,EAAAC,EAAA,KACP8K,GAAkB,EAAA0S,GAAA,MACjBksB,EAAmBC,IAAsB,IAAA5nC,WAAS,GACnDwE,GAAO,IAAAsB,WACPuC,GAAW,WACVw/B,EAAgBC,IAAqB,IAAA9nC,WAAS,IAC9CsC,EAAS60B,IAAc,IAAAn3B,WAAS,IAChCinC,EAAerE,IAAoB,IAAA5iC,WAAS,IAEnD,IAAAwD,WAAU,KACN,GAAIuwB,EAAO,CACP,MAAMgU,EAAwB,EAAAhnC,MAAMC,KAAKC,eAAe8yB,EAAMjzB,cAC9D,kBACKgR,MAAM/I,EAAgBM,QACtBnG,KAAMgG,IACH1E,EAAKoB,MAAM,CACPlF,MAAOqzB,EAAMrzB,MACbygB,QAAS4S,EAAM5S,QACfF,UAAW8S,EAAM9S,UACjB+jB,QAASjR,EAAMiR,QACfG,OAAQpR,EAAMoR,OACdE,QAAStR,EAAMsR,QACf6C,MACIH,GAAyBhU,EAAMmU,MACzB,CACIlmC,KAAM,iBACNnD,GAAIk1B,EAAMl1B,GACVgC,UAAW6P,OAAOq3B,SAEtBtnC,EACV2kC,UAAWrR,EAAMqR,UACjB5kC,YAAauzB,EAAMvzB,kBAAeC,EAClC4mC,UAAWtT,EAAMuU,UAAUpoC,IAAK+c,IAAO,CAAG3e,IAAK2e,EAAG3e,IAAKoC,MAAOuc,EAAGvc,SACjEgpC,eAAgB3V,EAAM2V,eACtB53B,MAAO5I,EAAI7F,SAEfykC,GAAkB,KAErBxkC,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,qBAEzF,GACD,CAACkK,EAAgBM,OAAQhB,EAAU0rB,EAAOvvB,EAAMxG,IAEnD,MAAM6kC,GAAqB,IAAAz1B,SAAuD,KAC9E,IAAK2mB,EAAO,OACZ,IAAIkP,EAA2C,SAU/C,OARIA,EADAlP,EAAMgR,OAAShR,EAAMiR,QACT,SACLjR,EAAMiR,QACD,SACLjR,EAAMgR,MACD,QAEA,SAET,CACH9B,YACAE,eAAgBpP,EAAMqR,aAAerR,EAAMsR,QAC3CyB,YAAa/S,EAAMwU,eACnBrC,MAAM,IAAAsC,6BAA4BzU,GAClCiQ,MAAOjQ,EAAM2V,eAAe1F,QAEjC,CAACjQ,IAEEnvB,GAAW,IAAAhC,aACZoM,IACGmoB,GAAW,GACX,UAAK5uB,QACA6Z,OAA4C,GAAmBpT,EAAM+kB,GAAOz1B,KAAM,CAC/E+K,OAAQN,EAAgBM,OACxBC,OAAQ,EAAA2lB,OAAOwZ,SAElBvlC,KAAMgG,IACHw+B,IACAr/B,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO,4BACP2+B,KAAM,CACF3+B,MAAO,uBACP6K,IAAK1L,EAAI7F,OAAO/C,WAK/BgD,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAEhF8d,QAAQ,KACD5T,EAAgBM,OAAOoT,SAC3B0a,GAAW,MAGvB,CAACpuB,EAAgBM,OAAQhB,EAAU0rB,GAAOz1B,IAAKN,EAAM0pC,IAGnDzhC,GAAS,IAAAm+B,UAAS,CAAEz+B,QAASnB,EAAKmB,UAClCmW,GAAU,IAAA1O,SACZ,IACI,EAAAu8B,2BAA2Bf,UACvB,GAAmB3iC,EAAiD8tB,GAAOz1B,MAC7EwL,QACN,CAACiqB,GAAOz1B,IAAK2H,IAGjB,OACI,iCACI,SAAC+gC,GAAwB,CACrB9+B,UAAW6rB,GAAOl1B,GAClBmD,KAAM,iBACNX,aAAcA,EACduD,SAAUJ,EAAKkB,aAAad,GAC5BJ,KAAMA,EACNlC,QAASA,EACTwZ,QAASA,EACTmrB,cAAeA,EAAa,SAC3BY,EAAiB,MACd,SAAClF,GAA+B,CAC5Bp3B,KAAM,SACN/G,KAAMA,EACNo+B,iBAAkBA,EAClBC,mBAAoBA,OAIhC,SAAC,GAAK,CACFthC,KAAMomC,EACNtmC,aAAc,IAAMumC,GAAmB,GACvClnC,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,gBAChCgF,QAAS,CACL,CACIpF,MAAO,SACPsF,aAAc,IAAM6jC,GAAmB,GACvC9jC,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,mBAEvC,CACIJ,MAAO,SACPsF,aAAcS,EAAKkB,aAAad,GAChCtC,QAASA,EACTwB,SAAU9F,EAAKY,cAAc,CAAEC,GAAI,gBACnCgG,OAAQ,oBAEf,UACD,SAAC,GAAU,UACN7G,EAAKY,cAAc,CAChBC,GAAI,mD,0BClL5B,MAAM+qC,GAAiB,IAAyBrsC,iBAAiB,kBAC3D,GAAU,IAAyBA,iBAAiB,WACpD,GAAS,IAAyBA,iBAAiB,UACnD,GAAa,IAAyBA,iBAAiB,cACvD,GAAa,IAAyBA,iBAAiB,cAEvDssC,GAAgB,UAAOxqC,GAAG;oBACZ,EAAGvB,WAAYA,EAAMgE,MAAMgG;EAGlCgiC,GAA2B,EACpCvoC,OACAF,eACAuD,WACAmlC,aACAjmC,WACAU,OACAyiC,gBACAjlC,OACAgoC,kBACAC,iBACAnuB,cAEA,MAAM9d,GAAO,EAAAC,EAAA,KACPH,GAAQ,IAAAC,YACRmsC,GAAU,IAAAhlC,WACTilC,EAAeC,IAAoB,IAAApqC,YAEpCqqC,GAAqB,IAAAznC,aAAY,KACnCvB,KACD,CAACA,KAEJ,IAAAmC,WAAU,KACFjC,IACA2oC,EAAQrjC,aAAUpG,EAClB+D,EAAKoB,QACLwkC,OAAiB3pC,KAEtB,CAAC+D,EAAMjD,IAEV,MAAMyN,GAAO,IAAAo1B,UAAS,CAAEz+B,QAASnB,EAAKmB,WACtC,IAAAnC,WAAU,KACN,IAAI8mC,EAkBJ,OAhBI/oC,GACA4E,OAAOC,KAAK5B,EAAKqX,UAAU0uB,aAAazc,OAAQxnB,IAAO,CAAC,YAAa,WAAW+N,SAAS/N,IAAInF,OAAS,IAEtGmpC,EAAUE,WAAW,KACjB,UAAKjiC,QACAkiC,YAAY,CACTP,QAASA,EAAQrjC,QACjBrC,KAAM,IAAKwK,EAAMhN,QACjB0oC,YAAa1oC,IAEhBkB,KAAMgG,IACHghC,EAAQrjC,QAAUqC,EAAI7F,OAAO6mC,QAC7BE,EAAiB,IAAIt0B,SAE9B,MAEA,KACCw0B,GACAK,aAAaL,KAGtB,CAAC/oC,EAAMyN,EAAMhN,EAAMwC,IAEtB,MAAMlC,GAAU,IAAA8K,SACZ,IAAM65B,GAAiB+C,GAAmBC,EAC1C,CAACA,EAAgBD,EAAiB/C,IAGtC,OACI,SAAC2C,GAAc,CACXgB,UAAW,EACXjqC,SAAU,QACVY,KAAMA,EACNF,aAAcgpC,EACdQ,eAAa,EACbt2B,SACI,SAAC,GAAU,CACP7G,KAAK,cACLrN,KACI6pC,EAAQrjC,QACF,kCAAkCqjC,EAAQrjC,UAC1C,gCAAgC7E,IAE1Cw9B,QAAS,CAAEh/B,YAAaxC,EAAKY,cAAc,CAAEC,GAAI,qBACjDisC,OAAQ9sC,EAAKY,cAAc,CAAEC,GAAI,sBAGzC6B,MAAO1C,EAAKY,cAAc,CACtBC,GAAa,gBAATmD,EAAyB,oCAAsC,kCAEvE+oC,QAAQ,EACR5sB,QACI,UAAC,GAAO,CAAChT,UAAW,SAAU6nB,EAAG,WAAYnxB,IAAK/D,EAAMgE,MAAMgd,GAAE,UAC3DqrB,IACG,SAACN,GAAa,WACV,SAAC,GAAU,CAACprC,MAAO,QAASD,KAAM,IAAG,UAChC,EAAAwsC,GAAA,GAAUb,EAAe,IAAIr0B,MACxB9X,EAAKY,cACD,CACIC,GAAI,8BAER,CAAEosC,MAAM,EAAA3hC,GAAA,IAAW6gC,EAAe,WAEtCnsC,EAAKY,cACD,CACIC,GAAI,wBAER,CACImC,KAAMhD,EAAKktC,WAAWf,EAAe,CACjCgB,IAAK,UACLC,MAAO,UACPC,KAAM,YAEVJ,MAAM,EAAA3hC,GAAA,IAAW6gC,EAAe,gBAM1D,UAAC,GAAO,YACJ,SAAC,GAAM,CACH1rC,MAAO,SACPsL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,kBAChCuC,QAASipC,KAEb,SAAC,GAAM,CACH5rC,MAAO,SACPsL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChCuC,QAAS2oC,EACT/xB,UAAW8D,GAAWxZ,EACtB+a,OAAQ2sB,KAEZ,SAAC,GAAM,CACHvrC,MAAO,QACPsL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,mBAChCuC,QAAS,IAAMwD,IACfC,OAAQ,GAAG7C,YACXgW,UAAW8D,GAAWxZ,EACtB+a,OAAQ4sB,UAGV,UAEd,iBAAMrlC,SAAUA,EAAQ,SAAGd,O,eCpKvC,MAAMwnC,GAAmB,IAAyB/tC,iBAAiB,iBAC7D,GAAa,IAAyBA,iBAAiB,WACvDguC,GAAW,IAAyBhuC,iBAAiB,SAY9CiuC,GAAgB,EACzBjqC,OACAF,eACAX,QACAiF,UACA8lC,iBACA7mC,WACArG,OAAO,gBAEP,MAAMP,GAAO,EAAAC,EAAA,KACb,OACI,UAACstC,GAAQ,CACLhqC,KAAMA,EACNF,aAAcA,EACdX,MAAOA,GAAS1C,EAAKY,cAAc,CAAEC,GAAI,oBACzCgF,QAAS,CACL,CACIC,UAAU,SAAC,IAAgB,CAACjF,GAAG,kBAC/BJ,MAAO,SACPsF,aAAc,IAAM1C,KAExB,CACIwD,OAAQ,uBACRf,UAAU,SAAC,IAAgB,CAACjF,GAAG,oBAC/BJ,MAAO,SACPsF,aAAc,KACV1C,IACAuD,OAGX,WACD,SAAC,GAAU,CACPjG,QAAS,UACTsU,QAASw4B,GAAkBztC,EAAKY,cAAc,CAAEC,GAAI,2BAExD,SAACysC,GAAgB,CACblF,aAAesF,GAAuB,UAAS9rC,SAAS+rC,aAAaD,GACrEvF,YAAY,EACZxgC,QAASA,EACT6L,UAAU,EACVpC,YAAapR,EAAKY,cAAc,CAAEC,GAAI,oBACtCN,KAAMA,QCjDhB,GAAY,IAAyBhB,iBAAiB,aACtD,GAAgB,IAAyBA,iBAAiB,iBAC1DquC,GAAe,IAAyBruC,iBAAiB,gBACzD,GAAU,IAAyBA,iBAAiB,WACpD,GAAa,IAAyBA,iBAAiB,cAavDsuC,GAAoB,UAAOxsC,GAAG;qBACf,EAAGvB,WAAYA,EAAMgE,MAAMgd;EAGnCgtB,GAAgB,EAAGvqC,OAAMF,eAAcuD,eAChD,MAAM5G,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXy8B,GAAU,QAAe,EAAApM,SAASt6B,UAAU2tC,eAC5CvnC,GAAO,IAAAsB,SAAsB,CAC/BV,cAAe8E,UACX,MAAMoM,EAAM,IAAIR,KAChB,MAAO,CACHk2B,aAAc,GAAG,EAAAjrC,MAAMC,KAAKkqC,WAAW50B,OAAQ,IAAA21B,mBAAkB31B,EAAI41B,gBAAe,IAAAD,mBAAkB31B,EAAI61B,gBAC1GC,aAAa,cAKnBC,EAAkB7nC,EAAKkB,aAAcsJ,IACvCpK,EAASoK,MAGb,IAAAxL,WAAU,KACFjC,GACAiD,EAAKoB,SAEV,CAACpB,EAAMjD,IAEV,MAAM6qC,GAAc,IAAAhI,UAAS,CAAEz+B,QAASnB,EAAKmB,QAASpH,KAAM,gBACtD+tC,GAAY,IAAAl/B,SAAQ,IACf,GAAG03B,cAAoBsH,IAC/B,CAACA,EAAatH,IAEjB,OACI,UAAC,GAAS,CACNvjC,KAAMA,EACNF,aAAcA,EACduD,SAAUynC,EACV7qC,UAAW,QACXd,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,2BAChCgF,QAAS,CACL,CACIC,UAAU,SAAC,IAAgB,CAACjF,GAAG,kBAC/BJ,MAAO,SACPsF,aAAc,IAAM1C,KAExB,CACIyC,UAAU,SAAC,IAAgB,CAACjF,GAAG,2BAC/BJ,MAAO,QACPsF,aAAc,KACV1C,IACAgrC,KAEJr0B,UAAWxT,EAAKqK,MAAM,kBAE7B,WACD,SAAC,GAAa,CACVsO,MAAO,CAAEC,UAAU,GACnBrT,MAAO,wBACPpE,QAASnB,EAAKmB,QACdpH,KAAM,kBAEV,UAAC,GAAO,CAACqD,EAAG,WAAU,WAClB,SAACgqC,GAAY,CACT7hC,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,qBAChCqZ,MAAOo0B,EACP5gC,SAAU,IAAM,KAChB4D,OAAQ,IACRD,MAAO,UAEX,SAACw8B,GAAiB,WACd,SAAC,GAAU,CACPf,OAAQ,mBACRp9B,KAAM,YACNgyB,aAAc,UACdt+B,QAAS,KACLmrC,UAAUC,UAAUC,UAAUH,GAAWppC,KAAK,KAC1CmF,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,4CCnFlE,GAAsBmQ,IAA6C,IAClEA,EACHq4B,WAAW,SAAsBr4B,EAAKq4B,WACtCC,aAAct4B,EAAKs4B,aAAet4B,EAAKs4B,aAAahpC,IAAM,GAC1D6lC,UAAWn1B,EAAKm1B,UAAY,IAAM,IAClCoD,YAAav4B,EAAKu4B,YAAc,IAAM,QACnC,IAAAC,2CAA0Cx4B,EAAM,QAAUwV,GAAkBA,EAAI7d,KAAK,MACxF3E,KAAM,YAGG0qC,GAAqB,EAAGnrC,OAAMF,eAAcsrC,eACrD,MAAM3uC,GAAO,EAAAC,EAAA,KACP8K,GAAkB,EAAA0S,GAAA,MACjBmxB,EAAqBC,IAA0B,IAAA7sC,UAAwC,OACvF8sC,EAAqBC,IAAwB,IAAA/sC,WAAS,IACtDgsC,EAAcgB,IAAmB,IAAAhtC,aACjCosC,EAAaa,IAAkB,IAAAjtC,YAChCktC,GAAW,KAAAC,aAAY,EAAAzU,SAASt6B,UAAUu6B,sBAC1Cn0B,GAAO,IAAAsB,SAA2B,CACpCV,cAAe8E,UACX,IAAIkjC,EAAmB,IAAIt3B,KAC3Bs3B,EAAiBC,WAAWD,EAAiBjB,aAAe,GAAK,GAAK,GACtEiB,EAAqD,IAAlCA,EAAiBjB,cAAqB,EAAAmB,GAAA,GAASF,EAAkB,GAAKA,EACzF,IAAIG,EAAiBH,EAErB,OADAG,GAAiB,EAAAD,GAAA,GAASC,EAAgB,GACnC,CACH7sC,MAAO,GACPyjC,UAAkC,IAAvB+I,EAAS/I,UACpBoD,YAAoC,IAAvB2F,EAAS/I,UACtBljB,WAAW,EAAA3X,GAAA,IAAW8jC,EAAkB,oBACxCjsB,SAAS,EAAA7X,GAAA,IAAWikC,EAAgB,oBACpClG,UAAW,OAIjBh/B,GAAW,WACV4hC,EAAgBuD,IAAqB,IAAAxtC,WAAS,IAC9CgqC,EAAiByD,IAAsB,IAAAztC,WAAS,IAChDinC,EAAerE,IAAoB,IAAA5iC,WAAS,IAEnD,IAAAwD,WAAU,KACFjC,GACA,kBACKuQ,MAAM/I,EAAgBM,QACtBnG,KAAMgG,IACH1E,EAAKoX,SAAS,QAAS1S,EAAI7F,UAE9BC,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,uBAG1F,CAACkK,EAAgBM,OAAQhB,EAAU7D,EAAMxG,EAAMuD,IAElD,MAAM0E,GAAS,IAAAm+B,UAAS,CAAEz+B,QAASnB,EAAKmB,UAClCmW,GAAU,IAAA1O,SACZ,IAAM,EAAAsgC,sBAAsB9E,UAAU,GAAmB3iC,IAA8B6D,QACvF,CAAC7D,IAGCrB,GAAW,IAAAhC,aACZ+qC,GACGnpC,EAAKkB,aAAcsJ,IACTA,EAAKq4B,WAAuC,IAA1Br4B,EAAKq4B,UAAUlmC,QAAkBwsC,GAIzDH,GAAkB,GAClB,UAAKjlC,QACAizB,OAAuC,GAAmBxsB,GAAO,CAC9D3F,OAAQN,EAAgBM,OACxBC,OAAQ,EAAA2lB,OAAOwZ,SAElBvlC,KAAMgG,IACHyjC,IACAtkC,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO,4BACP2+B,KAAM,CACF3+B,MAAO,uBACP6K,IAAK1L,EAAI7F,OAAO,GAAG/C,WAKlCgD,MAAO0G,IACJ3B,EACI,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAG3E8d,QAAQ,KACL6wB,GAAkB,MA3BtBX,EAAuB,YAF/BroC,GAgCJ,CAAC6D,EAAU7D,EAAMxG,EAAM2uC,IAGrB5C,GAAa,IAAAnnC,aACf,CAACopC,EAAsBI,EAAqBuB,IACxCnpC,EAAKkB,aAAcsJ,IACf,MAAM4+B,EAAU,GAAmB5+B,GACnC,KAAM4+B,EAAQvG,WAA0C,IAA7BuG,EAAQvG,UAAUlmC,QAAkBwsC,GAI3D,OAHAd,EAAuB,YACvBG,EAAgBhB,QAChBiB,EAAeb,GAGnBqB,GAAmB,GACnB,UAAKllC,QACAkiC,YACG,CACIjmC,KAAMopC,EACNlD,YAAa,UACbsB,eACAI,eAEJ,CAAE/iC,OAAQN,EAAgBM,SAE7BnG,KAAK,KACFypC,IACAtkC,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO,iCAIlBzG,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EACI,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAG3E8d,QAAQ,KACD5T,EAAgBM,OAAOoT,SAC3BgxB,GAAmB,MAnC/BjpC,GAsCJ,CAACuE,EAAgBM,OAAQhB,EAAU7D,EAAMxG,EAAM2uC,IAGnD,OACI,iCACI,SAAC7C,GAAwB,CACrB9nC,KAAM,UACNT,KAAMA,EACNF,aAAcA,EACduD,SAAUA,EACVmlC,WAAY,IAAMgD,GAAqB,GACvCvoC,KAAMA,EACNylC,eAAgBA,EAChBD,gBAAiBA,EACjB/C,cAAeA,EACfnrB,QAASA,EAAO,UAChB,SAACitB,GAAW,CAACx9B,KAAM,SAAU/G,KAAMA,EAAMo+B,iBAAkBA,OAE/D,SAAC4I,GAAa,CACVjqC,KAA8B,OAAxBqrC,EACNvrC,aAAc,IAAMwrC,EAAuB,MAC3ClnC,QAASnB,EAAKmB,QACdf,SAAU,KACsB,YAAxBgoC,EACAhoC,GAAS,GACsB,aAAxBgoC,GAAsCZ,GAAgBI,GAC7DrC,EAAWiC,EAAcI,GAAa,OAIlD,SAACN,GAAa,CACVvqC,KAAMurC,EACNzrC,aAAc,IAAM0rC,GAAqB,GACzCnoC,SAAU,EAAGonC,eAAcI,iBAAkBrC,EAAWiC,EAAcI,SCvLhF,GAAQ,IAAyB7uC,iBAAiB,SAClD,GAAU,IAAyBA,iBAAiB,WACpD,GAAa,IAAyBA,iBAAiB,cACvD,GAAU,IAAyBA,iBAAiB,WACpD,GAAa,IAAyBA,iBAAiB,cACvD,GAAe,IAAyBA,iBAAiB,gBAEzD,GAAY,UAAO8B,GAAG;;;WAGjB,EAAGvB,WAAYA,EAAMgE,MAAMgG;qBACjB,EAAGhK,WAAYA,EAAMgE,MAAMC;EAGnC8rC,GAAsB,EAAGtsC,OAAMF,mBACxC,MAAMrD,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXylC,GAAgB,QAAgBp/B,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,kBAAkBo/B,cAEnG,OAAKA,GAKD,SAAC,GAAK,CACFptC,MAAO1C,EAAKY,cAAc,CAAEC,GAAI,2CAChC0C,KAAMA,EACNF,aAAcA,EACdC,2BAAyB,YACzB,UAAC,GAAS,YACN,SAAC,GAAO,CACJ2R,QAASjV,EAAKY,cAAc,CAAEC,GAAI,2CAClCF,QAAS,UAEb,UAAC,GAAO,CAACwM,UAAW,SAAQ,WACxB,SAAC,GAAU,CAAC2yB,OAAQ,SAAQ,SACvB9/B,EAAKY,cAAc,CAAEC,GAAI,kCAE9B,UAAC,GAAO,YACJ,SAAC,GAAU,CACP6O,KAAM,YACNgyB,aAAc,UACdt+B,QAAS,KACLmrC,UAAUC,UAAUC,UAAUqB,EAAc7kC,KAAK/F,KAAK,KAClDmF,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oCAMpD,SAAC,GAAY,CAACqZ,MAAO41B,EAAc7kC,IAAKqG,OAAQ,IAAKD,MAAO,gBAGpE,UAAC,GAAO,CAAClE,UAAW,SAAQ,WACxB,SAAC,GAAU,CAAC2yB,OAAQ,SAAQ,SACvB9/B,EAAKY,cAAc,CAAEC,GAAI,6CAE9B,UAAC,GAAO,YACJ,SAAC,GAAU,CACP6O,KAAM,YACNgyB,aAAc,UACdt+B,QAAS,KACLmrC,UAAUC,UAAUC,UAAUqB,EAAcC,UAAU7qC,KAAK,KACvDmF,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oCAMpD,SAAC,GAAY,CAACqZ,MAAO41B,EAAcC,SAAUz+B,OAAQ,IAAKD,MAAO,oBArD1E,MCKT,GACFL,IACoD,IACjDA,EACHq4B,WAAW,SAAsBr4B,EAAKq4B,WACtCC,aAAct4B,EAAKs4B,aAAet4B,EAAKs4B,aAAahpC,IAAM,GAC1D6lC,UAAWn1B,EAAKm1B,UAAY,IAAM,IAClCoD,YAAav4B,EAAKu4B,YAAc,IAAM,QACnC,IAAAC,2CAA0Cx4B,EAAM,QAAUwV,GAAkBA,EAAI7d,KAAK,MACxF3E,KACI,mBAAoBgN,GAAQA,EAAK06B,gBAAkBnJ,GAAUvxB,EAAK06B,gBAC5D,iBACA,gBAGDsE,GAAyC,EAClDzsC,OACAF,eACAsrC,WACAsB,2BAEA,MAAMjwC,GAAO,EAAAC,EAAA,KACP8K,GAAkB,EAAA0S,GAAA,MACjBmxB,EAAqBC,IAA0B,IAAA7sC,UAAwC,OACvF8sC,EAAqBC,IAAwB,IAAA/sC,WAAS,IACtDgsC,EAAcgB,IAAmB,IAAAhtC,aACjCosC,EAAaa,IAAkB,IAAAjtC,YAChCktC,GAAW,KAAAC,aAAY,EAAAzU,SAASt6B,UAAUu6B,sBAC1Cn0B,GAAO,IAAAsB,SAA+C,CACxDV,cAAe8E,UACX,IAAIkjC,EAAmB,IAAIt3B,KAC3Bs3B,EAAiBC,WAAWD,EAAiBjB,aAAe,GAAK,GAAK,GACtEiB,EAAqD,IAAlCA,EAAiBjB,cAAqB,EAAAmB,GAAA,GAASF,EAAkB,GAAKA,EACzF,IAAIG,EAAiBH,EAErB,OADAG,GAAiB,EAAAD,GAAA,GAASC,EAAgB,GACnC,CACH7sC,MAAO,GACPyjC,UAAkC,IAAvB+I,EAAS/I,UACpBoD,YAAoC,IAAvB2F,EAAS/I,UACtBljB,WAAW,EAAA3X,GAAA,IAAW8jC,EAAkB,oBACxCjsB,SAAS,EAAA7X,GAAA,IAAWikC,EAAgB,oBACpClG,UAAW,GACXqC,eAAgB,CAAC,EACjB53B,MAAO,GACPxT,IAAK,GACL+mC,aAAS5kC,EACTskC,WAAOtkC,EACP2kC,eAAW3kC,EACX4nC,gBAAY5nC,EACZunC,wBAAoBvnC,EACpB6kC,2BAAuB7kC,EACvB0kC,YAAQ1kC,EACRwnC,eAAWxnC,EACXukC,aAASvkC,EACT6mC,kBAAc7mC,EACdynC,WAAOznC,EACPD,iBAAaC,EACb2nC,eAAW3nC,EACX0nC,sBAAkB1nC,MAIxB4H,GAAW,WACV4hC,EAAgBuD,IAAqB,IAAAxtC,WAAS,IAC9CgqC,EAAiByD,IAAsB,IAAAztC,WAAS,IAChDinC,EAAerE,IAAoB,IAAA5iC,WAAS,IAEnD,IAAAwD,WAAU,KACFjC,IACI0sC,IACAzpC,EAAKoX,SACD,aACA,EAAAtS,GAAA,IACI2kC,EAAqBva,MACrBua,EAAqB9I,OAAS,aAAe,qBAGrD3gC,EAAKoX,SACD,WACA,EAAAtS,GAAA,IACI2kC,EAAqBC,IACrBD,EAAqB9I,OAAS,aAAe,qBAGrD3gC,EAAKoX,SAAS,SAAUqyB,EAAqB9I,SAEjD,kBACKrzB,MAAM/I,EAAgBM,QACtBnG,KAAMgG,IACH1E,EAAKoX,SAAS,QAAS1S,EAAI7F,UAE9BC,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,wBAG1F,CAACkK,EAAgBM,OAAQ4kC,EAAsB5lC,EAAU7D,EAAMxG,EAAMuD,IAExE,MAAMqD,GAAW,IAAAhC,aACZ+qC,GACGnpC,EAAKkB,aAAcsJ,IACf,MAAM4+B,EAAU,GAAmB5+B,GAC7B4+B,EAAQvG,WAA0C,IAA7BuG,EAAQvG,UAAUlmC,QAAkBwsC,GAI/DH,GAAkB,GAClB,UAAKjlC,QACAizB,OACG,GAAmBxsB,GACnB,CACI1F,OAAQ,EAAA2lB,OAAOwZ,SAGtBvlC,KAAMgG,IACHyjC,IACAtkC,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO,4BACP2+B,KAAM,CACF3+B,MAAO,uBACP6K,IAAK1L,EAAI7F,OAAO,GAAG/C,WAKlCgD,MAAO0G,IACJ3B,EACI,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAG3E8d,QAAQ,KACL6wB,GAAkB,MA7BtBX,EAAuB,YAH/BroC,GAmCJ,CAAC6D,EAAU7D,EAAMxG,EAAM2uC,IAGrB5C,GAAa,IAAAnnC,aACf,CAACopC,EAAsBI,EAAqBuB,IACxCnpC,EAAKkB,aAAcsJ,IACf,MAAM4+B,EAAU,GAAmB5+B,GACnC,KAAM4+B,EAAQvG,WAA0C,IAA7BuG,EAAQvG,UAAUlmC,QAAkBwsC,GAI3D,OAHAd,EAAuB,YACvBG,EAAgBhB,QAChBiB,EAAeb,GAGnBqB,GAAmB,GACnB,UAAKllC,QACAkiC,YACG,CACIjmC,KAAMopC,EACNlD,YAAakD,EAAQ5rC,KACrBgqC,eACAI,eAEJ,CAAE/iC,OAAQN,EAAgBM,SAE7BnG,KAAK,KACFypC,IACAtkC,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAClBC,MAAO,iCAIlBzG,MAAO0G,IACAjB,EAAgBM,OAAOoT,SAC3BpU,EACI,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAG3E8d,QAAQ,KACD5T,EAAgBM,OAAOoT,SAC3BgxB,GAAmB,MAnC/BjpC,GAsCJ,CAACuE,EAAgBM,OAAQhB,EAAU7D,EAAMxG,EAAM2uC,IAG7C1mC,GAAS,IAAAm+B,UAAS,CAAEz+B,QAASnB,EAAKmB,UAClCmW,GAAU,IAAA1O,SACZ,KACI,IAAA+gC,cAAa,EAAAC,0BAA0BC,GAAG,EAAAC,+BAA+B1F,UACrE,GAAmB3iC,IACrB6D,QACN,CAAC7D,IAGL,OACI,iCACI,SAAC6jC,GAAwB,CACrB9nC,KAAM,cACNT,KAAMA,EACNF,aAAcA,EACduD,SAAUA,EACVmlC,WAAY,IAAMgD,GAAqB,GACvCvoC,KAAMA,EACNylC,eAAgBA,EAChBD,gBAAiBA,EACjB/C,cAAeA,EACfnrB,QAASA,EAAO,UAChB,SAAC6mB,GAA+B,CAACn+B,KAAMA,EAAMo+B,iBAAkBA,EAAkBr3B,KAAM,cAE3F,SAACigC,GAAa,CACVjqC,KAA8B,OAAxBqrC,EACNvrC,aAAc,IAAMwrC,EAAuB,MAC3ClnC,QAASnB,EAAKmB,QACdf,SAAU,KACsB,YAAxBgoC,EACAhoC,GAAS,GACsB,aAAxBgoC,GAAsCZ,GAAgBI,GAC7DrC,EAAWiC,EAAcI,GAAa,OAIlD,SAACN,GAAa,CACVvqC,KAAMurC,EACNzrC,aAAc,IAAM0rC,GAAqB,GACzCnoC,SAAU,EAAGonC,eAAcI,iBAAkBrC,EAAWiC,EAAcI,SC1OhFpN,GAAW,IAAyBzhC,iBAAiB,YAErDgxC,GAAoB,UAAOlvC,GAAG;qBACf,EAAGvB,WAAYA,EAAMgE,MAAMK;EAG1CqsC,GAAS,UAAOnvC,GAA2B;;;;;MAK3C,EAAGmM,OAAM1N,WAAqB,SAAT0N,GAAmB,4BAA4B1N,EAAMW,MAAMmJ;iBACrE,EAAG9J,WAAYA,EAAMgE,MAAMK;EAGtCoS,GAAoD,CACtD,CACIxK,MAAO,wBACPmO,MAAO,gBAEX,CACInO,MAAO,wBACPmO,MAAO,gBAEX,CACInO,MAAO,uBACPmO,MAAO,eAEX,CACInO,MAAO,oBACPmO,MAAO,SAIFu2B,GAAkB,EAC3BhI,QAAQ,CAAC,eAAgB,OAAQ,cAAe,gBAChDl7B,OAAO,OACP4f,eAAc,EACdujB,cAAa,EACbC,eAAc,EACdC,YASA,MAAM5wC,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXwmC,GAAW,UCnEC,MAClB,MAAMxmC,GAAW,UACXuxB,GAAc,IAAAxsB,SAAQ,IAAMysB,GAAA,EAAQ,IACpCC,GAAa,IAAA1sB,SAAQ,IAAM,EAAA4xB,SAAS8P,sBAAsBzmC,EAAU,WAAO,CAACA,KAElF,IAAA7E,WAAU,KACNs2B,EAAWzzB,QAAS2zB,IAChBJ,EAAYK,UAAUD,EAAQvuB,UAAWuuB,EAAQE,SAAUF,EAAQA,WAEhE,KACHF,EAAWzzB,QAAS2zB,IAChBJ,EAAYO,WAAWH,EAAQvuB,UAAWuuB,EAAQE,SAAUF,EAAQA,aAG7E,CAACF,EAAYF,KDsDhB,GACA,MAAO7vB,EAAO2Y,IAAY,IAAA1iB,aACpB,QAAEsC,EAAO,KAAE+d,EAAI,qBAAE0uB,IAAyB,QAAe,EAAA/P,SAAc5gC,UAAU6gC,uBAChFP,EAAasQ,IAAkB,IAAAhvC,aAC/BivC,EAAeC,IAAoB,IAAAlvC,UAA+B,OAClEmvC,EAAmBrQ,IAAsB,IAAA9+B,WAAS,IAClDovC,EAAeC,IAAoB,IAAArvC,UAA6D,MACjGsvC,GAAoB,QAAgB5gC,GAAU,EAAA8hB,KAAKpyB,UAAUqyB,WAAW/hB,EAAO,kBAAkB6gC,YACjGA,GAAc,IAAAniC,SAAQ,KACxB,MAAMoiC,EAAW,IAAIC,gBAAgB17B,OAAOwJ,SAASmyB,QAAQvmC,IAAI,QACjE,OAAQqmC,GACJ,IAAK,eACL,IAAK,cACL,IAAK,eACL,IAAK,OACD,OAAOA,EACX,QACI,OAAQF,GACJ,IAAK,QACL,QACI,MAAO,eACX,IAAK,OACD,MAAO,eACX,IAAK,MACD,MAAO,cACX,IAAK,OACD,MAAO,UAGxB,CAACA,IAEE7Q,GAAe,IAAArxB,SACjB,IACImH,GACKuZ,OAAQ7Q,GAAOwpB,EAAMpyB,SAAS4I,EAAG/E,QACjChY,IAAKsT,IACK,CAAEzJ,MAAO/L,EAAKY,cAAc,CAAEC,GAAI2U,EAAOzJ,QAAUmO,MAAO1E,EAAO0E,SAEpF,CAACuuB,EAAOzoC,KAELwN,EAAMozB,IAAW,IAAA5+B,UACpBy+B,EAAaj4B,KAAME,GAAMA,EAAEwR,QAAUq3B,IAAgB9Q,EAAa,IAGhEE,GAAoB,IAAA/7B,aACrB+sC,IACG,MAAMrV,EAAS,IAAImV,gBAAgB17B,OAAOwJ,SAASmyB,aAC7BjvC,IAAlBkvC,EAAQ5Q,QACJ4Q,EAAQ5Q,MAAM59B,OAAS,EACvBm5B,EAAOsV,IAAI,QAASD,EAAQ5Q,MAAMp4B,KAAK,MAEvC2zB,EAAOhY,OAAO,eAGD7hB,IAAjBkvC,EAAQnkC,OACJmkC,EAAQnkC,KACR8uB,EAAOsV,IAAI,OAAQD,EAAQnkC,MAE3B8uB,EAAOhY,OAAO,SAGtBusB,EAAS,IAAIvU,EAAOzS,aAAc,CAAE5P,SAAS,KAEjD,CAAC42B,IAGC77B,GAAU,IAAApQ,aACX8Z,IACGrU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO2S,GAAO1e,EAAKY,cAAc,CAAEC,GAAI,qBAE1E,CAACwJ,EAAUrK,IAGT6xC,GAAY,IAAAjtC,aACbqQ,IACG5K,EAAS,EAAAuB,MAAMC,QAAQC,QAAQ,CAAEC,MAAOkJ,MAE5C,CAAC5K,IAGCynC,GAAmB,IAAAltC,aACpB4I,IACGozB,EAAQpzB,GACRmzB,EAAkB,CAAEnzB,KAAMA,EAAK0M,SAEnC,CAACymB,IAGCoR,GAAoB,IAAAntC,aACtB,CAAC8wB,EAAawa,KACV,MAAM8B,EAAQ,CAAEtc,MAAO,EAAA3yB,MAAMC,KAAKkqC,WAAWxX,GAAQwa,IAAK,EAAAntC,MAAMC,KAAKkqC,WAAWgD,IAChF7lC,EAAS,EAAA22B,SAAcn1B,QAAQomC,SAASD,KAE5C,CAAC3nC,KAGE6nC,EAAcrR,IAAmB,IAAA7+B,UAA+D,MAevG,OAbA,IAAAwD,WAAU,KACN6E,EACI,EAAA22B,SAAcn1B,QAAQm2B,SACjB,IAAIyP,gBAAgB17B,OAAOwJ,SAASmyB,QAChCvmC,IAAI,UACHgnC,MAAM,KACPriB,OAAQ9rB,GACL,CAAC,cAAe,UAAW,kBAAmB,aAAaqS,SAASrS,KACxD,MAG7B,CAACqG,KAGA,iCACMqmC,GAAcC,KACZ,UAACH,GAAM,CAAChjC,KAAMA,EAAK0M,MAAK,UACnBw2B,IAAc,SAAChR,GAAc,IAC7BiR,IACG,UAAC,EAAA/O,SAAQ,CAACC,UAAU,wBAAK,WACrB,SAACrB,GAAe,CACZz0B,MAAOA,EACPyd,UAAuB,YAAZllB,EACXkJ,KAAMA,EACNkzB,YAAaA,EACbD,aAAcA,EACdE,kBAAmBA,EACnBC,QAASA,EACTC,gBAAiBA,EACjBC,mBAAoBA,KAExB,SAACkP,GAAsC,CACnCC,qBAAsBmB,EACtB/tC,aAAc,KACVw9B,EAAgB,MAChBwQ,EAAiB,OAErB9tC,KAAuB,gBAAjB2uC,KAAoCd,EAC1CzC,SAAU,KACN9N,EAAgB,MAChBwQ,EAAiB,UAGzB,SAAC3C,GAAkB,CACfrrC,aAAc,IAAMw9B,EAAgB,MACpCt9B,KAAuB,YAAjB2uC,EACNvD,SAAU,KACN9N,EAAgB,UAGxB,SAACgP,GAAmB,CAChBtsC,KAAM4tC,EACN9tC,aAAc,IAAMy9B,GAAmB,YAM3D,SAACE,GAAQ,CACL4P,MAAOA,EACPrjC,KAAMA,EACN6kC,YAAU,EACVjlB,YAAaA,EACbklB,OAAQhwB,EACR/d,QAAqB,YAAZA,EACT03B,QAAS,CACL6C,OAAQ,UAAKA,OACbyT,SAAU,UAAKA,SACf/nC,QAAS,UAAKA,SAElBgnC,YAAa/jC,EAAK0M,MAClBq4B,yBAA0B,EAAG1xC,KAAIP,MAAKu8B,SAAQ74B,UAC7B,6BAATA,EAA4C,MAE5C,SAACusC,GAAiB,WACd,SAACvW,GAAY,CAAC9vB,UAAWrJ,EAAIsJ,WAAY7J,EAAK25B,WAAY4C,EAAOpyB,YAI7E+nC,gBAAiB,CACbC,cAAe/tB,EACfguB,kBAAmB1B,EACnBxjC,QAEJmlC,cAAeZ,EACf/8B,QAASA,EACT68B,UAAWA,EACXe,aAAcd,EACde,cAAe,KACXxoC,EACI,EAAAuB,MAAMC,QAAQC,QAAQ,CAAEC,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,oCAGhEiyC,mBAAoB5B,EACpB6B,eAAiBzW,GAAWjyB,EAAS,EAAA22B,SAAcn1B,QAAQmnC,eAAe1W,IAC1E2W,sBAAwBpyC,GAAOkwC,EAAqBvU,KAAM0W,GAAQA,EAAIC,UAAYtyC,GAClFk4B,SAAUsY,EACV+B,cAAiC,OAAlBhC,GAA2C,OAAjBc,KAE7C,SAACzI,GAAsB,CACnB1T,MAA+B,gBAAxBkb,GAAejtC,KAA0BitC,OAAqCxuC,EACrFinC,SAAU,KACNwH,EAAiB,OAErB7tC,aAAc,IAAM6tC,EAAiB,SAEzC,SAAChG,GAAkB,CACf/J,QAAiC,YAAxB8P,GAAejtC,KAAsBitC,OAAiCxuC,EAC/EinC,SAAU,KACNwH,EAAiB,OAErB7tC,aAAc,IAAM6tC,EAAiB,SAEzC,SAAC5F,GAAyB,CACtBvV,MAAOkb,IAAiB,IAAAoC,4BAA2BpC,GAAiBA,OAAgBxuC,EACpFinC,SAAU,KACNwH,EAAiB,OAErB7tC,aAAc,IAAM6tC,EAAiB,YEnRxCoC,IAR4B,UAAOjyC,GAAG;;EAIZ,UAAOA,GAAG;;EAIlB,UAAOA,GAA0B;;wBAEvCxB,GAAWA,EAAMwQ,SAAW,iBAAmB;;sBAEjDxQ,GAAWA,EAAMwQ,SAAW,MAAQ;;;;GAM9CkjC,GAAkB,UAAOlyC,GAAG;;;;+BAITxB,GAAUA,EAAMC,MAAMW,MAAMmJ;EAG/C4pC,GAAkB,UAAOnyC,GAAG;;;;;EAO5BoyC,GAAiB,UAAOpyC,GAAG;;;;;EAQ3BqyC,GAAgB,UAAOryC,GAAG;;;;aAI1BsyC;EAGAC,GAAY,UAAOvyC,GAAmC;;;MAG5DxB,GAA8B,SAAnBA,EAAM8C,SAAsB,aAAe;MACtD9C,GAA8B,UAAnBA,EAAM8C,SAAuB,kBAAoB;aCzDvC;;;wBD6DH9C,GAAUA,EAAMC,MAAMW,MAAMe;;;;;;;;EAUxCqyC,GAAmB,UAAOxyC,GAAG;;;;;;;;EAU7ByyC,GAAe,UAAOzyC,GAAG;;;;EAMzB0yC,GAAkB,UAAO1yC,GAAG;;;;;;;EAS5B2yC,GAAoB,UAAO3yC,GAAG;;;wBAGlBxB,GAAUA,EAAMC,MAAMW,MAAMe;eACrC3B,GAAUA,EAAMC,MAAMgE,MAAMK;EAG/B8vC,GAAgB,UAAO5yC,GAAG;aCtGN;;;;8BD2GFxB,GAAUA,EAAMC,MAAMW,MAAMmJ;EAG9CsqC,GAAsB,UAAOrnC,MAA8B;;;;;;;;;wBAS/ChN,GAAWA,EAAMwQ,SAAWxQ,EAAMC,MAAMW,MAAMmJ,MAAQ/J,EAAMC,MAAMW,MAAMe;;OAE3F,IAAAyL;;;4BAGuBpN,GAAUA,EAAMC,MAAMW,MAAMmJ;;EEzHnD,IF6HyB,UAAOvI,GAAG;;wBAEhBxB,GAAUA,EAAMC,MAAMW,MAAMsM;qBA/HtC;;;;;kBADM;;;EA2IU,UAAO1L,GAAG;;;;wBAIhBxB,GAAUA,EAAMC,MAAMW,MAAMoJ;;;EAKjB,UAAOxI,GAAG;;;;EAMT,UAAOA,GAAG;;;;;EAOjB,UAAOA,GAAG;;;;EAML,UAAOA,GAAG;;;;EEtK3B,IAAyB9B,iBAAiB,WACtD,GAAU,IAAyBA,iBAAiB,QAK7C40C,GAAc,EAAG3jC,aAC1B,MAAMnG,GAAW,UACXuF,GAAS,QAAgBc,GAAU,EAAAqB,aAAa3R,UAAUg0C,aAAa1jC,EAAOF,IAUpF,OAAIZ,GAAUA,EAAOykC,OAASzkC,EAAOpC,MAE7B,iBAAKwF,MAAO,CAAE4jB,KAAM,EAAGD,QAAS,OAAQ2d,cAAe,SAAU1hC,gBAAiB,QAAS2hC,UAAW,IAAI,WACtG,UAAChB,GAAe,YACZ,SAACC,GAAe,KAChB,SAACC,GAAc,qBACf,SAACD,GAAe,WACZ,SAACU,GAAmB,CAAC9wC,QAfzB,KACZiH,EAAS,EAAA0H,aAAad,MAAMpF,QAAQ2oC,iBAAiB,CAAEhkC,aAcF,UACjC,SAAC,GAAO,CAACjQ,KAAK,aAAaE,MAAM,QAAQD,KAAM,gBAI3D,gBAAKwS,MAAO,CAAE4jB,KAAM,EAAGD,QAAS,QAAQ,SAAG/mB,EAAOpC,QAClD,SAAC+lC,GAAe,WACZ,SAAC,GAAS,CAACnwC,QAlBZ,KACXiH,EAAS,EAAA0H,aAAad,MAAMpF,QAAQ2oC,iBAAiB,CAAEhkC,aAiBjB,wBAMnC,yB,eCOX,MAAMikC,GAA2B,IAAyBl1C,iBAAiB,4BACrEm1C,GAA0B,IAAyBn1C,iBAAiB,2BACpEo1C,GAA6B,IAAyBp1C,iBAAiB,8BACvEq1C,GAAgC,IAAyBr1C,iBAAiB,iCAC1Es1C,GAA4B,IAAyBt1C,iBAAiB,6BACtEu1C,GAA2B,IAAyBv1C,iBAAiB,4BACrEw1C,GAAqB,IAAyBx1C,iBAAiB,sBAC/D,GAAwB,IAAyBA,iBAAiB,yBAClE,GAA0B,IAAyBA,iBAAiB,2BACpEy1C,GAA8B,IAAyBz1C,iBAAiB,+BACxE01C,GAAmC,IAAyB11C,iBAAiB,oCAC7E21C,GAAuB,IAAyB31C,iBAAiB,wBACjE41C,GAA2B,IAAyB51C,iBAAiB,4BACrE61C,GAAyB,IAAyB71C,iBAAiB,0BACnE81C,GAA6B,IAAyB91C,iBAAiB,8BACvE+1C,GAA6B,IAAyB/1C,iBAAiB,8BACvEg2C,GAA0B,IAAyBh2C,iBAAiB,2BACpEi2C,GAAoB,IAAyBj2C,iBAAiB,qBAC9Dk2C,GAAsB,IAAyBl2C,iBAAiB,uBAChEm2C,GAAwB,IAAyBn2C,iBAAiB,yBAM3Do2C,GAAS,EAAGnlC,aACrB,MAAMnG,GAAW,UACXyJ,GAAQ,QAAe,EAAAjG,OAAOzN,UAAU2T,aACxCzB,GAAgB,QAAgB5B,GAAU,EAAA7C,OAAOzN,UAAUuQ,aAAaD,EAAOF,GAAS,GAAAI,cAExFglC,GAAiB,QAClBllC,GAAU,EAAAqB,aAAa3R,UAAUg0C,aAAa1jC,EAAOF,IAASqlC,OAC/D,GAAAjlC,cAGEklC,EAAsBv1C,GACjB,EAAAiyB,KAAKpyB,UAAUqyB,WAAW,KAAMsjB,WAAYx1C,IAAO8P,SAGxDwlC,EAAUxhC,IAIR/B,GACAjI,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQob,aAAa,CAAEzW,SAAQ6D,aAGzDhK,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmqC,YAAY,CAAExlC,YAE9ColC,GACAA,EAAevhC,IAIjB4hC,EAAgB,CAACC,EAA0Br1C,KAKzCwJ,OADO5H,IAAP5B,EACS,EAAAgN,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,OAAQ3P,KAAOq1C,IAErD,EAAAroC,OAAOoD,MAAMpF,QAAQqJ,eAAe,CAAE1E,YAAW0lC,MAI5DC,EAAU3oC,IAIZnD,EAAS,EAAA0H,aAAad,MAAMpF,QAAQuqC,oBAAoB,CAAE5lC,SAAQhD,WAGhEjF,EAAS+J,GAAe/J,OAE9B,OAAKA,GAED,IAAAuqB,+BAA8BvqB,IAE1B,SAACwsC,GAAkB,IACXxsC,EAAO8L,QACX3G,SAAW2G,IACPhK,GAAS,IAAAsM,qBAAgDnG,EAAQ6D,GAAS,KAE9EwhC,OAAQ,IAAMA,EAAO,CAAC,MAGvB,IAAA9iB,gCAA+BxqB,IAElC,SAACosC,GAA0B,CACvB7gC,MAAOA,EACPO,QAAS9L,EAAO8L,QAChB3G,SAAW2G,GACPhK,GAAS,IAAAsM,qBAAiDnG,EAAQ6D,GAAS,IAE/EwhC,OAAQA,EACRI,cAAeA,KAGhB,IAAAhjB,mCAAkC1qB,IAErC,SAACqsC,GAA6B,CAC1B9gC,MAAOA,EACPO,QAAS9L,EAAO8L,QAChB3G,SAAW2G,IACPhK,GAAS,IAAAsM,qBAAoDnG,EAAQ6D,GAAS,KAElFwhC,OAAQA,EACRI,cAAeA,EACfE,OAAQA,KAGT,IAAAnjB,8BAA6BzqB,IAC7B,SAAC4sC,GAAwB,KACzB,IAAAjiB,8BAA6B3qB,IAEhC,SAACusC,GAAwB,CACrBzgC,QAAS9L,EAAO8L,QAChBP,MAAOA,EACPpG,SAAW2G,IACPhK,GAAS,IAAAsM,qBAA+CnG,EAAQ6D,GAAS,KAE7EwhC,OAAQA,EACRI,cAAeA,KAGhB,IAAA9iB,+BAA8B5qB,QACpB9F,IAAVqR,GACH,SAAC+gC,GAAyB,CACtB97B,OAAQxQ,EAAO8L,QAAQ0E,QAAU,GACjCS,KAAMjR,EAAO8L,QAAQmF,OAAQ,EAC7BD,QAAShR,EAAO8L,QAAQkF,UAAW,EACnC7L,SAAW2G,IACPhK,GAAS,IAAAsM,qBAAgDnG,EAAQ6D,GAAS,KAE9EP,MAAOA,EACP+hC,OAAQA,KAGZ,sDAEG,IAAAziB,8BAA6B7qB,IAEhC,SAACksC,GAAwB,CACrB/mC,SAAW2G,IACPhK,GAAS,IAAAsM,qBAA+CnG,EAAQ6D,GAAS,KAE7EwhC,OAAQA,EACRxhC,QAAS9L,EAAO8L,QAChB8hC,OAAQA,KAGT,IAAA9iB,6BAA4B9qB,IAE/B,SAACmsC,GAAuB,CACpBhnC,SAAW2G,IACPhK,GAAS,IAAAsM,qBAA8CnG,EAAQ6D,GAAS,KAE5EwhC,OAAQA,EACRxhC,QAAS9L,EAAO8L,WAGjB,IAAAmf,0BAAyBjrB,IAE5B,SAAC2sC,GAAoB,CACjBxnC,SAAW2G,IACPhK,GAAS,IAAAsM,qBAA2CnG,EAAQ6D,GAAS,KAEzEwhC,OAAQA,EACRI,cAAeA,KACX1tC,EAAO8L,WAGZ,IAAA+R,2BAA0B7d,IAE7B,SAAC,GAAqB,CAClBuL,MAAOA,EACPtD,OAAQjI,EAAOiI,OACf6D,QAAS,IACF9L,EAAO8L,QACVmS,IAAKje,EAAO8L,QAAQmS,KAAKtkB,IAAKmlB,IAAM,IAC7BA,EACH3kB,MAAO,EAAAK,MAAMukB,KAAKC,uBAAuBF,EAAE3kB,WAGnD8kB,gBAAiB,CAAChX,EAAQ6D,KACtBhK,GAAS,IAAAsM,qBAAoBnG,EAAQ6D,GAAS,KAElDoT,gBAAkBpT,IACdhK,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQqF,oBAAoB,IAClCmD,EACH3R,MAAO,EAAAK,MAAMukB,KAAKC,uBAAuBlT,EAAQ3R,WAI7Dwc,aAAe7K,GACXhK,GAAS,IAAAsM,qBAA4CnG,EAAQ6D,GAAS,OAI3E,IAAAof,6BAA4BlrB,IAE/B,SAAC,GAAuB,CACpBuL,MAAOA,EACPtD,OAAQjI,EAAOiI,OACf6D,QAAS9L,EAAO8L,QAChBmT,gBAAiB,CAAChX,EAAQ6D,KACtBhK,GAAS,IAAAsM,qBAA8CnG,EAAQ6D,GAAS,KAE5EoT,gBAAkBpT,IACdhK,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqF,oBAAoB,IAAKmD,MAE3D6K,aAAe7K,GACXhK,GAAS,IAAAsM,qBAA8CnG,EAAQ6D,GAAS,OAI7E,IAAAif,sCAAqC/qB,IAExC,SAAC0sC,GAAgC,IACzB1sC,EAAO8L,QACX/T,IAAKiI,EAAO8L,QAAQ/T,IACpBuB,MAAO0G,EAAO8L,QAAQxS,OAAS,GAC/B0wB,KAAM,CAAEliB,SAAUylC,GAClBv6B,SAAU,CACNie,SAAU,CACNxI,WAAY,UAASA,WACrBqlB,QAAS,kBACT1X,SAAU,UAASA,SACnB2X,MAAO,UAASA,OAEpBC,YAAa,IAAMN,EAAc,CAAEz7B,MAAM,IACzCg8B,YAAc93B,GAAQrU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO2S,EAAIvZ,YAChEsxC,cAAe,IAAMR,EAAc,CAAEz7B,MAAM,KAE/Cq7B,OAAQA,EACRnoC,SAAU,CAAC2G,EAASqiC,IAChBrsC,GAAS,IAAAsM,qBAAkDnG,EAAQ6D,EAASqiC,IAAY,IAE5FT,cAAeA,EACfjhC,QAAUjJ,GAAU1B,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,cAGpD,IAAA6nB,4BAA2BrrB,IAC3B,SAAC6sC,GAAsB,KACvB,IAAAphB,2BAA0BzrB,IAE7B,SAACmtC,GAAqB,CAClBrmB,cAAe9mB,EAAO8L,QAAQgb,cAC9B3hB,SAAU,CAAC2G,EAASqiC,IAChBrsC,GAAS,IAAAsM,qBAA4CnG,EAAQ6D,EAASqiC,IAAY,IAEtFb,OAAQA,EACRI,cAAeA,KAGhB,IAAAtiB,gCAA+BprB,IAC/B,SAAC8sC,GAA0B,KAC3B,IAAA3hB,gCAA+BnrB,IAC/B,SAAC+sC,GAA0B,KAC3B,IAAA/hB,iCAAgChrB,IAEnC,SAACysC,GAA2B,IACpBzsC,EAAO8L,QACX/T,IAAKiI,EAAO8L,QAAQ/T,IACpBuB,MAAO0G,EAAO8L,QAAQxS,OAAS,GAC/B0wB,KAAM,CAAEliB,SAAUylC,GAClBv6B,SAAU,CACNie,SAAU,CACNxI,WAAY,UAASA,WACrBqlB,QAAS,kBACTM,YAAa,UAASA,YACtBhY,SAAU,UAASA,UAEvB4X,YAAa,IAAMN,EAAc,CAAEz7B,MAAM,IACzCg8B,YAAc93B,GAAQrU,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAO2S,EAAIvZ,YAChEsxC,cAAe,IAAMR,EAAc,CAAEz7B,MAAM,KAE/Cq7B,OAAQA,EACRnoC,SAAU,CAAC2G,EAASqiC,IAChBrsC,GAAS,IAAAsM,qBAAkDnG,EAAQ6D,EAASqiC,IAAY,IAE5FT,cAAeA,EACfjhC,QAAUjJ,IACN1B,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,eAIpC,IAAA8nB,6BAA4BtrB,IAE/B,SAACgtC,GAAuB,CACpB/kC,OAAQjI,EAAOiI,OACf6D,QAAS9L,EAAO8L,QAChBmT,gBAAiB,CAAChX,EAAQ6D,KACtBhK,GAAS,IAAAsM,qBAA8CnG,EAAQ6D,GAAS,QAI7E,IAAAyf,uBAAsBvrB,IAEzB,SAACitC,GAAiB,CACdhlC,OAAQjI,EAAOiI,OACf6D,QAAS9L,EAAO8L,QAChBmT,gBAAiB,CAAChX,EAAQ6D,KACtBhK,GAAS,IAAAsM,qBAAwCnG,EAAQ6D,GAAS,QAIvE,IAAA0f,yBAAwBxrB,IAE3B,SAACktC,GAAmB,CAChBjlC,OAAQjI,EAAOiI,OACf6D,QAAS9L,EAAO8L,QAChBmT,gBAAiB,CAAChX,EAAQ6D,KACtBhK,GAAS,IAAAsM,qBAA0CnG,EAAQ6D,GAAS,QAMzE,wDAtPS,MCvHlB,GAAO,IAAyB9U,iBAAiB,QAI1Cq3C,GAAiB,EAAGpmC,SAAQ7N,eACrC,MAAM0H,GAAW,UACXvK,GAAQ,IAAAC,YAOd,OACI,SAACyzC,GAAe,WACZ,SAACU,GAAmB,CAAC9wC,QARb,KACZiH,EACI,EAAA0H,aAAad,MAAMpF,QAAQgrC,kBAAkB,CAAErmC,SAAQ7N,SAAuB,SAAbA,EAAsB,QAAU,WAM5D,UACjC,SAAC,GAAI,CACDpC,KAAmB,SAAboC,EAAsB,mBAAqB,kBACjDlC,MAAOX,EAAMW,MAAMgB,SACnBjB,KAAM,aCnBpBs2C,GAAgB,IAAyBv3C,iBAAiB,iBAEnD,GAAQ,UAAOwM,KAAK;;;;;;;EASpBgrC,GAAW,UAAOC,QAAQ;;;EAK1BC,GAAmB,EAC5BlrC,QACAiT,eACAE,mBAMA,MAAMpf,GAAQ,IAAAC,YAGRm3C,EAAW,CACb,CACI32C,MAJK,EAAAN,EAAA,KAIMW,cAAc,CAAEC,GAAI,0BAC/Bs2C,OAAQ,CACJr3C,EAAMW,MAAMC,QACZZ,EAAMW,MAAM2pB,UACZtqB,EAAMW,MAAM22C,YACZt3C,EAAMW,MAAMgB,SACZ3B,EAAMW,MAAMic,OACZ5c,EAAMW,MAAM42C,MACZv3C,EAAMW,MAAM62C,KACZx3C,EAAMW,MAAM82C,SACZz3C,EAAMW,MAAM+2C,mBAKxB,OACI,UAACT,GAAQ,YACL,SAAC,GAAK,WACF,SAAC,IAAgB,CAACl2C,GAAIkL,OAE1B,SAAC+qC,GAAa,CACVI,SAAUA,EACVnrC,MAAOA,EACPiT,aAAcA,GAAgBlf,EAAMW,MAAMC,QAC1CH,KAAM,mBACNmN,SAAUwR,QCtDpBu4B,GAAiB,IAAyBl4C,iBAAiB,eAEpDm4C,GAAoB,EAC7B3rC,QACAiT,eACAE,mBAMA,MAAMlf,GAAO,EAAAC,EAAA,MAEP,QAAE0H,EAAO,MAAEkJ,IAAU,IAAA/I,SAAQ,CAC/BV,cAAe,CAAE8S,MAAO8E,GAAgB,KACxCjX,aAAc,QAUlB,OAPA,IAAAvC,WAAU,KACN,MAAMuL,EAAeF,EAAOG,IACxBkO,EAAalO,EAAKkJ,OAAS,MAE/B,MAAO,IAAMnJ,EAAaI,eAC3B,CAACN,EAAOqO,KAGP,SAACu4B,GAAc,CACX1rC,MAAOA,EACPxL,KAAM,QACN8Q,MAAM,OACN1J,QAASA,EACTyJ,YAAapR,EAAKY,cAAc,CAAEC,GAAIkL,OC7B5C,GAAsB,IAAyBxM,iBAAiB,uBAEzDo4C,GAAoB,EAC7B5rC,QACAwK,UAAU,GACVyI,eACAI,YAAW,EACXF,mBAQA,MAAM04B,GAAyB,IAAAxoC,SAAQ,IAC/B4P,GAAgBzI,EAAQ/N,KAAMyW,GAAOA,EAAG/E,QAAU8E,GAC3CzI,EAAQ/N,KAAMyW,GAAOA,EAAG/E,QAAU8E,GAGtCzI,EAAQ,GAChB,CAACyI,EAAczI,KAEZ,QAAE5O,EAAO,MAAEkJ,IAAU,IAAA/I,SAAQ,CAC/BV,cAAe,CAAEywC,OAAQD,GACzB7vC,aAAc,QAWlB,OARA,IAAAvC,WAAU,KACN,MAAMuL,EAAeF,EAAOG,IACxBkO,EAAalO,EAAK6mC,OAAO39B,SAE7B,MAAO,IAAMnJ,EAAaI,eAE3B,CAACN,EAAOqO,KAGP,SAAC,GAAmB,CAChB3I,QAASA,EACTxK,MAAOA,EACP0T,SAAWC,GAAMA,EAAExF,MACnByF,SAAS,QACTC,UAAU,QACVT,MAAO,CAAEC,YACT04B,gBAAgB,EAChB14B,SAAUA,EACVzX,QAASA,EACTpH,KAAM,YCzCZ,GAAe,IAAyBhB,iBAAiB,aAKlDw4C,GAAmB,EAAGvnC,aAC/B,MAAMxQ,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACX2tC,GAAU,QAAgBtnC,GAAU,EAAA7C,OAAOzN,UAAUuQ,aAAaD,EAAOF,IACzEynC,GAAgB,QAAgBvnC,GAAU,EAAA7C,OAAOzN,UAAU83C,oBAAoBxnC,EAAOF,GAAS,GAAAI,cAC/F9Q,GAAQ,IAAAC,YAERwS,GAAS,QAAgB7B,GAAU,EAAA7C,OAAOzN,UAAUoS,uBAAuB9B,EAAOF,GAAS,GAAAI,eAE3F,QAAEjJ,EAAO,MAAEkJ,IAAU,IAAA/I,SAAQ,CAC/BV,cAAe,CAAErC,KAAMizC,GAASt1C,MAAMuX,QAAQ,SAAU,MAAQ,IAChElS,aAAc,SAGlB,IAAAvC,WAAU,KACN,MAAMuL,EAAeF,EAAOG,IACxB3G,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqF,oBAAoB,CAAEV,SAAQ9N,MAAOsO,EAAKjM,UAE5E,MAAO,IAAMgM,EAAaI,eAC3B,CAACN,EAAOL,EAAQnG,IAEnB,MAAMoI,GAAgB,IAAArD,SAAQ,KACnB,CACH3O,MAAO8R,GAAUA,EAAc,MAAIG,OAAOH,EAAc,OAAKzS,EAAMW,MAAMkS,MACzEC,gBAAiBL,GAAUA,EAAO,oBAAsBG,OAAOH,EAAO,qBAAuB,cAC7FM,SAAUN,GAAUA,EAAO,aAAeG,OAAOH,EAAO,cAAgB,KACxEO,WAAYP,GAAUA,EAAO,eAAiBG,OAAOH,EAAO,gBAAkB,SAC9EQ,UAAWR,GAAUA,EAAO,cAAgBG,OAAOH,EAAO,eAAiB,SAEhF,CAACA,EAAQzS,IAENof,GAAe,IAAAta,aACjB,CAACrE,EAAc2Z,KACX7P,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQssC,oBAAoB,CACrC3nC,SACA+B,OAAQ,CAAE,CAAChS,GAAO2Z,OAI9B,CAAC7P,EAAUmG,IAGf,OAAOwnC,GACH,iCACI,SAAC,GAAY,CACTz3C,KAAM,OACNwL,MAAO,eACPsF,MAAM,OACN1J,QAASA,EACTyJ,YAAapR,EAAKY,cAAc,CAAEC,GAAI,mBAEvB,YAAlBo3C,IACG,iCACI,SAAChB,GAAgB,CACblrC,MAAM,mBACNiT,aAAcvM,EAAchS,MAC5Bye,aAAek5B,GAAel5B,EAAa,QAASk5B,MAExD,SAACnB,GAAgB,CACblrC,MAAM,yBACNiT,aAAcvM,EAAcG,gBAC5BsM,aAAem5B,GAAyBn5B,EAAa,mBAAoBm5B,MAE7E,SAACX,GAAiB,CACd3rC,MAAO,kBACPiT,aAAcvM,EAAcI,SAC5BqM,aAAeo5B,GAAkBp5B,EAAa,YAAao5B,MAE/D,SAACX,GAAiB,CACd5rC,MAAO,oBACPiT,aAAcvM,EAAcK,WAC5ByD,QAAS,CACL,CAAExK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,6BAA+BqZ,MAAO,UACxE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,6BAA+BqZ,MAAO,UACxE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAA6BqZ,MAAO,SAE1EkF,UAAU,EACVF,aAAeq5B,GAAoBr5B,EAAa,cAAeq5B,MAEnE,SAACZ,GAAiB,CACd5rC,MAAO,mBACPiT,aAAcvM,EAAcM,UAC5BwD,QAAS,CACL,CAAExK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,0BAA4BqZ,MAAO,QACrE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,4BAA8BqZ,MAAO,UACvE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,6BAA+BqZ,MAAO,WACxE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAA6BqZ,MAAO,UAE1EkF,UAAU,EACVF,aAAes5B,GAAmBt5B,EAAa,aAAcs5B,YAM7E,yBC7GF,GAAS,IAAyBj5C,iBAAiB,UAE5Ck5C,GAAe,EAAGjoC,aAC3B,MAAM8J,GAAS,QAAgB5J,GAAU,EAAA7C,OAAOzN,UAAUma,kBAAkB7J,EAAOF,GAAS,GAAAI,eAAe4J,KAC3G,OACI,8BACKF,IACG,SAACy5B,GAAe,WACZ,SAAC,GAAM,CAACvzC,KAAM,WCRrBk4C,GAAiB,EAAGloC,aAC7B,MAAMxQ,GAAO,EAAAC,EAAA,KACPsc,GAAW,QAAgB7L,GAAU,EAAA7C,OAAOzN,UAAUma,kBAAkB7J,EAAOF,GAAS,GAAAI,eAAeikB,OAC7G,OAAOtY,GACH,SAACy3B,GAAiB,UAAEh0C,EAAKY,cAAc,CAAEC,GAAI,iCAE7C,yBCLF,GAAY,IAAyBtB,iBAAiB,UAE/Co5C,GAAa,EAAGnoC,SAAQjD,WACjC,MAAMvN,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACX2tC,GAAU,QAAgBtnC,GAAU,EAAA7C,OAAOzN,UAAUuQ,aAAaD,EAAOF,GAAS,GAAAI,cAClFtQ,GAAM,QAAgBoQ,GAAU,EAAA7C,OAAOzN,UAAUulB,sBAAsBjV,EAAOF,GAAS,GAAAI,cA6B7F,OACI,SAAC,GAAS,CAACnQ,MAAM,QAAQ2C,QA5BT,KAChBiH,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmqC,YAAY,CAAExlC,YAClD,MAAM6D,EAAU2jC,GAAWA,EAAQzvC,QAAUyvC,EAAQzvC,OAAO8L,QACvD/T,GAAQ03C,GAAY3jC,IACb,QAAR9G,GACA,UAAKhF,OACA0e,aAAoC,CACjC3mB,MACAkQ,OAAQA,EACR9N,MAAOs1C,EAAQt1C,MACf2R,QAASA,EACT6S,IAAI,IAEP5hB,MAAO0G,IACJ3B,EACI,EAAAuB,MAAMC,QAAQtH,MAAM,CAChBwH,MAAOC,EAAE7G,UAAYnF,EAAKY,cAAc,CAAEC,GAAI,sBAMrD,SAAT0M,GACAlD,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQob,aAAa,CAAEzW,SAAQ6D,QAASA,OAKrB,SACxCrU,EAAKY,cAAc,CAAEC,GAAI,mBC9BzB+3C,GAA2B,EAAGpoC,aACvC,MAAM1Q,GAAQ,IAAAC,YACRsK,GAAW,UACXrK,GAAO,EAAAC,EAAA,KAEPsS,GAAS,QAAgB7B,GAAU,EAAA7C,OAAOzN,UAAUigB,yBAAyB3P,EAAOF,GAAS,GAAAI,cAE7F6B,GAAgB,IAAArD,SAAQ,KACnB,CACH3O,MAAO8R,GAAUA,EAAc,MAAIG,OAAOH,EAAc,OAAKzS,EAAMW,MAAMkS,MACzEC,gBACIL,GAAUA,EAAO,oBAAsBG,OAAOH,EAAO,qBAAuBzS,EAAMW,MAAMe,MAC5F8e,QAAS/N,GAAUA,EAAgB,QAAIG,OAAOH,EAAgB,SAAK,IACnE4E,aAAc5E,GAAUA,EAAO,iBAAmBG,OAAOH,EAAO,kBAAoB,IACpF6kB,YAAa7kB,EAAO,gBAAkBG,OAAOH,EAAO,iBAAmBzS,EAAMW,MAAMkS,MACnF0kB,YAAa9kB,EAAO,gBAAkBG,OAAOH,EAAO,iBAAmB,IACvE+kB,YAAa/kB,EAAO,gBAAkBG,OAAOH,EAAO,iBAAmB,SAE5E,CAACA,EAAQzS,IAENof,GAAe,IAAAta,aACjB,CAACrE,EAAc2Z,KACX7P,EACI,EAAAwD,OAAOoD,MAAMpF,QAAQgtC,sBAAsB,CACvCroC,SACA+B,OAAQ,CAAE,CAAChS,GAAO2Z,OAI9B,CAAC1J,EAAQnG,IAGb,OACI,iCACI,SAAC4sC,GAAgB,CACblrC,MAAO,yBACPiT,aAAcvM,EAAcG,gBAC5BsM,aAAem5B,GAAyBn5B,EAAa,mBAAoBm5B,MAE7E,SAACpB,GAAgB,CACblrC,MAAO,mBACPiT,aAAcvM,EAAchS,MAC5Bye,aAAeze,GAAUye,EAAa,QAASze,MAEnD,mBACA,SAACi3C,GAAiB,CACd3rC,MAAO,gBACPiT,aAAcvM,EAAc6N,QAC5BpB,aAAe45B,GAAiB55B,EAAa,UAAWxM,OAAOomC,OAEnE,SAACpB,GAAiB,CACd3rC,MAAO,eACPiT,aAAcvM,EAAc0E,aAC5B+H,aAAe65B,GAAsB75B,EAAa,gBAAiBxM,OAAOqmC,OAE9E,SAACpB,GAAiB,CACd5rC,MAAO,qBACPiT,aAAcvM,EAAc6kB,YAC5B/gB,QAAS,CACL,CAAExK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,4BAA8BqZ,MAAO,QACvE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,6BAA+BqZ,MAAO,SACxE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,8BAAgCqZ,MAAO,UACzE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,8BAAgCqZ,MAAO,WAE7EkF,UAAU,EACVF,aAAe85B,IACX95B,EAAa,eAAgB85B,GACR,SAArBA,GAA+B95B,EAAa,eAAgBpf,EAAMW,MAAMkS,OACnD,SAArBqmC,GAA+B95B,EAAa,eAAgB,QAG9B,iBAA9BzM,EAAc6kB,aAA0D,SAA9B7kB,EAAc6kB,cAC5D,SAAC2f,GAAgB,CACblrC,MAAO,qBACPiT,aAAcvM,EAAc2kB,YAC5BlY,aAAe+5B,GAAqB/5B,EAAa,eAAgB+5B,KAGnC,iBAA9BxmC,EAAc6kB,aAA0D,SAA9B7kB,EAAc6kB,cAC5D,SAACogB,GAAiB,CACd3rC,MAAO,qBACPiT,aAAcvM,EAAc4kB,YAC5BnY,aAAeg6B,GAAqBh6B,EAAa,eAAgBg6B,SChFxEC,GAAwB,EAAG3oC,aACpC,MAAMnG,GAAW,UACXrK,GAAO,EAAAC,EAAA,KACP2P,GAAS,QAAgBc,GAAU,EAAAqB,aAAa3R,UAAUg0C,aAAa1jC,EAAOF,GAAS,GAAAI,cACvFsmB,EAAM,EAAArpB,OAAOC,WAAW8B,GAAQrP,MAChC2hB,GAAQ,QAAgBxR,GAAU,EAAA7C,OAAOzN,UAAU+hB,kBAAkBzR,EAAOF,GAAS,GAAAI,cAErFsO,GAAe,IAAAta,aAChBsd,IACG7X,EAAS,EAAAwD,OAAOoD,MAAMpF,QAAQqF,oBAAoB,CAAEV,SAAQ0R,MAAOqV,OAAOrV,OAE9E,CAAC1R,EAAQnG,IAGb,OACI,SAACstC,GAAiB,CACdz4B,aAAcA,EACdE,UAAU,EACVrT,MAAO,8BACPiT,aAAckD,EAAQxP,OAAOwP,GAAS,IACtC3L,QAAS,CACL,CAAExK,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAA6BqZ,MAAO,KACtE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAA6BqZ,MAAO,KACtE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAA6BqZ,MAAO,KACtE,CAAEnO,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAA6BqZ,MAAO,MACxE4V,OAAQ7Q,GACNxI,MAAMC,QAAQwgB,EAAIkiB,cAAgBliB,EAAIkiB,aAAa/iC,SAASkhB,OAAOtY,EAAG/E,QAA2B,OCb3Gm/B,GAAgB,CAClB,kBACA,sBACA,oBACA,qBACA,yBACA,0BAGE,GAAO,IAAyB95C,iBAAiB,QACjD,GAAU,IAAyBA,iBAAiB,WAa7C+5C,GAAgB,EAAG9oC,SAAQ7N,eACpC,MAAM3C,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXvK,GAAQ,IAAAC,YACR4G,GAAM,IAAAO,QAAuB,MAC7B0I,GAAS,QAAgBc,GAAU,EAAAqB,aAAa3R,UAAUg0C,aAAa1jC,EAAOF,GAAS,GAAAI,cAEvFsmB,EAAM,EAAArpB,OAAOC,WAAW8B,GAAQrP,MAEhCg5C,GAAoB,IAAAnqC,SAAiB,SACX3M,IAArBy0B,EAAIkiB,cAA8B3iC,MAAMC,QAAQwgB,EAAIkiB,eAA6C,IAA5BliB,EAAIkiB,aAAaj2C,OAC9F,CAAC+zB,IACEsiB,GAAoB,IAAApqC,SAAQ,IACvB,CACH,CACI7O,KAAM,eACNwL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,gBAChC44C,OAAQviB,EAAIwiB,MAAMC,WAClBjqC,KAAM,aAEV,CACInP,KAAM,mBACNwL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,2BAChC44C,OAAQviB,EAAIwiB,MAAME,aAClBlqC,KAAM,gBAEV,CACInP,KAAM,kBACNwL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,0BAChC44C,OAAQviB,EAAIwiB,MAAMG,UAClBnqC,KAAM,YAEV,CACInP,KAAM,eACNwL,MAAO/L,EAAKY,cAAc,CAAEC,GAAI,uBAChC44C,OAAQF,EACR7pC,KAAM,cAGf,CAACwnB,EAAKl3B,EAAMu5C,IAETO,GAAa,IAAA1qC,SAA+B,IAC1C8nB,EAAIwiB,MAAMG,UACHL,EAAKhxC,KAAMyW,GAAmB,oBAAZA,EAAG1e,MAGzBi5C,EAAK1pB,OAAQ7Q,GAAOA,EAAGw6B,QAAQ,GACvC,CAACviB,EAAKsiB,KAEFO,EAAYC,IAAiB,IAAAh4C,UAAgC83C,GAcpE,OARA,IAAAt0C,WAAU,KACNgnC,WAAW,KACH7lC,GAAOA,EAAIkC,UACXlC,EAAIkC,QAAQkG,UAAYpI,EAAIkC,QAAQkG,UAAY,aAErD,IACJ,IAEIa,GACH,UAAC8jC,GAAa,YACV,UAACE,GAAS,CAACjtC,IAAKA,EAAKhE,SAAUA,EAAQ,WACnC,SAACsxC,GAAa,UACTuF,EACI1pB,OAAQmqB,GAAQA,EAAIR,QACpBv3C,IAAK+3C,IAEE,SAAC/F,GAAmB,CAEhB7jC,SAAU0pC,GAAcA,EAAWx5C,OAAS05C,EAAI15C,KAChD6C,QAAS,IAAM42C,EAAcC,GAAI,UACjC,SAAC,GAAO,CAACt3C,SAAU,OAAQH,YAAay3C,EAAIluC,MAAK,UAC7C,SAAC,GAAI,CACDxL,KAAM05C,EAAIvqC,KACVjP,MACIs5C,GAAcA,EAAWx5C,OAAS05C,EAAI15C,KAChCT,EAAMW,MAAMe,MACZ1B,EAAMW,MAAMgB,cATzBw4C,EAAI15C,UAiB7B,iBAAKyS,MAAO,CAAE4jB,KAAM,EAAGD,QAAS,OAAQ2d,cAAe,SAAUjjC,MAAO,SAA6B,WACjG,UAACkiC,GAAe,YACZ,SAACqD,GAAc,CAACpmC,OAAQA,EAAQ7N,SAAUiN,EAAOjN,YACjD,SAAC8wC,GAAc,WACX,wBAAKsG,EAAaA,EAAWhuC,MAAQ/L,EAAKY,cAAc,CAAEC,GAAIq2B,EAAInrB,aAEtE,SAACynC,GAAe,WACZ,SAACU,GAAmB,CAAC9wC,QA7C7B,KACZiH,EAAS,EAAA0H,aAAad,MAAMpF,QAAQmqC,YAAY,CAAExlC,aA4CO,UACjC,SAAC,GAAI,CAACjQ,KAAK,aAAaE,MAAOX,EAAMW,MAAMgB,SAAUjB,KAAM,gBAIvE,UAACqzC,GAAgB,YACb,UAACC,GAAY,WACRiG,GAAkC,oBAApBA,EAAWx5C,MAA8B22B,EAAIwiB,MAAMG,YAC9D,SAAClE,GAAM,CAACnlC,OAAQZ,EAAOY,SAE1BupC,GAAkC,iBAApBA,EAAWx5C,MAA2B22B,EAAIwiB,MAAMC,aAC3D,SAAC5B,GAAgB,CAACvnC,OAAQZ,EAAOY,SAEpCupC,GAAkC,qBAApBA,EAAWx5C,OACtB,SAACq4C,GAAwB,CAACpoC,OAAQA,IAErCupC,GAAkC,iBAApBA,EAAWx5C,MAA2Bg5C,IACjD,SAACJ,GAAqB,CAAC3oC,OAAQA,QAGvC,SAACioC,GAAY,CAACjoC,OAAQA,KACtB,SAACkoC,GAAc,CAACloC,OAAQA,IACvB6oC,GAAchjC,SAASzG,EAAOrP,QAAS,SAACo4C,GAAU,CAACnoC,OAAQA,EAAQjD,KAAMqC,EAAOrC,gBAI5FqC,GAAQykC,OACL,gBAAKrhC,MAAO,CAAErQ,SAAU,WAAY+zB,MAAO,EAAG9jB,gBAAiB,OAAQshB,QAAS,SAEhF,4BAIR,yBCxKKgmB,GAAyB,UAAO74C,GAAG;;;;;EAOnC84C,GAA8B,UAAO94C,GAA0B;;;kBdpBlD;sBcwBHxB,GAAWA,EAAMwQ,SAAW,MAAQ;EAG9C+pC,GAAqB,UAAO/4C,GAAG;;;;;EAO/Bg5C,GAA2B,UAAOh5C,GAAG;adjCtB;;EcyCfi5C,GAAgB,KACzB,MAAMjwC,GAAW,WACjB,IAAA7E,WAAU,KACN,MAAM+0C,EAAQ,KACVlwC,EAAS,EAAA0H,aAAad,MAAMpF,QAAQya,mBAIxC,OADAvQ,OAAOoD,iBAAiB,yBAA0BohC,GAC3C,KACHxkC,OAAOqD,oBAAoB,yBAA0BmhC,KAE1D,CAAClwC,IAEJ,MAAMmwC,GAAU,QAAe,EAAAzoC,aAAa3R,UAAUq6C,cAAe,GAAA7pC,cAErE,OACI,SAACspC,GAAsB,CAACnrC,UAAU,wBAAuB,SACpDyrC,EAAQt4C,IAAK0N,IAEN,SAAC0jC,GAAe,CAACjjC,UAAU,EAAK,UAC5B,SAAC+pC,GAAkB,UACM,SAApBxqC,EAAOjN,UACJ,iCACI,SAAC22C,GAAa,CAAC9oC,OAAQZ,EAAOY,OAAQ7N,SAAUiN,EAAOjN,YACvD,SAACw3C,GAA2B,CAAC9pC,cAA2B5N,IAAjBmN,EAAOykC,MAAmB,UAC7D,SAACF,GAAW,CAAC3jC,OAAQZ,EAAOY,YAEhC,SAAC6pC,GAAwB,QAG7B,iCACI,SAACA,GAAwB,KACzB,SAACF,GAA2B,CAAC9pC,cAA2B5N,IAAjBmN,EAAOykC,MAAmB,UAC7D,SAACF,GAAW,CAAC3jC,OAAQZ,EAAOY,YAEhC,SAAC8oC,GAAa,CAAC9oC,OAAQZ,EAAOY,OAAQ7N,SAAUiN,EAAOjN,iBAhBhCiN,EAAOY,YC5DrDkqC,GAAQ,KAAM,wBCGrB,GAAY,IAAyBn7C,iBAAiB,aAK/Co7C,GAAiB,KAEtB,SAAC,EAAA/Y,SAAQ,CAACC,UAAU,wBAAK,UACrB,SAAC,GAAS,CAACjvB,gBAAiB,QAASrF,KAAM,QAAS+mC,cAAe,SAAQ,UACvE,SAAC,KAAM,QCCjBsG,GAAqB,IAAyBr7C,iBAAiB,mBAOxDs7C,GAA6Bh7C,IACtC,MAAMG,GAAO,EAAAC,EAAA,KACPoK,GAAW,UACXvK,GAAQ,IAAAC,YACR6a,GAAS,QAAe,EAAAC,MAAMza,UAAU0a,YACxC,MAAErW,EAAOwL,IAAKwzB,EAAOpzB,SAAUqzB,GAAejB,MAC9C,KACFl/B,EAAI,SACJuM,EACAE,MAAO+K,EACP9K,IAAK+K,EACL3K,SAAU4K,GACVtL,KAEEi0B,GAAW,IAAAx0B,SAAQ,IACd,IAAK6L,EAAmB,CAACD,GAAe,MAAS0oB,EAAa,CAACD,GAAS,IAChF,CAACA,EAAOzoB,EAAa0oB,EAAYzoB,IAE9B4oB,GAAuB,IAAAj/B,aACxBqQ,IACG5K,EAAS,EAAAuB,MAAMC,QAAQtH,MAAM,CAAEwH,MAAOkJ,GAAWjV,EAAKY,cAAc,CAAEC,GAAI,qBAE9E,CAACwJ,EAAUrK,IAGTkb,GAAsB,IAAA9L,SAAQ,KACzB,QAA0BwL,EAAQ9a,EAAO+jC,GACjD,CAACjpB,EAAQipB,EAAsB/jC,IAE5Bsb,GAAgB,IAAAhM,SAAQ,IAAM,MAAsB,IAE1D,OACI,gCACKgM,IACG,SAACw/B,GAAkB,CACfx/B,cAAeA,EACfE,qBAAsBsoB,EACtBvoB,gBAAiBH,KACbrb,IAGX6jC,IAAc,SAACl/B,EAAO,CAACC,MAAOA,IAC9BwW,IAAoB,SAACpB,GAAa,CAAC/J,SAAUA,EAAUvM,KAAMA,EAAMyM,MAAO+K,Q,eCzDvF,MAAM,GAAY,IAAyBxb,iBAAiB,aACtDu7C,GAAY,IAAyBv7C,iBAAiB,aACtDw7C,GAAa,IAAyBx7C,iBAAiB,cAEtD,SAASy7C,IAAa,eACzBC,EAAc,OACdC,EAAM,YACN14C,EAAW,KACX+K,EAAO,SAAQ,gBACf4tC,IAEA,MAAMn7C,GAAO,EAAAC,EAAA,MACP,SAAEm7C,IAAa,UAEfC,GAAe,IAAAjsC,SAAQ,IAAMjH,OAAOF,OAAOizC,GAAS,CAACA,KACpDI,EAAWC,IAAgB,IAAAv5C,UAASq5C,IAAe,IAAInV,KAExDsT,EAAO6B,EAAan5C,IAAK+3C,IAAQ,IAChCA,EACHluC,MAAO/L,EAAKY,cAAc,CAAEC,GAAIo5C,EAAIluC,QACpC1J,KAAM43C,EAAIuB,aAAevB,EAAIzhC,KAAO,UAAUyiC,KAAkBhB,EAAIzhC,OACpEmwB,MAAOsR,EAAItR,MAAQ3oC,EAAKY,cAAc,CAAEC,GAAIo5C,EAAItR,aAAWlmC,KAkB/D,OAfA,IAAA+C,WAAU,KACN,MAAMi2C,EAAcJ,EAAa7yC,KAAMkzC,GAC/B,UAAUT,KAAkBS,EAAMljC,SAAW4iC,GAI1CM,EAAMC,OAAOC,OAAgB,CAACC,EAAwBC,KACzD,MAAMC,EAAU,UAAUd,KAAkBa,IACtCE,EAA2C,QAAjC,SAAUD,EAASX,GACnC,OAAOS,GAAiBG,IACzB,IAEHP,GAAaF,EAAaE,EAAYvV,MAC3C,CAACkV,EAAUC,EAAcJ,KAGxB,SAAC,EAAArZ,SAAQ,CAACC,UAAU,wBAAK,UACrB,UAAC,GAAS,CAACt0B,KAAMA,EAAI,WACjB,SAACutC,GAAS,CAACvtC,KAAMA,EAAM/K,YAAaA,EAAag3C,KAAMA,EAAM8B,UAAWA,GAAa,MACrF,SAACP,GAAU,CAACxtC,KAAMA,EAAMqpB,MAAM,KAAUukB,EAAe,UACnD,SAAC,KAAM,UAK3B,C","sources":["webpack://ReactCore/./src/components/Avatar.tsx","webpack://ReactCore/./src/components/Audience.tsx","webpack://ReactCore/./src/components/tinymce/extension/AIModal.tsx","webpack://ReactCore/./src/displayer/DisplayForm.component.tsx","webpack://ReactCore/./src/components/comments/AddReportModal.tsx","webpack://ReactCore/./src/hooks/useCommentsLikeRT.ts","webpack://ReactCore/./src/components/widgets/WidgetList/WidgetList.style.tsx","webpack://ReactCore/./src/components/widgets/WidgetList/WidgetList.tsx","webpack://ReactCore/./src/components/widgets/namespace.ts","webpack://ReactCore/./src/hooks/useMarkdownModal.ts","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetTitleEdit.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetHeaderEdit.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetTitle.tsx","webpack://ReactCore/./src/components/widgets/components/WidgetUploader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleAttachmentWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleButtonWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleGalleryWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleImageWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleSliderWrapper.tsx","webpack://ReactCore/./src/components/tinymce/extension/MarkdownModal.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleTextWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetArticleTitleWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/OfficeConfigurationPrompt.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetScroll.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetStylePadding.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetIntranetTitle.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetCalendarCalDav/WidgetCalendarCalDavHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetCalendarCalDavWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetRemove.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetFooterView.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetInlineInputText.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetIsPending.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetCheckListWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetContactCardDav/WidgetContactCardDavHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetContactCardDavWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetEmailsImap/WidgetEmailsImapHeader.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetEmailsImapWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetLuccaAbsenceWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetPresenceWrapperClosing.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetPresenceWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetQuickSurveyWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetUserProfileWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetWelcomeWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetColorWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetExtensionWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/utils.ts","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetExcelDatasourceTableWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetDatasourceTableWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/WidgetLicenseWrapper.tsx","webpack://ReactCore/./src/components/widgets/Widget.tsx","webpack://ReactCore/./src/components/widgets/WidgetLayer/WidgetLayer.style.tsx","webpack://ReactCore/./src/components/widgets/WidgetLayer/WidgetLayer.tsx","webpack://ReactCore/./src/components/widgets/WidgetState.tsx","webpack://ReactCore/./src/components/widgets/WidgetWrapperCoreEditHover.tsx","webpack://ReactCore/./src/components/widgets/wrapper/components/WidgetStyleWrapper.tsx","webpack://ReactCore/./src/components/widgets/wrapper/JRCWidgetIconWrapper.tsx","webpack://ReactCore/./src/components/widgets/WidgetWrapperCore.tsx","webpack://ReactCore/./src/components/comments/CommentsBloc.styles.ts","webpack://ReactCore/./src/components/comments/CommentsBlocAddCommentWidgetsWrapper.tsx","webpack://ReactCore/./src/components/comments/CommentsBlocCommentWidgetsWrapper.tsx","webpack://ReactCore/./src/hooks/useGifsModal.ts","webpack://ReactCore/./src/components/tinymce/extension/GifsModal.tsx","webpack://ReactCore/./src/components/CommentsBloc.tsx","webpack://ReactCore/./src/components/calendar/CalendarHeader.tsx","webpack://ReactCore/./src/components/calendar/CalendarToolbar.tsx","webpack://ReactCore/./src/utils/eventRecurrence.ts","webpack://ReactCore/./src/hooks/useAI.ts","webpack://ReactCore/./src/components/tinymce/JRCInputTinyMCEWithExt.tsx","webpack://ReactCore/./src/components/calendar/socialEvent/SocialEventOrRecurringEventForm.tsx","webpack://ReactCore/./src/components/calendar/UpdateCalendarEventModal.tsx","webpack://ReactCore/./src/components/calendar/socialEvent/UpdateSocialEventModal.tsx","webpack://ReactCore/./src/components/calendar/meeting/MeetingForm.tsx","webpack://ReactCore/./src/components/calendar/meeting/UpdateMeetingModal.tsx","webpack://ReactCore/./src/components/calendar/socialEvent/UpdateRecurringEventModal.tsx","webpack://ReactCore/./src/components/calendar/CreateCalendarEventModal.tsx","webpack://ReactCore/./src/components/modals/ModalAudience.tsx","webpack://ReactCore/./src/components/modals/ModalSchedule.tsx","webpack://ReactCore/./src/components/calendar/meeting/CreateMeetingModal.tsx","webpack://ReactCore/./src/components/calendar/ExportCalendarModal.tsx","webpack://ReactCore/./src/components/calendar/socialEvent/CreateSocialEventOrRecurringEventModal.tsx","webpack://ReactCore/./src/components/calendar/CalendarWrapper.tsx","webpack://ReactCore/./src/hooks/useCalendarRT.ts","webpack://ReactCore/./src/components/editors/style.tsx","webpack://ReactCore/./src/components/editors/const.ts","webpack://ReactCore/./src/components/editors/EditorPopup.tsx","webpack://ReactCore/./src/components/editors/Editor.tsx","webpack://ReactCore/./src/components/editors/EditorPosition.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputColor.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputNumber.tsx","webpack://ReactCore/./src/components/editors/components/EditorInputSelect.tsx","webpack://ReactCore/./src/components/editors/EditorTabWrapper.tsx","webpack://ReactCore/./src/components/editors/states/EditorIsBusy.tsx","webpack://ReactCore/./src/components/editors/states/EditorIsLocked.tsx","webpack://ReactCore/./src/components/editors/components/EditorSave.tsx","webpack://ReactCore/./src/components/editors/EditorTabWidgetSelection.tsx","webpack://ReactCore/./src/components/editors/EditorTabDisplayLevel.tsx","webpack://ReactCore/./src/components/editors/EditorWrapper.tsx","webpack://ReactCore/./src/components/editors/EditorsPortal.tsx","webpack://ReactCore/./src/components/Empty.tsx","webpack://ReactCore/./src/components/FullPageLayout.tsx","webpack://ReactCore/./src/components/tinymce/JRCInputTinyMCEWithExtRaw.tsx","webpack://ReactCore/./src/components/TwoColLayout.tsx"],"sourcesContent":["import { Network } from 'jamespot-front-business';\r\nimport { JRCAvatarProps, SROnly } from 'jamespot-react-components';\r\nimport { useIntl } from 'react-intl';\r\nimport styled, { useTheme } from 'styled-components';\r\nimport { useAppSelector } from '../redux/store';\r\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\r\n\r\nconst JRCIcon = commonComponentsRegistry.getLazyComponent('Icon');\r\nconst JRCAvatar = commonComponentsRegistry.getLazyComponent('JRCAvatar');\r\n\r\nconst BASE_MULTIPLE = 8;\r\n\r\nconst SR = styled.span`\r\n ${SROnly}\r\n`;\r\n\r\nexport const Avatar = (props: JRCAvatarProps) => {\r\n const theme = useTheme();\r\n const intl = useIntl();\r\n const networkPublic = useAppSelector(Network.selectors.selectNetworkPublic);\r\n\r\n if (props.uri === networkPublic?.uri) {\r\n return (\r\n <>\r\n <JRCIcon\r\n name={'icon-fs-wall'}\r\n size={(props.size ?? 3) * BASE_MULTIPLE}\r\n color={theme.color.primary}\r\n variant={'circle'}\r\n />\r\n <SR>{intl.formatMessage({ id: 'NETWORK_Public' })}</SR>\r\n </>\r\n );\r\n }\r\n\r\n return <JRCAvatar {...props} />;\r\n};\r\n","import { useState } from 'react';\nimport styled, { useTheme } from 'styled-components';\nimport { useIntl } from 'react-intl';\nimport { Utils } from 'jamespot-react-components';\nimport { Avatar } from './Avatar';\nimport { jObjectLittle } from 'jamespot-user-api';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\n\nconst JRCFlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCStyledHref = commonComponentsRegistry.getLazyComponent('StyledHref');\nconst JRCTooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\nconst JRCTypography = commonComponentsRegistry.getLazyComponent('Typography');\n\nexport type AudienceProps<T extends jObjectLittle> = {\n audience: T[];\n limit?: number;\n};\n\nconst LIMIT = 2;\n\nconst AudienceWrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 24px;\n`;\n\nexport const AvatarLink = styled.a<{ overlap?: boolean }>`\n display: flex;\n justify-content: center;\n align-items: center;\n position: relative;\n width: 40px;\n height: 40px;\n border-radius: 40px;\n overflow: hidden;\n color: ${(props) => props.theme.color.white};\n background-color: ${(props) => props.theme.color.lavender};\n border: 4px solid ${(props) => props.theme.color.white};\n margin-left: ${(props) => (props.overlap ? '-18px' : '0')};\n cursor: pointer;\n`;\n\nexport const Audience = <T extends jObjectLittle>({ audience, limit = LIMIT }: AudienceProps<T>) => {\n const intl = useIntl();\n const theme = useTheme();\n const [isModalOpen, setModalOpen] = useState(false);\n\n return (\n <>\n <JRCFlexBox>\n {[...audience].splice(0, limit).map((item, index) => (\n <AvatarLink overlap={index !== 0} href={item._url} target={'_blank'} key={item.id}>\n <JRCTooltip description={item.title === undefined ? ' ' : item.title} position=\"left\">\n <Avatar\n uri={item.uri}\n size={4}\n variant=\"circle\"\n alt=\"image\"\n timestamp={item.dateModified ? Utils.date.strToTimestamp(item.dateModified) : undefined}\n focusable\n />\n </JRCTooltip>\n </AvatarLink>\n ))}\n {audience.length > limit && (\n <AvatarLink onClick={() => setModalOpen(true)} overlap={true}>\n +{audience.length - limit}\n </AvatarLink>\n )}\n </JRCFlexBox>\n {audience.length > limit && (\n <JRCModalLayout\n closeHandler={() => setModalOpen(false)}\n enableClickAwayCloseModal\n open={isModalOpen}\n variant={'fixed-height'}\n maxHeight={'800px'}>\n <JRCModalContent\n title={intl.formatMessage({ id: 'GLOBAL_Audience' })}\n overflow={'scroll'}\n onClickIconClose={() => setModalOpen(false)}>\n <AudienceWrapper>\n {audience.map((item, i) => (\n <JRCFlexBox key={`audience-${i}`} y={'center'} gap={theme.space.l}>\n <Avatar size={5} uri={`${item.type}/${item.id}`} />\n <JRCStyledHref href={`${item.type}/${item.id}`}>\n <JRCTypography>{item.title}</JRCTypography>\n </JRCStyledHref>\n </JRCFlexBox>\n ))}\n </AudienceWrapper>\n </JRCModalContent>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import jamespot from 'jamespot-user-api';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { JiaTextEnhanceQuery } from '../../../hooks/useAI';\n\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCTypography = commonComponentsRegistry.getLazyComponent('Typography');\n\nconst TextWrapper = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport type AIModalProps = {\n query: JiaTextEnhanceQuery | undefined;\n};\n\ntype ResponseType = {\n response: string | undefined;\n loading: boolean;\n error: string | undefined;\n};\n\nconst loadingResponse: ResponseType = {\n response: undefined,\n loading: true,\n error: undefined,\n};\n\nexport const AIModal = ({ query }: AIModalProps) => {\n const intl = useIntl();\n const [response, setResponse] = useState<ResponseType>(loadingResponse);\n const theme = useTheme();\n\n const sendAIRequest = useCallback(\n (query: JiaTextEnhanceQuery) => {\n setResponse(loadingResponse);\n jamespot.jia\n .textEnhancement({ text: query.text, capacity: query.capability })\n .then((response) => {\n if (response.error) {\n setResponse({\n error: `${intl.formatMessage({ id: 'JIA_ERROR_AI_CALL' })}${\n response.errorMsg && ': ' + response.errorMsg\n }`,\n loading: false,\n response: undefined,\n });\n return;\n }\n const textResponse = response.result.text;\n setResponse({\n error: undefined,\n loading: false,\n response: textResponse,\n });\n })\n .catch((_err) => {\n setResponse({\n error: intl.formatMessage({ id: 'JIA_ERROR_AI_CALL' }),\n loading: false,\n response: undefined,\n });\n });\n },\n [intl],\n );\n\n useEffect(() => {\n if (query && query.text.trim().length > 0) {\n sendAIRequest(query);\n }\n }, [query, sendAIRequest]);\n\n return (\n <JRCModalLayout\n zIndex={theme.zIndex.tinyMCEModal}\n open={!!query}\n closeHandler={() => {\n query?.reject();\n }}>\n <JRCModalContent\n overflow=\"scroll\"\n buttons={[\n {\n children: intl.formatMessage({ id: 'GLOBAL_Try_Again' }),\n clickHandler: () => {\n query && sendAIRequest(query);\n },\n },\n {\n children: intl.formatMessage({ id: 'GLOBAL_Validation' }),\n clickHandler: () => response.response && query?.resolve(response.response),\n },\n {\n children: intl.formatMessage({ id: 'GLOBAL_Cancel' }),\n clickHandler: () => query?.reject(),\n },\n ]}\n isFull>\n <TextWrapper>\n {response.loading && (\n <>\n <JRCLoader />\n <JRCTypography align=\"center\">\n {intl.formatMessage({ id: 'JIA_WAITING_WARNIG' })}\n </JRCTypography>\n </>\n )}\n {!response.loading && response.error && <p>{response.error}</p>}\n {!response.loading && response.response && <p>{response.response}</p>}\n </TextWrapper>\n </JRCModalContent>\n </JRCModalLayout>\n );\n};\n","import { DisplayFormFieldsConfig, DisplayFormRef } from './types';\nimport { useForm, Control, FieldValues } from 'react-hook-form';\nimport { useDisplayForm } from './useDisplay';\nimport styled, { css } from 'styled-components';\nimport {\n FormEventHandler,\n ForwardedRef,\n forwardRef,\n ReactNode,\n Ref,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { AudienceAutocomplete } from 'jamespot-user-api';\n\nconst StretchContainer = css`\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n`;\n\nconst Container = styled.div<{ stretch?: boolean }>`\n ${({ stretch }) => stretch && StretchContainer}\n`;\n\nconst Form = styled.form<{ stretch?: boolean }>`\n ${({ stretch }) => stretch && StretchContainer}\n`;\n\nconst FormElement = (\n props: {\n stretch?: boolean;\n onSubmit?: FormEventHandler<HTMLFormElement>;\n children: ReactNode;\n dataCy?: string;\n },\n ref: ForwardedRef<HTMLFormElement | HTMLDivElement>,\n) => {\n return props.onSubmit ? (\n <Form\n stretch={props.stretch}\n onSubmit={props.onSubmit}\n ref={ref as Ref<HTMLFormElement>}\n data-cy={props.dataCy}>\n {props.children}\n </Form>\n ) : (\n <Container stretch={props.stretch} ref={ref as Ref<HTMLDivElement>} data-cy={props.dataCy}>\n {props.children}\n </Container>\n );\n};\nconst FormElm = forwardRef(FormElement);\n\nconst FieldsetWrapper = styled.div<{ stretch?: boolean }>`\n ${(props) =>\n props.stretch &&\n `\n flex: 1;\n`}\n`;\n\ntype FormFn<TFieldValues extends FieldValues> = Omit<\n ReturnType<typeof useForm<TFieldValues>>,\n 'handleSubmit' | 'control' | 'reset'\n>;\n\nexport type DisplayFormProps<TFieldValues extends FieldValues> = {\n type: string;\n fields: DisplayFormFieldsConfig<TFieldValues>;\n extraInputs?: (control: Control<TFieldValues>) => ReactNode;\n defaultValues?: any;\n onSubmit?: any;\n buttons?: ReactNode;\n readOnly?: boolean;\n dataCy?: string;\n stretch?: boolean;\n children?: ReactNode;\n forceMandatory?: boolean;\n onInit?: (formFn: FormFn<TFieldValues>) => void;\n};\n\n/****\n * The jamespot model depend on the platform\n * For example a user can have the size attribute only for a given platform\n * The model specifics of a platform are stored in J.model\n *\n * This component display an array of attributes only if this attribute is activated on the platform\n */\nconst _DisplayForm = <TFieldValues extends FieldValues>(\n { onInit, ...props }: DisplayFormProps<TFieldValues>,\n ref: ForwardedRef<DisplayFormRef>,\n) => {\n const formRef = useRef<HTMLFormElement | HTMLDivElement>(null);\n\n const [configuration, defaultValues] = useDisplayForm(props.fields, props.type, props.forceMandatory);\n const [isInit, setIsInit] = useState(false);\n\n const { handleSubmit, control, reset, ...formFn } = useForm({\n defaultValues: {\n ...defaultValues,\n ...props.defaultValues,\n },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n if (onInit && !isInit) {\n onInit(formFn);\n setIsInit(true);\n }\n }, [onInit, formFn, isInit]);\n\n const formatValuesForSubmit = useCallback(\n (values: any) => {\n const toRet: any = {};\n Object.keys(values).forEach((k) => {\n const widget = configuration.find((c) => c.name === k)?.widget;\n switch (widget?.type) {\n case 'audience':\n toRet[k] = values[k].map((v: AudienceAutocomplete) => v.uri).join(',');\n break;\n case 'taxonomy':\n toRet[k] = values[k].map((v: any) => v.title).join(',');\n break;\n case 'toggle':\n toRet[k] = values[k] ? '1' : '0';\n break;\n default:\n toRet[k] = values[k];\n break;\n }\n });\n return toRet;\n },\n [configuration],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n ...formFn,\n handleSubmit,\n control,\n reset: () => {\n // in case the form is scrollable\n formRef?.current?.scrollTo(0, 0);\n // reset react-hook-form form\n reset();\n },\n getFormattedValues: () => {\n return formatValuesForSubmit(formFn.getValues());\n },\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n return (\n <FormElm\n dataCy={props.dataCy}\n stretch={props.stretch}\n onSubmit={props.onSubmit ? handleSubmit(props.onSubmit) : undefined}\n ref={formRef}>\n <FieldsetWrapper stretch={props.stretch}>\n {configuration.map(({ Input, ...conf }) => (\n <Input\n key={conf.name}\n control={control}\n {...conf}\n dataCy={`${props.dataCy}-${conf.name}`}\n readOnly={props.readOnly}\n />\n ))}\n {props.extraInputs && props.extraInputs(control)}\n </FieldsetWrapper>\n {props.buttons}\n </FormElm>\n );\n};\n\nexport const DisplayForm = forwardRef<DisplayFormRef>(_DisplayForm as any) as <TFieldValues extends FieldValues>(\n props: DisplayFormProps<TFieldValues> & {\n ref?: ForwardedRef<DisplayFormRef>;\n },\n) => ReturnType<typeof _DisplayForm>;\n","import { Toast } from 'jamespot-front-business';\r\nimport jApi, { ArticlesList, jCommentList } from 'jamespot-user-api';\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport styled from 'styled-components';\r\nimport { DisplayForm } from '../../displayer/DisplayForm.component';\r\nimport { DisplayFormRef } from '../../displayer/types';\r\nimport { useAbortController } from '../../hooks';\r\nimport { useAppDispatch } from '../../redux/store';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\n\r\nconst ModalForm = commonComponentsRegistry.getLazyComponent('ModalForm');\r\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\r\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst Ellipsis = commonComponentsRegistry.getLazyComponent('Deprecated_Ellipsis');\r\nconst StyledHref = commonComponentsRegistry.getLazyComponent('StyledHref');\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: ${({ theme }) => theme.space.md}px;\r\n`;\r\n\r\nconst ContentPreview = styled.div`\r\n display: flex;\r\n gap: ${({ theme }) => theme.space.md}px;\r\n align-items: center;\r\n border: 1px solid ${({ theme }) => theme.color.grey2};\r\n background-color: ${({ theme }) => theme.color.grey0};\r\n border-radius: ${({ theme }) => theme.size.sm}px;\r\n padding: ${({ theme }) => theme.space.md}px;\r\n`;\r\n\r\nconst ContentWrapper = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: ${({ theme }) => theme.space.sm}px;\r\n`;\r\n\r\nexport type AddReportModalProps = {\r\n onClose: () => void;\r\n articleId: number;\r\n articleUri: string;\r\n commentUri: string;\r\n};\r\n\r\nexport const AddReportModal = ({ onClose, articleId, articleUri, commentUri }: AddReportModalProps) => {\r\n const intl = useIntl();\r\n const formRef = useRef<DisplayFormRef>(null);\r\n const dispatch = useAppDispatch();\r\n const [open, setOpen] = useState(true);\r\n const [article, setArticle] = useState<ArticlesList>();\r\n const [comment, setComment] = useState<jCommentList>();\r\n const [contentLoading, setContentLoading] = useState(true);\r\n const [submitLoading, setSubmitLoading] = useState(false);\r\n const abortController = useAbortController();\r\n\r\n useEffect(() => {\r\n Promise.all([\r\n (async () => {\r\n const res = await jApi.article.get(\r\n { idArticle: articleId },\r\n { signal: abortController.signal, format: 'raw-list' },\r\n );\r\n setArticle(res.result);\r\n })(),\r\n (async () => {\r\n if (commentUri) {\r\n const res = await jApi.article.getComments(\r\n { idArticle: articleId },\r\n {\r\n format: 'raw-list',\r\n signal: abortController.signal,\r\n },\r\n );\r\n setComment(res.result.find((c) => c.uri === commentUri));\r\n }\r\n })(),\r\n ]).then(() => {\r\n setContentLoading(false);\r\n });\r\n }, [abortController, articleId, commentUri]);\r\n\r\n const closeModal = useCallback(() => {\r\n setOpen(false);\r\n onClose();\r\n }, [onClose]);\r\n\r\n const submit = useCallback(\r\n (description?: string) => {\r\n if (!description?.trim()) {\r\n dispatch(\r\n Toast.actions.error({ label: intl.formatMessage({ id: 'CRPT_Report_Description_Required' }) }),\r\n );\r\n } else {\r\n setSubmitLoading(true);\r\n jApi.contentReport\r\n .createReport({\r\n uri: commentUri || articleUri,\r\n description: description,\r\n })\r\n .then(() => {\r\n dispatch(Toast.actions.success({ label: intl.formatMessage({ id: 'CRPT_Report_Sent' }) }));\r\n closeModal();\r\n })\r\n .catch((e) => {\r\n Toast.actions.error({ label: e.errorMsg ?? 'GLOBAL_Error' });\r\n setSubmitLoading(false);\r\n });\r\n }\r\n },\r\n [articleUri, closeModal, commentUri, dispatch, intl],\r\n );\r\n\r\n const submitForm = useCallback(\r\n ({ description }: { description: string }) => {\r\n submit(description);\r\n },\r\n [submit],\r\n );\r\n\r\n return (\r\n <ModalForm\r\n title={intl.formatMessage({ id: 'CRPT_Add_Report' })}\r\n open={open}\r\n closeHandler={closeModal}\r\n onSubmit={async () => submit(formRef.current?.getValues().description)}\r\n enableClickAwayCloseModal\r\n maxHeight={'520px'}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: closeModal,\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Send\" />,\r\n clickHandler: () => submit(formRef.current?.getValues().description),\r\n color: 'valid',\r\n loading: submitLoading,\r\n },\r\n ]}>\r\n {contentLoading ? (\r\n <Loader size={'l'} />\r\n ) : (\r\n <Container>\r\n <ContentPreview>\r\n <Icon name={commentUri ? 'icon-comment' : 'icon-file'} size={50} variant={'square'} />\r\n <ContentWrapper>\r\n <Typography variant={commentUri ? 'h3' : 'h2'}>\r\n <Ellipsis label={article?.title} length={40} />\r\n </Typography>\r\n {comment && (\r\n <Typography>\r\n {intl.formatMessage({ id: 'CRPT_Comment_Of' })}{' '}\r\n <StyledHref href={comment?._user._url}>{comment?._user.title}</StyledHref>\r\n </Typography>\r\n )}\r\n </ContentWrapper>\r\n </ContentPreview>\r\n <DisplayForm ref={formRef} fields={['description']} type=\"contentReport\" onSubmit={submitForm} />\r\n </Container>\r\n )}\r\n </ModalForm>\r\n );\r\n};\r\n","import { useEffect, useMemo } from 'react';\nimport { Comment } from 'jamespot-front-business';\nimport socket from '../utils/socket';\nimport { useAppDispatch } from '../redux/store';\n\nconst useCommentsLikeRT = (idComments: number[] | undefined, idArticle: number) => {\n const dispatch = useAppDispatch();\n const reactSocket = useMemo(() => socket, []);\n const rtHandlers = useMemo(\n () => Comment.getCommentsLikeRTHandlers(dispatch, idComments, idArticle),\n [dispatch, idComments, idArticle],\n );\n\n useEffect(() => {\n rtHandlers.forEach((handler) => {\n reactSocket.onMessage(handler.namespace, handler.function, handler.handler);\n });\n return () => {\n rtHandlers.forEach((handler) => {\n reactSocket.offMessage(handler.namespace, handler.function, handler.handler);\n });\n };\n }, [rtHandlers, reactSocket]);\n};\n\nexport default useCommentsLikeRT;\n","import { DashedFocusBorder } from 'jamespot-react-components';\nimport styled from 'styled-components';\n\nexport const CSSSquareWidgetWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 10px;\n justify-content: center;\n`;\n\nexport const CSSSquareWidget = styled.div<{ available: boolean }>`\n border: 1px solid ${(props) => props.theme.color.grey2};\n border-radius: 8px;\n cursor: pointer;\n padding: 12px;\n position: relative;\n opacity: ${(props) => (props.available ? '1' : '.4')};\n pointer-events: ${(props) => (props.available ? 'all' : 'none')};\n\n .show-on-hover {\n position: absolute;\n inset: 0;\n border-radius: 8px;\n justify-content: center;\n align-items: center;\n display: flex;\n opacity: 0;\n background-color: #ffffffe6;\n }\n\n &:hover {\n .show-on-hover {\n opacity: 1;\n }\n }\n`;\n\nexport const CSSWidgetButton = styled.div<{ open: boolean; height: number }>`\n border: 2px solid ${(props) => props.theme.color.primary};\n height: ${(props) => (props.open ? props.height : '54')}px;\n border-radius: 8px;\n display: flex;\n justify-content: top;\n flex-direction: column;\n transition: height 0.4s;\n overflow: hidden;\n flex-direction: column;\n`;\n\nexport const CSSWrapWidgetWrapper = styled.div<{ column?: boolean }>`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n gap: 10px;\n ${(props) => props.column && `flex-direction: column;`}\n`;\n\nexport const CSSWrapTitle = styled.div`\n min-height: 50px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n color: ${(props) => props.theme.color.primary};\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n`;\n\nexport const CSSWrapWidget = styled.button<{ open: boolean; index: number; full?: boolean; parentIsColumn?: boolean }>`\n display: flex;\n align-items: center;\n padding: ${(props) => (props.parentIsColumn ? '36px 16px' : '0 10px')};\n gap: 10px;\n width: 40%;\n border: 1px solid ${(props) => props.theme.color.grey1};\n border-radius: 8px;\n transition: opacity 0.4s ease ${(props) => props.index * 40}ms;\n opacity: ${(props) => (props.open ? 1 : 0)};\n img {\n width: 40px;\n }\n ${(props) => props.full && `flex: 1; width: 100%;`}\n ${(props) => props.parentIsColumn && `flex-basis: 72px;`}\n ${(props) => !props.parentIsColumn && `height: 72px;`}\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n\n ${DashedFocusBorder()}\n`;\n\nexport const Flex = styled.div<{ direction: 'row' | 'column'; gap?: number }>`\n display: flex;\n flex-direction: ${(props) => (props.direction === 'row' ? 'row' : 'column')};\n align-items: ${(props) => (props.direction === 'row' ? 'center' : 'flex-start')};\n justify-content: ${(props) => (props.direction === 'row' ? 'flex-start' : 'center')};\n flex: 1;\n ${(props) => props.gap && `gap:${props.gap}px`}\n`;\n","import { useMemo, useState } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport { WidgetDefinitionProps, WidgetKeys, WidgetWrapperProps } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport { JRCModalLayoutProps } from 'jamespot-react-components';\nimport { getBuilderWidgets } from '../namespace';\nimport {\n CSSSquareWidget,\n CSSSquareWidgetWrapper,\n CSSWidgetButton,\n CSSWrapTitle,\n CSSWrapWidget,\n CSSWrapWidgetWrapper,\n Flex,\n} from './WidgetList.style';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCTooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\nconst JRCIconButton = commonComponentsRegistry.getLazyComponent('IconButton');\n\ntype WidgetListMode = 'button' | 'list' | 'gallery' | 'custom' | 'article' | 'comment';\n\n/*\n Widget Builder\n*/\nexport const WidgetList = ({\n mode,\n view,\n children,\n namespace = 'default',\n onChange,\n}: {\n mode?: WidgetListMode;\n view?: string;\n children?: any;\n namespace?: string;\n onChange: (widget: WidgetWrapperProps) => void;\n}) => {\n const [isOpen, setOpen] = useState<boolean>(false);\n const widgets = getBuilderWidgets(namespace);\n const intl = useIntl();\n\n const args: JRCModalLayoutProps = {\n open: isOpen,\n portalId: 'react-modal',\n variant: 'full-height',\n closeHandler: () => setOpen(false),\n };\n\n const onClick = (name: WidgetKeys) => {\n onChange(Widget.factory(name));\n setOpen(false);\n };\n return (\n <>\n <JRCModalLayout {...args}>\n <JRCModalContent\n onClickIconClose={args.closeHandler}\n buttons={\n mode === 'comment'\n ? [\n {\n children: <FormattedMessage id=\"GLOBAL_Close\" />,\n color: 'cancel',\n clickHandler: () => setOpen(false),\n },\n ]\n : undefined\n }\n title={intl.formatMessage({ id: 'WIDGET_Builder' })}>\n {mode === 'comment' ? (\n <CSSWrapWidgetWrapper column>\n {widgets.map((widget, index) => (\n <CSSWrapWidget\n key={widget.name}\n open={true}\n full\n parentIsColumn\n index={index}\n onClick={() => onClick(widget.name)}>\n <Flex direction={'row'} gap={12}>\n <img src={widget.img} />\n <Flex direction={'column'}>\n <h3>{intl.formatMessage({ id: widget.label })}</h3>\n <p>{intl.formatMessage({ id: widget.description })}</p>\n </Flex>\n </Flex>\n </CSSWrapWidget>\n ))}\n </CSSWrapWidgetWrapper>\n ) : (\n <CSSSquareWidgetWrapper>\n {widgets.map((widget, index: number) => {\n return (\n <CSSSquareWidget\n key={index}\n onClick={() => onClick(widget.name)}\n available={widget.available}>\n <img src={widget.img} />\n <div className=\"show-on-hover\">{intl.formatMessage({ id: widget.label })}</div>\n </CSSSquareWidget>\n );\n })}\n </CSSSquareWidgetWrapper>\n )}\n </JRCModalContent>\n </JRCModalLayout>\n {mode === 'custom' && children ? <div onClick={() => setOpen(true)}>{children}</div> : <></>}\n {mode === 'button' && view === 'edit' ? (\n <JRCButton onClick={() => setOpen(true)} variant={'outlined'} minWidth={'100%'}>\n {intl.formatMessage({ id: 'WIDGET_Add_Widget' })}\n </JRCButton>\n ) : (\n <></>\n )}\n {mode === 'gallery' && view === 'edit' ? (\n <CSSSquareWidgetWrapper>\n {widgets.map((widget, index: number) => {\n return (\n <CSSSquareWidget\n key={index}\n onClick={() => onClick(widget.name)}\n available={widget.available}>\n <img src={widget.img} />\n <div className=\"show-on-hover\">{intl.formatMessage({ id: widget.label })}</div>\n </CSSSquareWidget>\n );\n })}\n </CSSSquareWidgetWrapper>\n ) : (\n <></>\n )}\n {mode === 'article' && view === 'edit' ? <WidgetModeArticle widgets={widgets} onClick={onClick} /> : <></>}\n {mode === 'comment' && view === 'edit' ? (\n <WidgetModeComment\n onClick={() => {\n setOpen(true);\n }}\n />\n ) : (\n <></>\n )}\n </>\n );\n};\n\nconst HEIGHT_CLOSED = 50;\nconst HEIGHT = 80;\nconst MARGIN_BOTTOM = 10;\n\nconst WidgetModeArticle = ({\n widgets,\n onClick,\n}: {\n widgets: WidgetDefinitionProps[];\n onClick: (name: WidgetKeys) => void;\n}) => {\n const [open, isOpen] = useState(false);\n const intl = useIntl();\n\n const calcHeight = useMemo(() => {\n return Math.ceil(widgets.length / 2) * HEIGHT + HEIGHT_CLOSED + MARGIN_BOTTOM;\n }, [widgets]);\n\n return (\n <>\n <CSSWidgetButton open={open} height={calcHeight}>\n <CSSWrapTitle onClick={() => isOpen(!open)}>\n {intl.formatMessage({ id: 'WIDGET_Add_Widget' })}\n </CSSWrapTitle>\n <CSSWrapWidgetWrapper>\n {widgets.map((widget, index) => {\n return (\n <CSSWrapWidget\n key={widget.name}\n open={open}\n index={index}\n onClick={() => onClick(widget.name)}>\n <img src={widget.img} />\n {intl.formatMessage({ id: widget.label })}\n </CSSWrapWidget>\n );\n })}\n </CSSWrapWidgetWrapper>\n </CSSWidgetButton>\n </>\n );\n};\n\nconst WidgetModeComment = ({ onClick }: { onClick: () => void }) => {\n const intl = useIntl();\n return (\n <>\n <JRCTooltip description={intl.formatMessage({ id: 'COMMENT_Add_Widget' })}>\n <JRCIconButton\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={22}\n onClick={() => {\n onClick();\n }}\n icon={'icon-fs-puzzle'}\n />\n </JRCTooltip>\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { WidgetDefinitionProps, WidgetsName } from 'jamespot-user-api';\n\nexport function getBuilderWidgets(namespace: string): WidgetDefinitionProps[] {\n switch (namespace) {\n case 'widget-article-image':\n return [Widget.definition(WidgetsName.ArticleTitle), Widget.definition(WidgetsName.ArticleButton)];\n case 'comment':\n return [\n Widget.definition(WidgetsName.CheckList),\n Widget.definition(WidgetsName.Presence),\n Widget.definition(WidgetsName.QuickSurvey),\n ];\n default:\n return [\n Widget.definition(WidgetsName.ArticleTitle),\n Widget.definition(WidgetsName.ArticleText),\n Widget.definition(WidgetsName.ArticleImage),\n Widget.definition(WidgetsName.ArticleButton),\n Widget.definition(WidgetsName.ArticleSlider),\n Widget.definition(WidgetsName.ArticleAttachment),\n Widget.definition(WidgetsName.Presence),\n ];\n }\n}\n","import { useMemo, useState } from 'react';\r\nimport { Editor, JTinyMCEExtensionsBuilders } from 'jamespot-react-components';\r\nimport { useIntl } from 'react-intl';\r\n\r\nexport const useMarkdownModal = (): {\r\n open: boolean;\r\n onInsert: (v: string) => void;\r\n close: () => void;\r\n ext: ReturnType<typeof JTinyMCEExtensionsBuilders.markdown>;\r\n isActive?: boolean;\r\n} => {\r\n const intl = useIntl();\r\n const [open, setOpen] = useState(false);\r\n const [editor, setEditor] = useState<Editor>();\r\n const ext = useMemo(\r\n () =>\r\n JTinyMCEExtensionsBuilders.markdown((ed) => {\r\n setEditor(ed);\r\n setOpen(true);\r\n }, intl),\r\n [intl],\r\n );\r\n return {\r\n open,\r\n onInsert: (v: string) => {\r\n editor?.execCommand('InsertHTML', false, v);\r\n },\r\n close: () => setOpen(false),\r\n ext,\r\n isActive: true,\r\n };\r\n};\r\n","import { Widget } from 'jamespot-front-business';\nimport { useEffect } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppDispatch, useAppSelector } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\n\nconst JRCInputText = commonComponentsRegistry.getLazyComponent('InputText');\n\nexport const WidgetTitleEdit = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const widgetWrapperTitle = useAppSelector(\n (state) => Widget.selectors.selectWidget(state, uniqid)?.title,\n shallowEqual,\n );\n\n const { control, watch } = useForm({\n defaultValues: { widgetTitle: widgetWrapperTitle },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, title: data.widgetTitle }));\n });\n return () => subscription.unsubscribe();\n }, [watch, dispatch, uniqid]);\n\n return (\n <JRCInputText\n name={'widgetTitle'}\n control={control}\n placeholder={intl.formatMessage({ id: 'GLOBAL_Title' })}\n width=\"100%\"\n margin=\"0\"\n />\n );\n};\n","import { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { WidgetsName } from 'jamespot-user-api';\nimport { useCallback, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetTitleEdit } from './WidgetTitleEdit';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCIconButton = commonComponentsRegistry.getLazyComponent('IconButton');\n\nexport const CSSModalFooter = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row-reverse;\n`;\n\nexport const CSSWidgetHeaderEdit = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: ${(props) => props.theme.space.sm}px;\n padding: ${(props) => props.theme.space.sm}px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const CSSWidgetHeaderEditTitle = styled.div`\n flex: 1;\n display: flex;\n fieldset:first-of-type {\n margin: 0px !important;\n }\n`;\n\nexport const CSSWidgetHeaderEditActions = styled.div`\n display: flex;\n gap: ${(props) => props.theme.space.sm}px;\n`;\n\nexport const WidgetHeaderEdit = ({\n uniqid,\n name,\n handleOpenEditor,\n}: {\n uniqid: string;\n name: WidgetsName;\n handleOpenEditor?: () => void;\n}) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n\n const handleOnClick = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n mode: 'edit',\n }),\n );\n }, [uniqid, dispatch, name]);\n\n const handleRemoveWidget = useCallback(() => {\n dispatch(Widget.slice.actions.flushWidget({ uniqid }));\n }, [uniqid, dispatch]);\n\n return (\n <>\n <CSSWidgetHeaderEdit>\n <CSSWidgetHeaderEditTitle>\n <WidgetTitleEdit uniqid={uniqid} />\n </CSSWidgetHeaderEditTitle>\n <CSSWidgetHeaderEditActions>\n <JRCIconButton\n icon=\"icon-pencil\"\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={14}\n onClick={handleOpenEditor ?? handleOnClick}\n title={intl.formatMessage({ id: 'BUTTON_Title_Open_Edit_Panel' })}\n />\n <JRCIconButton\n icon=\"icon-trash\"\n bg={'grey1'}\n bgHover={'grey2'}\n color={'grey5'}\n iconSize={14}\n onClick={() => setIsOpen(true)}\n title={intl.formatMessage({ id: 'BUTTON_Title_Open_Remove_Widget' })}\n />\n </CSSWidgetHeaderEditActions>\n </CSSWidgetHeaderEdit>\n {isOpen && (\n <JRCModalLayout enableClickAwayCloseModal={true} open={isOpen} closeHandler={() => setIsOpen(false)}>\n <JRCModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'WIDGET_Remove_Widget' })}\n onClickIconClose={() => setIsOpen(false)}>\n {intl.formatMessage({ id: 'WIDGET_Delete_Widget_Confirmation' })}\n </JRCModalContent>\n <CSSModalFooter>\n <JRCButton label={intl.formatMessage({ id: 'GLOBAL_Confirm' })} onClick={handleRemoveWidget} />\n </CSSModalFooter>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { CSSProperties, useMemo } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport styled, { useTheme } from 'styled-components';\nimport { useAppSelector } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\n\nconst JRCHtml = commonComponentsRegistry.getLazyComponent('Html');\n\nexport const CSSWidgetTitle = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const WidgetTitle = ({ uniqid }: { uniqid: string }) => {\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n fontSize: styles && styles['font-size'] ? `${styles['font-size']}px` : '24px',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n const title = useMemo(() => {\n return widgetWrapper && typeof widgetWrapper.title === 'string' && widgetWrapper.title.length !== 0\n ? widgetWrapper.title\n : undefined;\n }, [widgetWrapper]);\n\n if (!title) return <></>;\n\n return (\n <CSSWidgetTitle\n style={{\n color: initialValues.color,\n backgroundColor: initialValues.backgroundColor,\n fontSize: initialValues.fontSize,\n fontWeight: initialValues.fontWeight,\n textAlign: initialValues.textAlign as CSSProperties['textAlign'],\n }}>\n <JRCHtml as=\"span\" __html={title} />\n </CSSWidgetTitle>\n );\n};\n","import { ReactNode, useEffect, useRef, useState } from 'react';\nimport { jFileLittle } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\n\nconst JRCInputFileAdvancedRaw = commonComponentsRegistry.getLazyComponent('InputFileAdvancedRaw');\n\nexport const CSSHidden = styled.div`\n width: 0;\n height: 0;\n overflow: hidden;\n`;\n\ntype InplaceUploaderProps = {\n children: ReactNode;\n initialFiles: jFileLittle[];\n initialClick?: boolean;\n multiple: boolean;\n accept: string;\n onUploadStart: () => void;\n onUploadEnd: () => void;\n onUploadSuccess: (files: jFileLittle[]) => void;\n};\n\nexport const WidgetUploader = ({\n children,\n initialFiles,\n initialClick,\n multiple,\n accept,\n onUploadStart,\n onUploadEnd,\n onUploadSuccess,\n}: InplaceUploaderProps) => {\n const uploadRef = useRef<HTMLInputElement>(null);\n const token = useAppSelector(Widget.selectors.selectToken);\n const [total, setTotal] = useState<number>(0);\n const [files, setFiles] = useState<jFileLittle[]>(initialFiles);\n\n useEffect(() => {\n if (initialClick) {\n uploadRef.current?.click();\n }\n }, [initialClick]);\n\n useEffect(() => {\n if (initialFiles.length !== files.length) {\n setFiles(initialFiles);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialFiles]);\n\n useEffect(() => {\n onUploadSuccess(files);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [files]);\n\n useEffect(() => {\n if (total === 0) {\n onUploadEnd();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [total]);\n\n return (\n <>\n <div\n onClick={() => {\n if (initialClick) {\n uploadRef.current?.click();\n }\n }}>\n {children}\n </div>\n <CSSHidden>\n <JRCInputFileAdvancedRaw\n ref={uploadRef}\n id=\"widget-upload-file\"\n name=\"editorFiles\"\n content={''}\n accept={accept as any}\n multiple={multiple}\n token={token}\n onUploadStart={(totalFile) => {\n if (totalFile !== undefined) {\n setTotal((prevTotal) => prevTotal + totalFile);\n }\n if (typeof onUploadStart === 'function' && totalFile !== 0) {\n onUploadStart();\n }\n }}\n onUploadSuccess={(fileResponse) => {\n if (fileResponse === undefined) {\n return;\n }\n setTotal((prevTotal) => (prevTotal !== undefined ? prevTotal - 1 : 0));\n setFiles((prevFiles) => (multiple ? [...prevFiles, fileResponse] : [fileResponse]));\n }}\n />\n </CSSHidden>\n </>\n );\n};\n","import { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport jamespot, {\n jFileLittle,\n WidgetArticleAttachmentType,\n WidgetDisplayMode,\n WidgetArticleAttachmentContent,\n resolveFilePath,\n} from 'jamespot-user-api';\nimport { Application, Toast, Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { JRCFileViewerOpenWithOptionsType } from 'jamespot-react-components';\nimport { WidgetUploader } from '../components/WidgetUploader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetAttachment = commonComponentsRegistry.getLazyComponent('WidgetAttachment');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\n// DUPLICATE FROM WEDOC\nexport const wedocWindowOpen = (idFile: number, hash: string, target?: '_blank') => {\n window.open(getWedocFilePath(idFile, hash), target);\n};\n\n// DUPLICATE FROM WEDOC\nexport function getWedocFilePath(idFile: number, hash: string) {\n return `/ng/rr/file/${idFile}/${hash}`;\n}\n\nexport const CSSWrapper = styled.div`\n flex: 1;\n`;\n\nexport const JRCWidgetArticleAttachmentWrapper = ({\n widget,\n inplace,\n mode,\n}: {\n widget: WidgetArticleAttachmentType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const intl = useIntl();\n const { uniqid } = widget;\n const { files } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n const onError = (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n };\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !files || files.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [files]);\n\n const weDoc = useAppSelector((state) => Application.selectors.selectById(state, 'WeDocHook'));\n\n const onClick = (file: jFileLittle | undefined) => {\n if (!file) {\n return;\n }\n jamespot.object\n .getAccessHash(`fileArticle/${file.id}`)\n .then((response) => {\n if (response.result === '') {\n throw new Error('result empty');\n }\n const hash = response.result;\n wedocWindowOpen(file.id, hash);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'WIDGET_Open_Failed' }, 6000));\n });\n };\n\n const option = [\n {\n label: intl.formatMessage({ id: 'WIDGET_Open_With_Wedoc' }),\n onClick: onClick,\n },\n ];\n\n const openWithOptions: JRCFileViewerOpenWithOptionsType = weDoc\n ? [\n {\n condition: (f) =>\n [\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n ].includes(f.mimetype),\n options: option,\n },\n ]\n : [];\n\n return files !== undefined ? (\n <CSSWrapper>\n {mode !== 'view' ? (\n <WidgetAttachment files={files} onClick={() => undefined} onError={onError} />\n ) : (\n <FileViewer files={files} openWithOptions={openWithOptions}>\n {(open) => {\n return (\n <WidgetAttachment\n files={files.map((f) => ({\n ...f,\n uri: resolveFilePath(f),\n }))}\n onClick={(idFile) => open(idFile)}\n onError={onError}\n />\n );\n }}\n </FileViewer>\n )}\n {inplace && mode !== 'view' && (\n <WidgetUploader\n initialFiles={files}\n initialClick={isActive}\n multiple={true}\n accept={'*'}\n onUploadSuccess={(files) => {\n if (Array.isArray(files)) {\n dispatch(\n updateWidgetContent<WidgetArticleAttachmentContent>(uniqid, {\n files: files.map((f) => ({\n ...f,\n uri: resolveFilePath(f) ?? '',\n })),\n }),\n );\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n {mode === 'edit' ? (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Attachment_Empty_Label'}\n description={'WIDGET_Article_Attachment_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n ) : (\n <></>\n )}\n </WidgetUploader>\n )}\n </CSSWrapper>\n ) : (\n <></>\n );\n};\n","import { useEffect } from 'react';\nimport styled from 'styled-components';\nimport { WidgetArticleButtonType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCWidgetButton = commonComponentsRegistry.getLazyComponent('WidgetButton');\n\nconst CSSButtonWrapper = styled.div`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nconst CSSPointer = styled.div<{ clickable: boolean }>`\n pointer-events: ${(props) => (props.clickable ? 'all' : 'none')};\n cursor: pointer;\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nexport const JRCWidgetArticleButtonWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetArticleButtonType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const dispatch = useAppDispatch();\n const { uniqid } = widget;\n const { text, url, target, color, backgroundColor, buttonSize, borderRadius, variant } = widget.content;\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n return (\n <CSSButtonWrapper\n onClick={() => {\n if (mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n }}>\n <CSSPointer clickable={mode !== 'edit'}>\n <JRCWidgetButton\n text={text}\n url={url}\n target={target}\n color={color}\n backgroundColor={backgroundColor}\n buttonSize={buttonSize}\n borderRadius={borderRadius}\n variant={variant}\n />\n </CSSPointer>\n </CSSButtonWrapper>\n );\n};\n","import { useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { WidgetArticleGalleryContent, WidgetArticleGalleryType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetUploader } from '../components/WidgetUploader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCWidgetArticleGallery = commonComponentsRegistry.getLazyComponent('WidgetArticleGallery');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\nconst CSSImagePointer = styled.button`\n cursor: pointer;\n`;\n\nexport const JRCWidgetArticleGalleryWrapper = ({\n widget,\n inplace,\n mode,\n}: {\n widget: WidgetArticleGalleryType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const { uniqid } = widget;\n const { files } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return files !== undefined ? (\n <>\n {mode === 'edit' ? (\n <JRCWidgetArticleGallery\n files={files}\n maxWidth={800}\n gap={widget.content.gap ?? '10'}\n column={widget.content.column ?? '3'}\n onClick={() => undefined}\n />\n ) : (\n <FileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <CSSImagePointer>\n <JRCWidgetArticleGallery\n files={files}\n maxWidth={600}\n gap={widget.content.gap ?? '10'}\n column={widget.content.column ?? '3'}\n onClick={(idFile) => open(idFile)}\n />\n </CSSImagePointer>\n );\n }}\n </FileViewer>\n )}\n {inplace && mode === 'edit' ? (\n <WidgetUploader\n initialFiles={files}\n initialClick={isActive}\n accept={'image/png, image/jpeg, image/jpg'}\n multiple={true}\n onUploadSuccess={(files) => {\n if (Array.isArray(files)) {\n dispatch(updateWidgetContent<WidgetArticleGalleryContent>(uniqid, { files }));\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Gallery_Empty_Label'}\n description={'WIDGET_Article_Gallery_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n </WidgetUploader>\n ) : (\n <></>\n )}\n </>\n ) : (\n <></>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport {\n WidgetArticleImageContent,\n WidgetArticleImageType,\n WidgetDisplayMode,\n formatImgUrl,\n jFileLittle,\n} from 'jamespot-user-api';\nimport { useIntl } from 'react-intl';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport { WidgetUploader } from '../components/WidgetUploader';\n\nconst WidgetImage = commonComponentsRegistry.getLazyComponent('WidgetImage');\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\n\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst CSSImageWrapperHover = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(0, 0, 0, 0.4);\n pointer-events: none;\n display: flex;\n justify-content: center;\n align-items: center;\n opacity: 0;\n color: ${(props) => props.theme.color.white};\n &:hover {\n opacity: 1;\n }\n`;\n\nconst CSSImagePointer = styled.button`\n cursor: pointer;\n`;\n\nconst mockFileLittle: jFileLittle = {\n id: 0,\n type: '',\n title: '',\n uri: '',\n mimetype: 'application/octet-stream',\n mainType: '',\n dateCreation: '',\n dateModified: '',\n _url: '',\n size: 10,\n};\n\nexport const strToTimestamp = (str: string): undefined | number => {\n if (str) {\n const timestamp = Date.parse(str);\n if (!isNaN(timestamp)) {\n return new Date(timestamp).getTime() / 1000;\n }\n }\n return;\n};\n\nexport const JRCWidgetArticleImageWrapper = ({\n widget,\n width,\n inplace,\n mode,\n}: {\n widget: WidgetArticleImageType;\n inplace?: boolean;\n mode?: WidgetDisplayMode;\n width?: number;\n}) => {\n const { uniqid } = widget;\n const { file, useFilter } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const [uri, setUri] = useState<string | undefined>(undefined);\n const intl = useIntl();\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, empty: !file }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [file]);\n\n useEffect(() => {\n if (file) {\n setUri(\n formatImgUrl({\n timestamp: file.dateModified ? strToTimestamp(file.dateModified) : Date.now(),\n from: 'imagecache',\n size: 'fitx1200',\n uri: file.uri,\n }),\n );\n }\n }, [file]);\n\n return (\n <>\n {mode !== 'edit' && (\n <FileViewer\n files={[\n {\n ...mockFileLittle,\n ...file,\n path: uri,\n mimetype: 'image/png',\n },\n ]}\n openWithOptions={[]}>\n {(open) => {\n return (\n <CSSImagePointer onClick={() => open(file?.id ?? 0)}>\n <WidgetImage maxWidth={width ?? 600} uri={uri} useFilter={useFilter ?? false} />\n </CSSImagePointer>\n );\n }}\n </FileViewer>\n )}\n\n {mode === 'edit' && (\n <>\n {uri !== undefined && (\n <WidgetImage maxWidth={width ?? 600} uri={uri} useFilter={useFilter ?? false} />\n )}\n {inplace && (\n <WidgetUploader\n initialFiles={[]}\n initialClick={isActive}\n accept={'image/png, image/jpeg, image/jpg'}\n multiple={false}\n onUploadSuccess={(files) => {\n if (Array.isArray(files) && files[0] !== undefined) {\n dispatch(\n updateWidgetContent<WidgetArticleImageContent>(uniqid, { file: files[0] }),\n );\n }\n }}\n onUploadStart={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n }}\n onUploadEnd={() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: false }));\n }}>\n {file !== undefined ? (\n <CSSImageWrapperHover>\n {intl.formatMessage({ id: 'ARTICLE_Widget_Image_Change' })}\n </CSSImageWrapperHover>\n ) : (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Image_Empty_Label'}\n description={'WIDGET_Article_Image_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={() => undefined}\n />\n )}\n </WidgetUploader>\n )}\n </>\n )}\n </>\n );\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { WidgetArticleSliderType, WidgetDisplayMode, formatImgUrl, jFileLittle } from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst FileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\nconst JRCWidgetEmptyInplace = commonComponentsRegistry.getLazyComponent('WidgetEmptyInplace');\nconst JRCWidgetSlider = commonComponentsRegistry.getLazyComponent('WidgetSlider');\n\nconst Wrapper = styled.div<{ maxWidth: number }>`\n flex: 1;\n display: flex;\n flex-direction: row;\n min-height: 60px;\n align-items: center;\n width: ${(props) => props.maxWidth}px;\n`;\n\nconst mockFileLittle: jFileLittle = {\n id: 0,\n type: '',\n title: '',\n uri: '',\n mimetype: 'application/octet-stream',\n mainType: '',\n dateCreation: '',\n dateModified: '',\n _url: '',\n size: 10,\n};\n\nexport const strToTimestamp = (str: string): undefined | number => {\n if (str) {\n const timestamp = Date.parse(str);\n if (!isNaN(timestamp)) {\n return new Date(timestamp).getTime() / 1000;\n }\n }\n return;\n};\n\nexport const JRCWidgetArticleSliderWrapper = ({\n widget,\n mode,\n width,\n}: {\n widget: WidgetArticleSliderType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n width?: number;\n}) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const maxWidth = width ?? 600;\n const [dynamicWidth, setDynamicWidth] = useState<number | undefined>(undefined);\n const ref = useRef<HTMLDivElement>(null);\n const fileViewerFiles = useMemo(\n () =>\n widget.content.slides\n ? [\n ...widget.content.slides.map((slide, index) => {\n return {\n ...mockFileLittle,\n id: slide.file ? slide.file.id : index,\n mimetype: slide.file ? slide.file.mimetype : mockFileLittle.mimetype,\n path:\n slide.file && slide.file.uri\n ? formatImgUrl({\n size: 'fitx1200',\n uri: slide.file.uri,\n from: 'imagecache',\n timestamp:\n slide.file && slide.file.dateModified\n ? strToTimestamp(slide.file.dateModified)\n : Date.now(),\n })\n : '',\n };\n }),\n ]\n : [],\n [widget.content.slides],\n );\n\n const slides = useMemo(\n () =>\n widget.content.slides !== undefined\n ? [\n ...widget.content.slides.map((slide) => {\n if (slide.file) {\n return {\n ...slide,\n uri: formatImgUrl({\n timestamp: slide.file.dateModified\n ? strToTimestamp(slide.file.dateModified)\n : Date.now(),\n size: `fitx${dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}`,\n from: 'imagecache',\n uri: slide.file.uri,\n }),\n };\n } else {\n return {\n ...slide,\n uri: '',\n };\n }\n }),\n ]\n : [],\n [widget.content.slides, dynamicWidth, maxWidth],\n );\n\n useEffect(() => {\n if (isActive && mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive]);\n\n useEffect(() => {\n const handleResize = () => {\n if (ref.current) {\n setDynamicWidth(ref.current ? ref.current.offsetWidth : maxWidth);\n }\n };\n window.addEventListener('resize', handleResize);\n\n return () => {\n window.removeEventListener('resize', handleResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref]);\n\n useEffect(() => {\n setDynamicWidth(ref.current ? ref.current.offsetWidth : maxWidth);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref]);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !widget.content.slides || widget.content.slides.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [widget.content.slides]);\n\n const isEditable = useMemo(\n () => mode === 'edit' && Array.isArray(widget.content.slides) && widget.content.slides.length === 0,\n [widget.content.slides, mode],\n );\n\n const handleEditor = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: widget.name,\n }),\n );\n }, [dispatch, widget.uniqid, widget.name]);\n\n /** small hack to catch the real width of the div */\n if (dynamicWidth === undefined) {\n return <div ref={ref} style={{ width: '100%' }}></div>;\n }\n\n return (\n <Wrapper maxWidth={dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}>\n <FileViewer files={fileViewerFiles} openWithOptions={[]}>\n {(open) => {\n return (\n <JRCWidgetSlider\n slides={slides}\n maxWidth={dynamicWidth && dynamicWidth < maxWidth ? dynamicWidth : maxWidth}\n useDots={widget.content.useDots ?? true}\n loop={widget.content.loop ?? false}\n startAt={0}\n onClickSlide={(index) => {\n if (mode !== 'edit') {\n if (widget.content.slides) {\n const slide = widget.content.slides[index];\n if (slide && slide.file) {\n open(slide.file.id);\n }\n }\n } else {\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name: widget.name }));\n }\n }}\n />\n );\n }}\n </FileViewer>\n {isEditable ? (\n <JRCWidgetEmptyInplace\n label={'WIDGET_Article_Slider_Empty_Label'}\n description={'WIDGET_Article_Slider_Empty_Description'}\n url={'widget-article-image-placeholder.png'}\n onClick={handleEditor}\n />\n ) : (\n <></>\n )}\n </Wrapper>\n );\n};\n","import { useCallback, useState } from 'react';\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport { marked } from 'marked';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\n\r\nconst InputTextareaRaw = commonComponentsRegistry.getLazyComponent('InputTextareaRaw');\r\nconst Modal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type MarkdownModalProps = {\r\n onInsert: (html: string) => void;\r\n open: boolean;\r\n close: () => void;\r\n};\r\n\r\nexport const MarkdownModal = ({ onInsert, open, close }: MarkdownModalProps) => {\r\n const intl = useIntl();\r\n const [markdown, setMarkdown] = useState('');\r\n\r\n const doClose = useCallback(() => {\r\n setMarkdown('');\r\n close();\r\n }, [close]);\r\n\r\n return (\r\n <Modal\r\n title={intl.formatMessage({ id: 'TINY_MCE_Insert_Markdown' })}\r\n open={open}\r\n closeHandler={doClose}\r\n enableClickAwayCloseModal\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: doClose,\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Insert\" />,\r\n color: 'valid',\r\n disabled: !markdown,\r\n clickHandler: () => {\r\n onInsert(marked.parse(markdown, { async: false }).replace(/<br>/g, '<br><br>'));\r\n doClose();\r\n },\r\n },\r\n ]}>\r\n <InputTextareaRaw value={markdown} onChange={(e) => setMarkdown(e.target.value)} height={'400px'} />\r\n </Modal>\r\n );\r\n};\r\n","import { Model, TinyMCE, Toast, Widget, updateWidgetContent } from 'jamespot-front-business';\nimport jApi, { WidgetArticleTextContent, WidgetArticleTextType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled, { useTheme } from 'styled-components';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { getTinyMCEMentionsQueries } from '../../../utils/tinymce';\nimport { useMarkdownModal } from '../../../hooks/useMarkdownModal';\nimport { MarkdownModal } from '../../tinymce/extension/MarkdownModal';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetArticleText = commonComponentsRegistry.getLazyComponent('WidgetArticleText');\n\nconst CSSTextWrapper = styled.div`\n width: 100%;\n cursor: text;\n\n p {\n word-wrap: break-word;\n }\n\n a {\n word-wrap: break-word;\n }\n`;\n\nexport const JRCWidgetArticleTextWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetArticleTextType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const { uniqid } = widget;\n const theme = useTheme();\n const { text } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n const isBusy = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid)?.busy);\n const token = useAppSelector(Widget.selectors.selectToken);\n const tinyMCECommonOptions = useAppSelector(TinyMCE.selectors.selectTinyMCECommonOptions);\n const models = useAppSelector(Model.selectors.selectAll);\n\n const intl = useIntl();\n\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onError);\n }, [models, onError, theme]);\n\n // small hack to hide and redraw tinymce to avoid initialization issue\n if (isBusy) {\n return <></>;\n }\n return (\n <CSSTextWrapper>\n <WidgetArticleText\n autoFocus={isActive}\n text={text ?? ''}\n token={mode === 'edit' && token !== undefined ? token : ''}\n tinyMCECommonOptions={\n mode === 'edit' && tinyMCECommonOptions\n ? {\n commonOptions: tinyMCECommonOptions,\n mentionsQueries: tinyMentionsQueries,\n }\n : undefined\n }\n mode={mode}\n onChange={(text) => {\n dispatch(updateWidgetContent<WidgetArticleTextContent>(uniqid, { text }));\n }}\n additionalExtensions={[extMarkdown]}\n handlers={{ file: jApi.file }}\n />\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </CSSTextWrapper>\n );\n};\n","import { useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetArticleTitleContent, WidgetArticleTitleType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, updateWidgetContent } from 'jamespot-front-business';\nimport styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetArticleTitle = commonComponentsRegistry.getLazyComponent('WidgetArticleTitle');\n\nconst CSSTextWrapper = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n align-items: center;\n cursor: text;\n`;\n\nconst ToolWrapper = styled.div`\n display: flex;\n flex-direction: row;\n border-radius: 8px;\n overflow: hidden;\n margin: 4px;\n border: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nconst Tool = styled.button<{ isActive: boolean }>`\n display: flex;\n width: 40px;\n height: 40px;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n opacity: ${(props) => (props.isActive ? '1.0' : '.8')};\n background-color: ${(props) => (props.isActive ? props.theme.color.grey1 : props.theme.color.white)};\n &:hover {\n background-color: ${(props) => props.theme.color.grey1};\n }\n`;\n\nexport const JRCWidgetArticleTitleWrapper = ({\n widget,\n inplace,\n mode,\n dataCy,\n}: {\n widget: WidgetArticleTitleType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n dataCy?: string;\n}) => {\n const { uniqid } = widget;\n const { text, color, heading } = widget.content;\n const dispatch = useAppDispatch();\n const isActive = useAppSelector((state) => Widget.selectors.isActive(state, uniqid), shallowEqual);\n\n useEffect(() => {\n dispatch(\n Widget.slice.actions.setWidgetState({\n uniqid,\n empty: !text || text.length === 0,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [text]);\n\n return (\n <CSSTextWrapper>\n <WidgetArticleTitle\n dataCy={dataCy}\n text={text}\n color={color}\n heading={heading}\n autoFocus={isActive}\n inplace={inplace}\n mode={mode}\n onChange={(text) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, { text }));\n }}\n />\n {isActive && mode === 'edit' ? (\n <Toolbar\n heading={heading}\n onClick={(heading) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, { heading }));\n }}\n />\n ) : (\n <></>\n )}\n </CSSTextWrapper>\n );\n};\n\nexport const Toolbar = ({ heading = 'h1', onClick }: { heading?: string; onClick: (size: string) => void }) => {\n const sizes: string[] = ['h1', 'h2', 'h3', 'h4'];\n return (\n <ToolWrapper>\n {sizes.map((sizeValue, index: number) => (\n <Tool key={index} isActive={heading === sizeValue} onClick={() => onClick(sizeValue)}>\n {sizeValue}\n </Tool>\n ))}\n </ToolWrapper>\n );\n};\n","import { Toast } from 'jamespot-front-business';\nimport { useAbortController } from 'jamespot-react-components';\nimport jApi, {\n ImapConnection,\n OfficeProvider,\n OfficeSetConfigurationPayload,\n ValueOf,\n WidgetDisplayMode,\n WidgetEmailsImapType,\n} from 'jamespot-user-api';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\n\nconst ModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst ModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst Button = commonComponentsRegistry.getLazyComponent('Button');\nconst InputText = commonComponentsRegistry.getLazyComponent('InputText');\nconst InputNumber = commonComponentsRegistry.getLazyComponent('InputNumber');\nconst InputSelectExtended = commonComponentsRegistry.getLazyComponent('InputSelectExtended');\nconst InputPassword = commonComponentsRegistry.getLazyComponent('InputPassword');\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const UIForm = styled.div<{ isLocked: boolean }>`\n display: flex;\n flex-direction: column;\n opacity: ${(props) => (props.isLocked ? '.4' : '1.0')};\n`;\n\nexport const UIWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const UIProviderError = styled.div`\n background-color: ${(props) => props.theme.color.orange};\n color: ${(props) => props.theme.color.white};\n padding: ${(props) => props.theme.space.sm}px;\n border-radius: ${(props) => props.theme.space.sm}px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const UISection = styled.div`\n margin-bottom: ${(props) => props.theme.space.md}px;\n`;\n\nexport type JRCWidgetEmailsImapProps = {\n widget: WidgetEmailsImapType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const officeConfigurationInitialState = {\n username: '',\n password: '',\n hostname: '',\n imapPort: 993,\n imapConnectionSecurity: ImapConnection.NONE,\n imapMailbox: '',\n cardDavAddressBook: '',\n calDavCalendar: '',\n provider: '',\n};\n\nexport const OfficeConfigurationPrompt = () => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const abortController = useAbortController();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [isPending, setIsPending] = useState<boolean>(false);\n const {\n control,\n reset,\n setValue,\n getValues,\n watch,\n formState: { isValid },\n } = useForm<OfficeSetConfigurationPayload>({\n defaultValues: officeConfigurationInitialState,\n criteriaMode: 'all',\n });\n\n const refresh = () => window.location.reload();\n const [providerList, setProviderList] = useState<OfficeProvider[]>([]);\n const data = watch();\n\n const imapConnectionSecurityOptions = [\n { label: 'NONE', value: ImapConnection.NONE },\n { label: 'SSL', value: ImapConnection.SSL },\n { label: 'STARTTLS', value: ImapConnection.STARTTLS },\n ];\n\n const fetchConfiguration = useCallback(\n (providers: string[]) => {\n jApi.office.getConfiguration().then(({ result }) => {\n reset({\n ...result,\n provider: !providers.includes(result.provider ?? '') ? providers[0] : result.provider,\n });\n });\n },\n [reset],\n );\n\n const handleSubmit = () => {\n if (isPending) return;\n setIsPending(true);\n jApi.office\n .setConfiguration(data)\n .then(() => refresh())\n .catch((err) => dispatch(Toast.actions.error({ label: err.errorMsg })))\n .finally(() => {\n setIsOpen(false);\n setIsPending(false);\n reset();\n });\n };\n\n useEffect(() => {\n if (!isOpen) return;\n setIsPending(true);\n jApi.office\n .getProviders({ signal: abortController.signal })\n .then(({ result }) => {\n if (!abortController.signal.aborted) {\n setProviderList(result);\n fetchConfiguration(result.map((provider) => provider.id));\n }\n })\n .catch((err) => {\n if (!abortController.signal.aborted) {\n dispatch(Toast.actions.error({ label: err.errorMsg }));\n }\n })\n .finally(() => {\n setIsPending(false);\n });\n }, [isOpen, abortController.signal, dispatch, fetchConfiguration]);\n\n useEffect(() => {\n if (providerList.length === 1) {\n setValue('provider', providerList[0].id);\n }\n }, [providerList, setValue]);\n\n const handleClose = () => setIsOpen(false);\n\n const hasProvider = useMemo(() => providerList.length > 1, [providerList]);\n\n return (\n <>\n <UIWrapper>\n <Button\n label={intl.formatMessage({ id: 'Office_Set_Configuration' })}\n onClick={() => setIsOpen(true)}\n />\n </UIWrapper>\n <ModalLayout open={isOpen} radius=\"small\" closeHandler={handleClose}>\n <ModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'Office_Set_Configuration' })}\n onClickIconClose={handleClose}>\n {isPending ? (\n <JRCLoader size=\"s\" />\n ) : (\n <>\n {providerList.length === 0 && (\n <UIProviderError>{intl.formatMessage({ id: 'Office_No_Providers' })}</UIProviderError>\n )}\n <UIForm isLocked={providerList.length === 0}>\n {hasProvider && (\n <>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_Provider\" />\n </Typography>\n <SelectProvider\n label=\"OfficeHook_Conf_Select_Provider\"\n initialValue={{\n label: providerList[0].label,\n value: providerList[0].id,\n }}\n options={providerList.map((el) => {\n return { label: el.label, value: el.id };\n })}\n handleChange={(value) => {\n if (getValues('provider') !== value) {\n reset();\n }\n setValue('provider', value);\n }}\n />\n </UISection>\n </>\n )}\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Settings\" />\n </Typography>\n <InputText\n control={control}\n name={'hostname'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Hostname' })}\n rules={{ required: true }}\n />\n <InputText\n control={control}\n name={'username'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_Username' })}\n rules={{ required: true }}\n />\n <InputPassword\n control={control}\n name={'password'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_Password' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_IMap_Mailbox\" />\n </Typography>\n <InputNumber\n control={control}\n name={'imapPort'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Port' })}\n rules={{ required: true }}\n />\n <SelectProvider\n label=\"OfficeHook_Conf_Select_Connection_Security\"\n initialValue={imapConnectionSecurityOptions[0]}\n options={imapConnectionSecurityOptions}\n handleChange={(value) =>\n setValue('imapConnectionSecurity', value as ValueOf<typeof ImapConnection>)\n }\n />\n <InputText\n control={control}\n name={'imapMailbox'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_IMap_Mailbox' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_CalDav_Calendar\" />\n </Typography>\n <InputText\n control={control}\n name={'calDavCalendar'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_CalDav_Calendar' })}\n rules={{ required: true }}\n />\n </UISection>\n <UISection>\n <Typography size={'l'}>\n <FormattedMessage id=\"OfficeHook_Conf_CardDav_Address_Book\" />\n </Typography>\n <InputText\n control={control}\n name={'cardDavAddressBook'}\n width={'400'}\n placeholder={intl.formatMessage({ id: 'OfficeHook_Conf_CardDav_Address_Book' })}\n rules={{ required: true }}\n />\n </UISection>\n </UIForm>\n <Button\n label={intl.formatMessage({ id: 'OfficeHook_Conf_Prompt_Submit' })}\n loader={isPending}\n disabled={isPending || providerList.length === 0 || !isValid}\n onClick={handleSubmit}\n />\n </>\n )}\n </ModalContent>\n </ModalLayout>\n </>\n );\n};\n\nconst SelectProvider = ({\n label,\n initialValue,\n options,\n handleChange,\n}: {\n label: string;\n initialValue: { label: string; value: string };\n options: { label: string; value: string }[];\n handleChange: (value: string) => void;\n}) => {\n const { control, watch } = useForm<{ provider: { label: string; value: string } }>({\n defaultValues: {\n provider: initialValue,\n },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n if (!data.provider || !data.provider.value) return;\n handleChange(data.provider.value);\n });\n return () => subscription.unsubscribe();\n }, [watch, handleChange]);\n\n return (\n <InputSelectExtended\n label={label}\n name=\"provider\"\n options={options ?? []}\n getValue={(o) => o.value}\n getLabel=\"label\"\n getSearch=\"label\"\n control={control}\n rules={{ required: true }}\n />\n );\n};\n","import { ReactNode } from 'react';\nimport styled from 'styled-components';\n\nexport const UIFlex = styled.div`\n flex-direction: column;\n display: flex;\n flex: 1;\n`;\n\nexport const UIScrollWrapper = styled.div`\n position: relative;\n display: flex;\n flex: 1;\n`;\n\nexport const UIScroll = styled.div`\n overflow: auto;\n position: absolute;\n inset: 0;\n`;\n\n// TODO: BETTER NAMING ?\nexport const WidgetScroll = ({\n header,\n scrollable,\n footer,\n}: {\n header?: () => ReactNode;\n scrollable?: () => ReactNode;\n footer?: () => ReactNode;\n}) => {\n return (\n <UIFlex>\n {header && header()}\n <UIScrollWrapper>\n <UIScroll>{scrollable && scrollable()}</UIScroll>\n </UIScrollWrapper>\n {footer && footer()}\n </UIFlex>\n );\n};\n","import { ReactNode, useMemo } from 'react';\nimport { Widget } from 'jamespot-front-business';\n\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled from 'styled-components';\n\nexport const UIWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nexport const WidgetStylePadding = ({ uniqid, children }: { uniqid: string; children: ReactNode }) => {\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n padding: styles && styles['padding'] ? `${styles['padding']}px` : '0px',\n };\n }, [styles]);\n\n return <UIWrapper style={{ padding: initialValues.padding }}>{children}</UIWrapper>;\n};\n","import { Widget } from 'jamespot-front-business';\n\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled from 'styled-components';\n\nexport const CSSWidgetTitle = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n padding-right: 0px;\n`;\n\nexport const UITitle = styled.div<{ fontSize: string; fontWeight: string; textAlign: string; color: string }>`\n text-align: ${(props) => props.textAlign};\n font-size: ${(props) => props.fontSize}px;\n font-weight: ${(props) => props.fontWeight};\n color: ${(props) => props.color};\n`;\n\nexport const WidgetIntranetTitle = ({\n uniqid,\n textAlign = 'left',\n fontSize = '16',\n fontWeight = 'medium',\n color,\n}: {\n uniqid: string;\n textAlign: string;\n fontSize: string;\n fontWeight: string;\n color: string;\n}) => {\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n return (\n <>\n {widgetWrapper && typeof widgetWrapper.title === 'string' && widgetWrapper.title.length !== 0 && (\n <CSSWidgetTitle>\n <UITitle textAlign={textAlign} fontSize={fontSize} fontWeight={fontWeight} color={color}>\n {widgetWrapper.title}\n </UITitle>\n </CSSWidgetTitle>\n )}\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { ReactNode, useMemo } from 'react';\nimport { shallowEqual } from 'react-redux';\n\nimport styled, { useTheme } from 'styled-components';\nimport { useAppSelector } from '../../../../redux/store';\nimport { WidgetIntranetTitle } from './WidgetIntranetTitle';\n\nexport const UIHeaderWrapper = styled.div<{ backroundColor: string }>`\n background-color: ${(props) => props.backroundColor};\n`;\n\nexport const UIHeader = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n`;\n\nexport const UICount = styled.div`\n padding: ${(props) => props.theme.space.sm}px ${(props) => props.theme.space.md}px;\n color: ${(props) => props.theme.color.grey4};\n`;\n\nexport const UIHeaderFlex = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n gap: ${(props) => props.theme.space.xs}px;\n align-items: center;\n`;\n\nexport const WidgetHeader = ({\n uniqid,\n dropdown,\n subHeader,\n}: {\n uniqid: string;\n dropdown?: () => ReactNode;\n subHeader?: (color: string) => ReactNode;\n}) => {\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const styleValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor: styles && styles['background-color'] ? String(styles['background-color']) : 'transparent',\n fontSize: styles && styles['font-size'] ? String(styles['font-size']) : '16',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n return (\n <UIHeaderWrapper backroundColor={styleValues.backgroundColor}>\n <UIHeader>\n <UIHeaderFlex>\n <WidgetIntranetTitle\n uniqid={uniqid}\n fontWeight={styleValues.fontWeight}\n fontSize={styleValues.fontSize}\n textAlign={styleValues.textAlign}\n color={styleValues.color}\n />\n {subHeader && subHeader(styleValues.color)}\n </UIHeaderFlex>\n {dropdown && dropdown()}\n </UIHeader>\n </UIHeaderWrapper>\n );\n};\n","import jApi from 'jamespot-user-api';\n\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\n\nimport { useDispatch } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const WidgetCalendarCalDavHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n />\n );\n};\n","import { Toast, Widget } from 'jamespot-front-business';\nimport { Utils } from 'jamespot-react-components';\nimport jApi, {\n DavCalendarEvent,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_3,\n WidgetCalendarCalDavType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { WidgetCalendarCalDavHeader } from './WidgetCalendarCalDav/WidgetCalendarCalDavHeader';\n\nconst WidgetCalendarCalDav = commonComponentsRegistry.getLazyComponent('WidgetCalendarCalDav');\n\nexport type JRCWidgetCalendarCalDavWrapperProps = {\n widget: WidgetCalendarCalDavType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => ReactNode | undefined;\n};\n\nconst REFRESH_INTERVAL = 60 * 1000;\n\nexport const JRCWidgetCalendarCalDavWrapper = ({\n widget,\n mode,\n levelFallback,\n}: JRCWidgetCalendarCalDavWrapperProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n\n const [url, setUrl] = useState<string | undefined>(undefined);\n const [list, setList] = useState<DavCalendarEvent[]>([]);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.dav_calendar_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const fetchData = useCallback(() => {\n const now = new Date();\n const nextMonth = Utils.date.addMonth(new Date(now));\n\n jApi.office\n .davCalendarGetEvents({\n limit: 10,\n dateStart: Utils.date.formatDateTime(now),\n dateEnd: Utils.date.formatDateTime(nextMonth),\n })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level !== WIDGET_LEVEL_3) return;\n const interval = setInterval(fetchData, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, level]);\n\n useEffect(() => {\n handleLoading(true);\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout);\n }, [handleLogout, handleLoading, handleLogin]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n fetchData();\n }, [isConfigurationValid, fetchProviderUrls, handleLoading, fetchData, level]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetCalendarCalDavHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid && <WidgetCalendarCalDav calendarListEvent={list} />}\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import { Toast, Widget } from 'jamespot-front-business';\nimport jamespot from 'jamespot-user-api';\nimport { useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCModalLayout = commonComponentsRegistry.getLazyComponent('ModalLayout');\nconst JRCModalContent = commonComponentsRegistry.getLazyComponent('ModalContent');\nconst JRCIconButton = commonComponentsRegistry.getLazyComponent('IconButton');\n\nexport const Button = styled.button`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const Footer = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row-reverse;\n`;\n\nexport const WidgetRemove = ({ id, type, uniqid }: { id: number; type: string; uniqid: string }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const [isOpen, setIsOpen] = useState<boolean>(false);\n\n const handleRemove = () => {\n jamespot.widget\n .removeWidget({ id, type, uniqid })\n .then(() => {\n dispatch(Widget.slice.actions.flushWidget({ uniqid }));\n })\n .catch(() => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })));\n };\n\n return (\n <>\n <JRCIconButton iconSize={14} onClick={() => setIsOpen(true)} icon=\"icon-trash\" />\n {isOpen && (\n <JRCModalLayout enableClickAwayCloseModal={true} open={isOpen} closeHandler={() => setIsOpen(false)}>\n <JRCModalContent\n overflow={'scroll'}\n title={intl.formatMessage({ id: 'WIDGET_Remove_Widget' })}\n onClickIconClose={() => setIsOpen(false)}>\n {intl.formatMessage({ id: 'WIDGET_Delete_Widget_Confirmation' })}\n </JRCModalContent>\n <Footer>\n <JRCButton label={intl.formatMessage({ id: 'GLOBAL_Confirm' })} onClick={handleRemove} />\n </Footer>\n </JRCModalLayout>\n )}\n </>\n );\n};\n","import { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { WidgetsName, ensureWidgetObjectHasMinimumProperties, Rights, WidgetDisplayMode } from 'jamespot-user-api';\n\nimport { shallowEqual } from 'react-redux';\n\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { WidgetRemove } from './WidgetRemove';\nimport { useAppDispatch, useAppSelector } from '../../../../redux/store';\n\nexport const Footer = styled.div`\n display: flex;\n flex: 1;\n flex-direction: row;\n border-top: 1px solid ${(props) => props.theme.color.grey1};\n`;\n\nexport const Button = styled.button`\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n background-color: ${(props) => props.theme.color.white};\n &:hover {\n background-color: ${(props) => props.theme.color.grey0};\n }\n`;\n\nexport const WidgetFooterView = ({\n name,\n uniqid,\n mode,\n collaborationRights,\n handleOpenEditor,\n}: {\n name: WidgetsName;\n uniqid: string;\n mode?: WidgetDisplayMode;\n collaborationRights?: Pick<Rights, 'update'>;\n handleOpenEditor?: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const widgetObject = useAppSelector((state) => Widget.selectors.selectWidgetObject(state, uniqid), shallowEqual);\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const canUpdate = useMemo(\n () =>\n (widgetObject && widgetObjectRights && widgetObjectRights.update) ||\n (collaborationRights && collaborationRights.update),\n [widgetObject, widgetObjectRights, collaborationRights],\n );\n\n const canDelete = useMemo(\n () => widgetObject && widgetObjectRights && widgetObjectRights.delete,\n [widgetObject, widgetObjectRights],\n );\n\n const handleOnClick = useCallback(() => {\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n mode,\n }),\n );\n }, [uniqid, dispatch, name, mode]);\n\n return canUpdate && ensureWidgetObjectHasMinimumProperties(widgetObject) ? (\n <Footer>\n <Button onClick={handleOpenEditor ?? handleOnClick}>\n {intl.formatMessage({ id: 'WIDGET_Set_Widget' })}\n </Button>\n {canDelete && <WidgetRemove id={widgetObject.id} type={widgetObject.type} uniqid={uniqid} />}\n </Footer>\n ) : (\n <></>\n );\n};\n","import { useEffect, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCInputText = commonComponentsRegistry.getLazyComponent('InputText');\n\nexport const CSSWrapper = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n display: flex;\n flex-direction: row;\n fieldset {\n margin: 0.2rem !important;\n }\n`;\n\nexport const WidgetInlineInputText = ({\n placeholder,\n handleClick,\n}: {\n placeholder: string;\n handleClick: (label: string) => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const [label, setLabel] = useState<string>('');\n\n const { control, watch, reset } = useForm({\n defaultValues: { label },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n setLabel(data.label ?? '');\n });\n return () => subscription.unsubscribe();\n }, [watch, dispatch]);\n\n return (\n <CSSWrapper>\n <JRCInputText name={'label'} control={control} placeholder={placeholder} width=\"100%\" />\n <JRCButton\n label={intl.formatMessage({ id: 'GLOBAL_Confirm' })}\n disabled={!label.length}\n onClick={() => {\n handleClick(label);\n setLabel('');\n reset();\n }}\n />\n </CSSWrapper>\n );\n};\n","import styled from 'styled-components';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\n\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const Wrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n background-color: rgba(255, 255, 255, 0.4);\n`;\n\nexport const WidgetIsPending = () => {\n return (\n <Wrapper>\n <JRCLoader size={'m'} />\n </Wrapper>\n );\n};\n","import { Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport { JRCWidgetCheckListEntries, Utils } from 'jamespot-react-components';\nimport jApi, {\n CombinedWidgetContent,\n ensureWidgetCheckListType,\n jFileLittle,\n WidgetCheckListContent,\n WidgetCheckListType,\n WidgetDisplayMode,\n WidgetsName,\n} from 'jamespot-user-api';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetInlineInputText } from './components/WidgetInlineInputText';\nimport { WidgetIsPending } from './components/WidgetIsPending';\n\nconst WidgetCheckList = commonComponentsRegistry.getLazyComponent('WidgetCheckList');\nconst WidgetCheckListEditor = commonComponentsRegistry.getLazyComponent('WidgetCheckListEditor');\nconst JRCFileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\nexport const CSSRowLinkWrapper = styled.div<{ border?: boolean }>`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n border: ${(props) => (props.border ? `1px solid ${props.theme.color.grey2}` : 'none')};\n min-height: 24px;\n border-radius: 4px;\n padding: 4px 8px;\n`;\n\nconst CommentContainer = styled.div`\n width: 100%;\n display: flex;\n gap: 14px;\n padding: 16px;\n`;\n\nexport const CSSWidgetCheckListWrapper = styled.div`\n position: relative;\n`;\n\ntype JRCWidgetCheckListWrapperProps = {\n widget: WidgetCheckListType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n onWidgetUpdate?: () => void;\n};\n\nexport const JRCWidgetCheckListWrapper = ({\n widget,\n inplace,\n mode,\n onWidgetUpdate,\n}: JRCWidgetCheckListWrapperProps) => {\n const intl = useIntl();\n const { uniqid, content: widgetContent } = widget;\n const dispatch = useAppDispatch();\n const [token, setToken] = useState<string>();\n const [tokenLoading, setTokenLoading] = useState(false);\n\n const [entries, setEntries] = useState<JRCWidgetCheckListEntries | undefined>();\n const [isPending, setIsPending] = useState(false);\n\n const tokenFromStore = useAppSelector(Widget.selectors.selectToken, shallowEqual);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, widget.uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const allRt = useAppSelector(\n (state) => Widget.selectors.selectAllWidgetRTObject(state, widget.uniqid),\n shallowEqual,\n );\n\n const canEditCollaboration = useMemo(() => {\n return widgetObjectRights && widgetObjectRights.update;\n }, [widgetObjectRights]);\n\n const canAdministrate = useMemo(() => {\n return widgetObjectRights && widgetObjectRights.administrate;\n }, [widgetObjectRights]);\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const fetchToken = useCallback(() => {\n if (!token && !tokenLoading) {\n setTokenLoading(true);\n jApi.network\n .token()\n .then((res) => {\n setToken(res.result);\n setTokenLoading(false);\n\n // set comment token to our widget slice to be able to upload image inside our widgets\n dispatch(Widget.slice.actions.setToken({ token: res.result }));\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n }\n }, [onError, token, tokenLoading, dispatch]);\n\n if (!tokenFromStore) {\n fetchToken();\n } else if (!token) {\n setToken(tokenFromStore);\n }\n\n const onChange = useCallback(\n (uniqid: string, content: WidgetCheckListContent) => {\n dispatch(updateWidgetContent(uniqid, content));\n },\n [dispatch],\n );\n\n const onChangeWrapper = (content: { uniqid: string; title?: string }) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n };\n\n const handleCheckItem = (id: string, index: number) => {\n if (!uri) return;\n if (isPending) return;\n setIsPending(true);\n jApi.widget\n .checkListRespond({\n uri,\n uniqid: id,\n index: index,\n })\n .then(() => {\n if (onWidgetUpdate) onWidgetUpdate();\n })\n .catch((err) => {\n onError(err.message);\n setIsPending(false);\n });\n };\n\n const handleReloadWidget = useCallback(() => {\n if (!uri) return;\n setIsPending(true);\n jApi.widget\n .getWidget<WidgetCheckListType>({ uri, uniqid })\n .then((response) => {\n if (ensureWidgetCheckListType(response.result)) {\n onChange(uniqid, response.result.content);\n }\n })\n .catch((err) => {\n return !err.aborted && onError;\n })\n .finally(() => setIsPending(false));\n }, [uniqid, onError, uri, onChange]);\n\n const openEditorPanel = (token: string) => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(Widget.slice.actions.setToken({ token }));\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: WidgetsName.CheckList,\n mode,\n }),\n );\n };\n\n useEffect(() => {\n if (!token && mode === 'edit') {\n jApi.network.token().then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n });\n }\n }, [mode, token, dispatch]);\n\n useEffect(() => {\n const finalEntries: JRCWidgetCheckListEntries | undefined = widget.content.arr?.map((item) => ({\n text: item.title ?? '',\n file: item.file ?? undefined,\n checked: item.value ?? false,\n ...(item.links && {\n links: item.links,\n }),\n ...(item.user && { user: item.user ?? undefined }),\n ...(item.id && { id: item.id, mimetype: 'image/png' }),\n }));\n\n setEntries(finalEntries);\n }, [widget.content.arr, widgetContent]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt) return;\n if (!uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === widget.uniqid) {\n if (lastRt.fn === 'check-list-response' || lastRt.fn === 'widget-update') {\n handleReloadWidget();\n }\n }\n }, [allRt, widget.uniqid, uri, onError, dispatch, handleReloadWidget]);\n\n const handleCollabAddEntry = (label: string) => {\n if (!widget.content.arr || !uri) return;\n\n const contentToUpdate = {\n ...widget.content,\n arr: [...widget.content.arr, { title: label, value: false }],\n };\n\n jApi.widget\n .updateWidget<CombinedWidgetContent>({\n uri,\n uniqid: widget.uniqid,\n content: contentToUpdate as CombinedWidgetContent,\n v2: true,\n })\n .then(() => onChange(widget.uniqid, contentToUpdate))\n .catch((err) => onError(err.errorMsg));\n };\n\n const files = useMemo(() => {\n if (!Array.isArray(widgetContent.arr)) return [];\n\n const fs: jFileLittle[] = [];\n widgetContent.arr.forEach((el) => {\n if (el.file) {\n fs.push(el.file);\n }\n });\n\n return fs;\n }, [widgetContent]);\n\n if (mode === 'edit') {\n if (inplace) {\n return (\n <CommentContainer>\n <WidgetCheckListEditor\n token={token}\n uniqid={uniqid}\n content={{\n ...widgetContent,\n arr: widgetContent.arr?.map((w) => ({\n ...w,\n title: Utils.html.htmlDecodeSpecialChars(w.title),\n })),\n }}\n inplace={inplace}\n onChangeContent={onChange}\n onChangeWrapper={onChangeWrapper}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetCheckListContent>(widget.uniqid, content))\n }\n />\n </CommentContainer>\n );\n }\n }\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n {entries && (\n <JRCFileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <CSSWidgetCheckListWrapper key={widget.uniqid}>\n <WidgetCheckList\n limit={10}\n initialEntries={entries}\n onFileClick={(entry) => entry.id && open(entry.id)}\n onItemCheckListChange={(index) => handleCheckItem(widget.uniqid, index)}\n />\n {widgetContent.edit && (\n <WidgetInlineInputText\n handleClick={handleCollabAddEntry}\n placeholder={intl.formatMessage({\n id: 'COMMENT_WIDGET_CHECKLIST_Add_New_Task',\n })}\n />\n )}\n {canAdministrate && token && (\n <WidgetFooterView\n uniqid={widget.uniqid}\n name={widget.name}\n collaborationRights={{\n update: !!(widgetContent.edit || canEditCollaboration),\n }}\n mode={mode}\n handleOpenEditor={() => {\n if (!token) {\n setIsPending(true);\n jApi.network\n .token()\n .then((response) => {\n dispatch(\n Widget.slice.actions.setToken({ token: response.result }),\n );\n openEditorPanel(response.result);\n })\n .finally(() => setIsPending(false));\n } else {\n openEditorPanel(token);\n }\n }}\n />\n )}\n {isPending && <WidgetIsPending />}\n </CSSWidgetCheckListWrapper>\n );\n }}\n </JRCFileViewer>\n )}\n </RTProvider>\n );\n};\n","import jApi from 'jamespot-user-api';\n\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\n\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const WidgetContactCardDavHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useDispatch();\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n />\n );\n};\n","import jApi, {\n DavAddressBookContact,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_3,\n WidgetContactCardDavType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { WidgetContactCardDavHeader } from './WidgetContactCardDav/WidgetContactCardDavHeader';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { useAppSelector, useAppDispatch } from '../../../redux/store';\n\nconst WidgetContactCardDav = commonComponentsRegistry.getLazyComponent('WidgetContactCardDav');\n\nexport type JRCWidgetContactCardDavProps = {\n widget: WidgetContactCardDavType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => ReactNode | undefined;\n};\n\nconst REFRESH_INTERVAL = 4000;\n\nexport const JRCWidgetContactCardDavWrapper = ({ widget, mode, levelFallback }: JRCWidgetContactCardDavProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [url, setUrl] = useState<string | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n const [list, setList] = useState<DavAddressBookContact[]>([]);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.dav_address_book_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const fetchData = useCallback(() => {\n jApi.office\n .davAddressBookGetContacts({ limit: 10 })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level !== WIDGET_LEVEL_3) return;\n const interval = setInterval(fetchData, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, level]);\n\n useEffect(() => {\n handleLoading(true);\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout)\n .finally(() => handleLoading(false));\n }, [handleLogin, level, fetchProviderUrls, handleLoading, handleLogout]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n fetchData();\n }, [isConfigurationValid, fetchProviderUrls, handleLoading, fetchData, level]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetContactCardDavHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid && <WidgetContactCardDav contactCardList={list} />}\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import jApi from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\n\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { JRCButtonDropdownOptionProps } from 'jamespot-react-components';\nimport { officeConfigurationInitialState } from '../components/OfficeConfigurationPrompt';\nimport { useAppSelector, useAppDispatch } from '../../../../redux/store';\nimport { commonComponentsRegistry } from '../../../../registry/CommonRegistry';\nimport { WidgetHeader } from '../components/WidgetHeader';\n\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\nexport const UIDropdown = styled.div`\n margin-right: ${(props) => props.theme.space.sm}px;\n button {\n background: ${(props) => props.theme.color.white};\n }\n`;\n\nexport const UICount = styled.div<{ color: string }>`\n font-size: ${(props) => props.theme.size.sm + 4}px;\n color: ${(props) => props.color};\n`;\n\nexport const WidgetEmailsImapHeader = ({\n uniqid,\n isConfigurationValid = false,\n handleLogout,\n}: {\n uniqid: string;\n isConfigurationValid: boolean;\n handleLogout: () => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n\n const count = useAppSelector((state) => Widget.selectors.selectWidgetChipCount(state, uniqid), shallowEqual);\n\n const onLogout = () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading: true }));\n jApi.office.setConfiguration(officeConfigurationInitialState).finally(handleLogout);\n };\n\n const options: JRCButtonDropdownOptionProps[] = [\n { label: intl.formatMessage({ id: 'WIDGET_Prompt_Logout' }), onClick: onLogout },\n ];\n\n return (\n <WidgetHeader\n uniqid={uniqid}\n dropdown={() => {\n return (\n isConfigurationValid && (\n <UIDropdown>\n <Tooltip\n position={'left'}\n description={intl.formatMessage({ id: 'WIDGET_Prompt_Dropdown' })}>\n <ButtonDropdown\n small\n smallOpenDirection=\"left\"\n options={options}\n icon={'icon-cogwheel'}\n label={''}\n color=\"primary\"\n variant=\"outlined\"\n />\n </Tooltip>\n </UIDropdown>\n )\n );\n }}\n subHeader={(color: string) => {\n return (\n isConfigurationValid &&\n count !== 0 && (\n <UICount color={color}>\n ({intl.formatMessage({ id: 'WIDGET_Email_IMAP_Unread_Emails' }, { count })})\n </UICount>\n )\n );\n }}\n />\n );\n};\n","import jApi, {\n ImapInboxMail,\n WIDGET_LEVEL_1,\n WIDGET_LEVEL_2,\n WIDGET_LEVEL_3,\n WidgetDisplayMode,\n WidgetEmailsImapType,\n WidgetWrapperLevel,\n} from 'jamespot-user-api';\nimport { Toast, Widget } from 'jamespot-front-business';\nimport { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetEmailsImapHeader } from './WidgetEmailsImap/WidgetEmailsImapHeader';\nimport { officeConfigurationInitialState, OfficeConfigurationPrompt } from './components/OfficeConfigurationPrompt';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\nimport { useAppSelector, useAppDispatch } from '../../../redux/store';\n\nconst WidgetEmailsImap = commonComponentsRegistry.getLazyComponent('WidgetEmailsImap');\n\nconst REFRESH_INTERVAL = 60 * 1000;\n\nexport type JRCWidgetEmailsImapProps = {\n widget: WidgetEmailsImapType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => ReactNode | undefined;\n};\n\nexport const JRCWidgetEmailsImapWrapper = ({ widget, mode, levelFallback }: JRCWidgetEmailsImapProps) => {\n const { uniqid } = widget;\n const dispatch = useAppDispatch();\n const [isConfigurationValid, setIsConfigurationValid] = useState<boolean | undefined>(undefined);\n const [doInterval, setDoInterval] = useState<boolean>(false);\n const [list, setList] = useState<ImapInboxMail[]>([]);\n const [url, setUrl] = useState<string | undefined>(undefined);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, widget.uniqid), shallowEqual);\n\n const handleLogout = useCallback(\n (err?: any, reload?: boolean) => {\n if (err && err.error === 400) {\n jApi.office.setConfiguration(officeConfigurationInitialState);\n }\n if (reload) {\n window.location.reload();\n return;\n }\n\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n },\n [dispatch, uniqid],\n );\n\n const fetchUnreadEmailsCount = useCallback(() => {\n jApi.office\n .imapInboxGetUnreadEmailsCount()\n .then(({ result }) => {\n dispatch(Widget.slice.actions.setWidgetChipCount({ uniqid, count: result }));\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n })\n .catch(handleLogout);\n }, [dispatch, uniqid, handleLogout]);\n\n const handleLoading = useCallback(\n (loading: boolean) => dispatch(Widget.slice.actions.setWidgetState({ uniqid, loading })),\n [uniqid, dispatch],\n );\n\n const fetchProviderUrls = useCallback(() => {\n jApi.office\n .getProviderBaseUrls()\n .then(({ result }) => {\n setUrl(result.imap_inbox_url);\n })\n .finally(() => handleLoading(false));\n }, [handleLoading]);\n\n const handleLogin = useCallback(\n (isValid: boolean) => {\n setIsConfigurationValid(isValid);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true }));\n },\n [dispatch, uniqid],\n );\n\n const fetchData = useCallback(() => {\n jApi.office\n .imapInboxGetEmails({ limit: 10 })\n .then(({ result }) => {\n setList(result);\n setDoInterval(true);\n })\n .catch(() => {\n dispatch(Toast.actions.error({ label: 'PLUGIN_Manager_Connection_Error' }));\n setIsConfigurationValid(false);\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, initialized: true, loading: false }));\n })\n .finally(() => handleLoading(false));\n }, [handleLoading, dispatch, uniqid]);\n\n useEffect(() => {\n if (!doInterval) return;\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) return;\n const interval = setInterval(() => {\n if (level === WIDGET_LEVEL_2) {\n fetchUnreadEmailsCount();\n }\n if (level === WIDGET_LEVEL_3) {\n fetchUnreadEmailsCount();\n fetchData();\n }\n }, REFRESH_INTERVAL);\n return () => clearInterval(interval);\n }, [isConfigurationValid, fetchData, doInterval, fetchUnreadEmailsCount, level]);\n\n useEffect(() => {\n jApi.office\n .isConfigurationValid()\n .then(({ result }) => handleLogin(result))\n .catch(handleLogout);\n }, [handleLogin, handleLogout]);\n\n useEffect(() => {\n if (!isConfigurationValid) return;\n if (level === WIDGET_LEVEL_1) {\n handleLoading(true);\n fetchProviderUrls();\n return;\n }\n if (level === WIDGET_LEVEL_2) {\n handleLoading(true);\n fetchUnreadEmailsCount();\n fetchProviderUrls();\n return;\n }\n\n handleLoading(true);\n fetchUnreadEmailsCount();\n fetchData();\n }, [isConfigurationValid, level, fetchProviderUrls, fetchData, handleLoading, fetchUnreadEmailsCount, dispatch]);\n\n if (isConfigurationValid && level && level !== WIDGET_LEVEL_3 && levelFallback) {\n return <>{levelFallback(level, url ?? '')}</>;\n }\n\n return (\n <WidgetScroll\n header={() => {\n return (\n <>\n <WidgetEmailsImapHeader\n uniqid={uniqid}\n isConfigurationValid={isConfigurationValid !== undefined && isConfigurationValid === true}\n handleLogout={() => handleLogout(undefined, true)}\n />\n </>\n );\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n {isConfigurationValid === undefined && <></>}\n {isConfigurationValid !== undefined && isConfigurationValid === false && mode === 'view' && (\n <OfficeConfigurationPrompt />\n )}\n {isConfigurationValid && <WidgetEmailsImap emailList={list} />}\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import jamespot, { WidgetLuccaAbsenceUser } from 'jamespot-user-api';\nimport { useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAbortController } from '../../../hooks';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { WidgetHeader } from './components/WidgetHeader';\nimport { WidgetScroll } from './components/WidgetScroll';\nimport { WidgetStylePadding } from './components/WidgetStylePadding';\n\nexport const UIOverlay = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst WidgetLuccaAbsence = commonComponentsRegistry.getLazyComponent('WidgetLuccaAbsence');\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const JRCWidgetLuccaAbsenceWrapper = ({ uniqid }: { uniqid: string }) => {\n const [list, setList] = useState<WidgetLuccaAbsenceUser[]>([]);\n const [error, setError] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n const abortController = useAbortController();\n\n const today = useMemo(() => {\n return (\n new Date().getFullYear() +\n '-' +\n (new Date().getMonth() + 1).toString().padStart(2, '0') +\n '-' +\n new Date().getDate().toString().padStart(2, '0') +\n ' 00:00:00'\n );\n }, []);\n\n useEffect(() => {\n jamespot.lucca\n .getAbsence({ date: today }, { signal: abortController.signal })\n .then(({ result }) => setList(result))\n .catch(() => {\n if (!abortController.signal.aborted) {\n setError(true);\n }\n })\n .finally(() => setIsLoading(false));\n }, [today, abortController.signal]);\n\n if (isLoading) {\n return (\n <UIOverlay>\n <JRCLoader size={'m'} />\n </UIOverlay>\n );\n }\n\n if (error) {\n return (\n <UIOverlay>\n <FormattedMessage id={'WIDGET_Lucca_Absence_Url_Error'} />\n </UIOverlay>\n );\n }\n\n return (\n <WidgetScroll\n header={() => {\n return <WidgetHeader uniqid={uniqid} />;\n }}\n scrollable={() => {\n return (\n <WidgetStylePadding uniqid={uniqid}>\n <WidgetLuccaAbsence list={list} />\n </WidgetStylePadding>\n );\n }}\n />\n );\n};\n","import { useCallback, useMemo } from 'react';\n\nimport jamespot, { WidgetDisplayMode, WidgetPresenceContent } from 'jamespot-user-api';\n\nimport { shallowEqual } from 'react-redux';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nexport const CSSPaddingMd = styled.div`\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const CSSHref = styled.a`\n cursor: pointer;\n color: ${(props) => props.theme.color.secondary};\n`;\n\nexport const CSSHorizontalAlign = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nimport { Toast, Widget } from 'jamespot-front-business';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nexport const WidgetPresenceWrapperClosing = ({\n mode,\n uniqid,\n content,\n}: {\n mode?: WidgetDisplayMode;\n uniqid: string;\n content: WidgetPresenceContent;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const canUpdate = useMemo<boolean>(() => !!(widgetObjectRights && widgetObjectRights.update), [widgetObjectRights]);\n\n const handleClosing = useCallback(() => {\n if (mode === 'edit' || !canUpdate || !uri) {\n return;\n }\n\n const contentToUpdate = { ...content, isClosed: true };\n\n jamespot.widget\n .updateWidget({\n uri,\n uniqid,\n content: contentToUpdate,\n v2: true,\n })\n .then(() => dispatch(Widget.slice.actions.updateWidget({ uniqid, content: contentToUpdate })))\n .catch(() => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })));\n }, [mode, uniqid, canUpdate, uri, content, dispatch]);\n\n return (\n <>\n {canUpdate && !content.isClosed && (\n <CSSPaddingMd>\n <CSSHorizontalAlign>\n <CSSHref onClick={handleClosing}>\n {intl.formatMessage({ id: 'WIDGET_Presence_Closing' })}\n </CSSHref>\n </CSSHorizontalAlign>\n </CSSPaddingMd>\n )}\n </>\n );\n};\n","import jApi, {\n WidgetDisplayMode,\n WidgetPresenceResponse,\n WidgetPresenceResponseUserList,\n WidgetPresenceType,\n} from 'jamespot-user-api';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { Toast, updateWidgetContent, Widget } from 'jamespot-front-business';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetPresenceWrapperClosing } from './JRCWidgetPresenceWrapperClosing';\nimport { WidgetIsPending } from './components/WidgetIsPending';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCWidgetPresence = commonComponentsRegistry.getLazyComponent('WidgetPresence');\nconst ModalUserList = commonComponentsRegistry.getLazyComponent('ModalUserList');\n\nexport const CSSWidgetPresenceWrapper = styled.div`\n display: flex;\n flex: 1;\n position: relative;\n flex-direction: column;\n`;\n\nexport const CSSWidgetPresenceState = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(255, 255, 255, 0.7);\n display: flex;\n flex: 1;\n justify-content: center;\n align-items: center;\n`;\n\nexport const CSSWidgetPresenceIsClosed = styled.div`\n flex: 1;\n display: flex;\n padding: ${(props) => props.theme.space.md}px;\n border: 1px dashed ${(props) => props.theme.color.orange};\n justify-content: center;\n align-items: center;\n border-radius: ${(props) => props.theme.space.sm}px;\n margin: ${(props) => props.theme.space.sm}px;\n`;\n\nexport const JRCWidgetPresenceWrapper = ({\n widget,\n mode,\n}: {\n widget: WidgetPresenceType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const { limit, limitValue, closing, isClosed } = widget.content;\n const { uniqid } = widget;\n const [response, setResponse] = useState<WidgetPresenceResponse>({\n userValue: -1,\n userAvailableList: [],\n userUnavailableList: [],\n userAvailableTotal: 0,\n userUnavailableTotal: 0,\n });\n const [isPendingResponse, setIsPendingResponse] = useState<boolean>(false);\n const [abortController] = useState<AbortController>(new AbortController());\n const [openUsersModal, setOpenUsersModal] = useState(false);\n const [usersListIndex, setUsersListIndex] = useState<number>();\n const [usersList, setUsersList] = useState<WidgetPresenceResponseUserList>();\n const ref = useRef<AbortController>(abortController);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const allRt = useAppSelector((state) => Widget.selectors.selectAllWidgetRTObject(state, uniqid), shallowEqual);\n\n const handleClickAvailable = () => (response.userValue === 1 ? handleCancelRespond() : handleRespond(1));\n const handleClickUnavailable = () => (response.userValue === 0 ? handleCancelRespond() : handleRespond(0));\n\n const handleError = useCallback(\n () => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })),\n [dispatch],\n );\n\n const canRespond = useMemo<boolean>(\n () => !(limit && limitValue && response.userAvailableTotal >= limitValue),\n [limit, limitValue, response.userAvailableTotal],\n );\n\n const lockedRespondHandler = useMemo(() => {\n return (closing && isClosed) || mode === 'edit';\n }, [closing, isClosed, mode]);\n\n const handleCancelRespond = useCallback(() => {\n if (!uri || lockedRespondHandler) return;\n if (!canRespond) {\n dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Limit_Response_Error' }));\n return;\n }\n\n setIsPendingResponse(true);\n jApi.widget\n .presenceCancel({ uri, uniqid })\n .catch(handleError)\n .finally(() => setIsPendingResponse(false));\n }, [dispatch, uniqid, handleError, uri, canRespond, lockedRespondHandler]);\n\n const handleRespond = useCallback(\n (value: 1 | 0) => {\n if (!uri || lockedRespondHandler) return;\n\n setIsPendingResponse(true);\n jApi.widget\n .presenceRespond(\n {\n uri,\n uniqid,\n value,\n },\n ref.current.signal,\n )\n .catch(handleError)\n .finally(() => setIsPendingResponse(false));\n },\n [uri, uniqid, handleError, lockedRespondHandler],\n );\n\n const handleResponse = useCallback(() => {\n if (mode === 'edit' || !uri) return;\n setIsPendingResponse(true);\n jApi.widget\n .presenceGetResponse({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n setResponse(response.result);\n })\n .catch((err) => !err.aborted && handleError())\n .finally(() => setIsPendingResponse(false));\n }, [uri, handleError, uniqid, mode]);\n\n const handleLoadUsersList = (index: number, page?: number) => {\n if (!uri) return;\n jApi.widget\n .presenceGetResponseUserList({ uri, uniqid, index, page, limit: 8 }, ref.current.signal)\n .then((response) => {\n setUsersList({\n ...response.result,\n data: [...response.result.data],\n cnt: response.result.cnt,\n });\n })\n .catch((err) => {\n return !err.aborted && handleError;\n });\n };\n\n const handleReloadWidget = useCallback(() => {\n if (!uri) return;\n setIsPendingResponse(true);\n jApi.widget\n .getWidget<WidgetPresenceType>({ uri, uniqid })\n .then((response) => {\n dispatch(updateWidgetContent(uniqid, response.result));\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPendingResponse(false));\n }, [dispatch, handleError, uri, uniqid]);\n\n useEffect(() => {\n const elm = ref.current;\n return () => {\n elm.abort();\n };\n }, []);\n\n useEffect(() => {\n handleResponse();\n }, [handleResponse]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt || !uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === uniqid) {\n if (lastRt.fn === 'widget-presence-response') {\n handleResponse();\n }\n if (lastRt.fn === 'widget-update') {\n handleReloadWidget();\n }\n }\n }, [allRt, handleResponse, uniqid, uri, handleReloadWidget]);\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n <CSSWidgetPresenceWrapper>\n <JRCWidgetPresence\n limit={limit}\n limitValue={limitValue}\n userAvailableList={response.userAvailableList}\n userUnavailableList={response.userUnavailableList}\n userValue={response.userValue}\n userAvailableTotal={response?.userAvailableTotal}\n userUnavailableTotal={response?.userUnavailableTotal}\n isClosed={closing && isClosed}\n handleClickAvailable={handleClickAvailable}\n handleClickUnavailable={handleClickUnavailable}\n handleOpenUsersModal={(index) => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n setUsersListIndex(index);\n handleLoadUsersList(index);\n setOpenUsersModal(true);\n }}\n />\n {closing && isClosed && (\n <CSSWidgetPresenceIsClosed>\n {intl.formatMessage({ id: 'WIDGET_Presence_Is_Closed' })}\n </CSSWidgetPresenceIsClosed>\n )}\n {closing && !isClosed && (\n <WidgetPresenceWrapperClosing mode={mode} uniqid={widget.uniqid} content={widget.content} />\n )}\n {mode === 'view' && <WidgetFooterView uniqid={widget.uniqid} name={widget.name} mode={mode} />}\n {isPendingResponse && <WidgetIsPending />}\n <ModalUserList\n open={openUsersModal}\n usersList={usersList}\n title={\n usersListIndex === 1\n ? intl.formatMessage({ id: 'WIDGET_Presence_On' })\n : intl.formatMessage({ id: 'WIDGET_Presence_Off' })\n }\n setOpen={setOpenUsersModal}\n onClose={() => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n }}\n handleLoadUsersList={(page) => {\n handleLoadUsersList(usersListIndex ?? 0, page);\n }}\n />\n </CSSWidgetPresenceWrapper>\n </RTProvider>\n );\n};\n","import { Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jApi, {\n CombinedWidgetContent,\n jFileLittle,\n WidgetDisplayMode,\n WidgetQuickSurveyContent,\n WidgetQuickSurveyResponse,\n WidgetQuickSurveyResponseUserList,\n WidgetQuickSurveyType,\n WidgetsName,\n} from 'jamespot-user-api';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport styled from 'styled-components';\nimport { WidgetFooterView } from './components/WidgetFooterView';\nimport { WidgetInlineInputText } from './components/WidgetInlineInputText';\nimport { useWidgetRT } from '../hooks';\nimport { WidgetIsPending } from './components/WidgetIsPending';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { RTProvider } from '../../RTProvider.component';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst WidgetQuickSurvey = commonComponentsRegistry.getLazyComponent('WidgetQuickSurvey');\nconst WidgetQuickSurveyEditor = commonComponentsRegistry.getLazyComponent('WidgetQuickSurveyEditor');\nconst ModalUserList = commonComponentsRegistry.getLazyComponent('ModalUserList');\nconst JRCFileViewer = commonComponentsRegistry.getLazyComponent('FileViewer');\n\nconst WrapperContainer = styled.div<{ withPadding?: boolean }>`\n width: 100%;\n display: flex;\n flex-direction: column;\n gap: 14px;\n ${(props) => props.withPadding && `padding: 0 12px;`}\n padding-top: 16px;\n`;\n\ntype JRCWidgetQuickSurveyWrapperProps = {\n widget: WidgetQuickSurveyType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const JRCWidgetQuickSurveyWrapper = ({ widget, inplace, mode }: JRCWidgetQuickSurveyWrapperProps) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const { uniqid, content: widgetContent } = widget;\n const [response, setResponse] = useState<WidgetQuickSurveyResponse>({\n userResponses: [],\n totalRespondent: 0,\n totalResponse: 0,\n userLoggedResponses: [],\n });\n const [openUsersModal, setOpenUsersModal] = useState(false);\n const [isPending, setIsPending] = useState(false);\n const [usersListIndex, setUsersListIndex] = useState<number>();\n const [usersList, setUsersList] = useState<WidgetQuickSurveyResponseUserList>();\n\n const [abortController] = useState<AbortController>(new AbortController());\n const ref = useRef<AbortController>(abortController);\n\n const token = useAppSelector(Widget.selectors.selectToken, shallowEqual);\n\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, widget.uniqid), shallowEqual);\n\n const widgetObjectRights = useAppSelector(\n (state) => Widget.selectors.selectWidgetObjectRights(state, uniqid),\n shallowEqual,\n );\n\n const allRt = useAppSelector(\n (state) => Widget.selectors.selectAllWidgetRTObject(state, widget.uniqid),\n shallowEqual,\n );\n\n const onChange = useCallback(\n (uniqid: string, content: WidgetQuickSurveyContent) => {\n dispatch(updateWidgetContent(uniqid, content));\n },\n [dispatch],\n );\n\n const onChangeWrapper = (content: { uniqid: string; title?: string }) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n };\n\n const openEditorPanel = (token: string) => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(Widget.slice.actions.setToken({ token }));\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: WidgetsName.QuickSurvey,\n }),\n );\n };\n\n const handleError = useCallback(\n () => dispatch(Toast.actions.error({ label: 'WIDGET_Presence_Error' })),\n [dispatch],\n );\n\n const handleResponse = useCallback(\n (uniqid: string) => {\n if (mode === 'edit' || !uri) return;\n setIsPending(true);\n jApi.widget\n .quickSurveyGetResponse({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n setResponse(response.result);\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPending(false));\n },\n [handleError, uri, mode],\n );\n\n const handleWidgetGet = useCallback(() => {\n if (!uri) return;\n setIsPending(true);\n jApi.widget\n .getWidget<WidgetQuickSurveyType>({ uri, uniqid }, ref.current.signal)\n .then((response) => {\n onChange(uniqid, response.result.content);\n })\n .catch((err) => {\n return !err.aborted && handleError;\n })\n .finally(() => setIsPending(false));\n }, [uniqid, handleError, uri, onChange]);\n\n const handleRespond = (index: number) => {\n if (mode === 'edit' || !uri) return;\n setIsPending(true);\n jApi.widget\n .quickSurveyRespond({ uri, index, multi: widgetContent.multi ? 1 : 0, uniqid }, ref.current.signal)\n .then(() => {\n handleResponse(widget.uniqid);\n })\n .catch((err) => !err.aborted && handleError)\n .finally(() => setIsPending(false));\n };\n\n const handleCloseSurvey = () => {\n if (!uri) return;\n if (widgetContent.closing) {\n const finalContent = { ...widgetContent, isClosed: true } as CombinedWidgetContent;\n\n jApi.widget\n .updateWidget<WidgetQuickSurveyType>({\n uri,\n uniqid,\n content: finalContent,\n })\n .catch(() => {\n handleError();\n });\n }\n };\n\n const handleProgressBarClick = (index: number) => {\n handleRespond(index);\n };\n\n const handleAddQuickAnswer = (title: string) => {\n if (!uri) return;\n\n const newContent = {\n ...widgetContent,\n arr: [...(widgetContent.arr ?? []), { title }],\n } as CombinedWidgetContent;\n\n jApi.widget\n .quickSurveyAddEnty({ uri, uniqid, label: title })\n .then(() => {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content: newContent }));\n })\n .catch(handleError);\n };\n\n const handleLoadUsersList = (index: number, page?: number) => {\n if (!uri) return;\n jApi.widget\n .quickSurveyGetResponseUserList({ uri, uniqid, index, page, limit: 8 }, ref.current.signal)\n .then((response) => {\n setUsersList({\n ...response.result,\n data: [...response.result.data],\n cnt: response.result.cnt,\n });\n })\n .catch((err) => {\n return !err.aborted && handleError;\n });\n };\n\n const canUpdate = useMemo(() => widgetObjectRights && widgetObjectRights.update, [widgetObjectRights]);\n\n useEffect(() => {\n handleResponse(widget.uniqid);\n }, [handleResponse, widget.uniqid]);\n\n useEffect(() => {\n if (!Array.isArray(allRt)) return;\n const lastRt = allRt.at(-1);\n if (!lastRt) return;\n if (!uri) return;\n\n if (lastRt.object.uri === uri && lastRt.uniqid === widget.uniqid) {\n if (lastRt.fn === 'widget-quick-survey-response') {\n handleResponse(widget.uniqid);\n }\n if (lastRt.fn === 'widget-update') {\n handleWidgetGet();\n }\n }\n }, [allRt, uri, widget.uniqid, handleWidgetGet, handleResponse]);\n\n const files = useMemo(() => {\n if (!Array.isArray(widgetContent.arr)) return [];\n\n const fs: jFileLittle[] = [];\n widgetContent.arr.forEach((el) => {\n if (el.file) {\n fs.push(el.file);\n }\n });\n\n return fs;\n }, [widgetContent]);\n\n useEffect(() => {\n if (!token && mode === 'edit') {\n jApi.network.token().then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n });\n }\n }, [mode, token, dispatch]);\n\n if (mode === 'edit') {\n if (inplace) {\n return (\n <WrapperContainer withPadding={true}>\n <WidgetQuickSurveyEditor\n token={token}\n uniqid={uniqid}\n content={widget.content}\n onChangeContent={onChange}\n onChangeWrapper={onChangeWrapper}\n handleChange={(content) => onChange(uniqid, content)}\n inplace={inplace}\n />\n </WrapperContainer>\n );\n }\n }\n\n return (\n <RTProvider\n useRT={() => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useWidgetRT(widget.uniqid);\n }}>\n <WrapperContainer>\n <JRCFileViewer files={files} openWithOptions={[]}>\n {(open) => {\n return (\n <WidgetQuickSurvey\n limit={response.totalResponse ?? 0}\n values={widgetContent.arr ?? []}\n userResponses={response.userResponses}\n userHasAlreadyVoted={response.userLoggedResponses.length > 0}\n canCloseSurvey={widget.content.closing ?? false}\n isClosed={widget.content.isClosed ?? false}\n open={widget.content.open ?? false}\n anonymize={widget.content.anonymize ?? false}\n seeResponseAfter={widget.content.seeResponseAfter ?? false}\n canUpdate={canUpdate}\n handleClickFile={(entry) => entry.id && open(entry.id)}\n handleCloseSurvey={handleCloseSurvey}\n handleProgressBarClick={handleProgressBarClick}\n setOpenUsersModal={(index) => {\n setUsersListIndex(index);\n handleLoadUsersList(index);\n setOpenUsersModal(true);\n }}\n />\n );\n }}\n </JRCFileViewer>\n\n {widgetContent.open && (\n <WidgetInlineInputText\n handleClick={handleAddQuickAnswer}\n placeholder={intl.formatMessage({ id: 'FIELDS_Add_Option' })}\n />\n )}\n {canUpdate && (\n <WidgetFooterView\n uniqid={widget.uniqid}\n name={widget.name}\n collaborationRights={{\n update: !!canUpdate,\n }}\n mode={mode}\n handleOpenEditor={() => {\n if (!token) {\n setIsPending(true);\n jApi.network\n .token()\n .then((response) => {\n dispatch(Widget.slice.actions.setToken({ token: response.result }));\n openEditorPanel(response.result);\n })\n .finally(() => setIsPending(false));\n } else {\n openEditorPanel(token);\n }\n }}\n />\n )}\n {isPending && <WidgetIsPending />}\n <ModalUserList\n open={openUsersModal}\n usersList={usersList}\n title={widgetContent.arr?.[usersListIndex ?? 0]?.title ?? ''}\n setOpen={setOpenUsersModal}\n handleLoadUsersList={(page) => {\n handleLoadUsersList(usersListIndex ?? 0, page);\n }}\n onClose={() => {\n setUsersList({\n limit: 0,\n page: 0,\n data: [],\n cnt: 0,\n });\n }}\n />\n </WrapperContainer>\n </RTProvider>\n );\n};\n","import { WidgetUserProfileType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { UserCurrent, Widget, WidgetEditor } from 'jamespot-front-business';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { useEffect } from 'react';\n\nconst WidgetUserProfile = commonComponentsRegistry.getLazyComponent('WidgetUserProfile');\n\ntype JRCWidgetUserProfileWrapperProps = {\n widget: WidgetUserProfileType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const JRCWidgetUserProfileWrapper = ({ widget, mode }: JRCWidgetUserProfileWrapperProps) => {\n const dispatch = useAppDispatch();\n const { uniqid, name, content } = widget;\n\n const currentUser = useAppSelector(UserCurrent.selectors.get);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n return () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: false }));\n };\n }, [uniqid, dispatch]);\n\n useEffect(() => {\n if (mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name }));\n }\n }, [dispatch, mode, name, uniqid]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n return (\n <WidgetUserProfile\n currentUser={currentUser}\n pictureSize={content.pictureSize}\n displayMode={content.buttonName}\n css={content.css}\n />\n );\n};\n","import { WidgetWelcomeType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { UserCurrent, Widget, WidgetEditor } from 'jamespot-front-business';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\nimport { useEffect } from 'react';\n\nconst WidgetWelcome = commonComponentsRegistry.getLazyComponent('WidgetWelcome');\n\ntype JRCWidgetWelcomeWrapperProps = {\n widget: WidgetWelcomeType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const JRCWidgetWelcomeWrapper = ({ widget, mode }: JRCWidgetWelcomeWrapperProps) => {\n const dispatch = useAppDispatch();\n const { uniqid, name, content } = widget;\n\n const currentUser = useAppSelector(UserCurrent.selectors.get);\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n return () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: false }));\n };\n }, [uniqid, dispatch]);\n\n useEffect(() => {\n if (mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name }));\n }\n }, [dispatch, mode, name, uniqid]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n return (\n <WidgetWelcome\n currentUser={currentUser}\n position={content.position}\n lineBreak={content.lineBreak}\n message={content.message}\n displayMode={content.buttonName}\n css={content.css}\n />\n );\n};\n","import { WidgetColorType, WidgetDisplayMode } from 'jamespot-user-api';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\nimport { useEffect } from 'react';\n\nconst WidgetColor = commonComponentsRegistry.getLazyComponent('WidgetColor');\n\ntype JRCWidgetColorWrapperProps = {\n widget: WidgetColorType;\n inplace: boolean;\n mode?: WidgetDisplayMode;\n};\n\nexport const JRCWidgetColorWrapper = ({ widget, mode }: JRCWidgetColorWrapperProps) => {\n const dispatch = useAppDispatch();\n const { uniqid, name, content } = widget;\n\n useEffect(() => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: true }));\n return () => {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, mounted: false }));\n };\n }, [uniqid, dispatch]);\n\n useEffect(() => {\n if (mode === 'edit') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name }));\n }\n }, [dispatch, mode, name, uniqid]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n return <WidgetColor backgroundColor={content.backgroundColor} />;\n};\n","import { WidgetExtensionContent, WidgetKeys } from 'jamespot-user-api';\nimport { useEffect, useMemo } from 'react';\n\nexport const JRCWidgetExtensionWrapper = ({\n uniqid,\n extensionName,\n}: {\n uniqid: string;\n name: WidgetKeys;\n} & WidgetExtensionContent) => {\n const uuid = useMemo(() => `widget-extension-${extensionName}-${uniqid}`, [extensionName, uniqid]);\n\n useEffect(() => {\n if (!extensionName) return;\n J.react.require(extensionName, { anchorId: uuid });\n }, [extensionName, uuid]);\n\n return <div id={uuid}></div>;\n};\n","import { WidgetTableColumn, WidgetTableColumnsData } from 'jamespot-user-api';\n\nexport const getVisibleColumns = (tableColumnsData: WidgetTableColumnsData, columns: WidgetTableColumn[]) => {\n const toRet: WidgetTableColumn[] = [];\n tableColumnsData\n .filter((data) => data.isVisible)\n .forEach((data) => {\n const column = columns.find((el) => el.name === data.name);\n if (column) {\n toRet.push(column);\n }\n });\n\n return toRet;\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport jamespot, {\n Format,\n WidgetDatasourceValues,\n WidgetDisplayMode,\n WidgetExcelDatasourceTableContent,\n WidgetsName,\n WidgetTableColumn,\n} from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { getVisibleColumns } from './utils';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\n\nconst WidgetTable = commonComponentsRegistry.getLazyComponent('WidgetTable');\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const Wrapper = styled.div``;\n\nexport const AbsoluteWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n`;\n\nexport const WidgetExcelDatasourceTableWrapper = ({\n uri,\n limit,\n tableHeadColor,\n tableHeadTextColor,\n tableHeadIconColor,\n tableRowColor,\n tableRowTextColor,\n tableColumnsData = [],\n tableBorderRadius,\n tableSizedColumns,\n tableSizedColumnsWidth,\n mode,\n}: WidgetExcelDatasourceTableContent & { uniqid: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [datasourceData, setDatasourceData] = useState<Record<string, WidgetDatasourceValues>[]>([]);\n const [datasourceModel, setDatasourceModel] = useState<WidgetTableColumn[]>([]);\n\n const definition = useMemo(() => Widget.definition(WidgetsName.ExcelDatasourceTable), []);\n\n useEffect(() => {\n if (uri !== undefined && tableColumnsData.length !== 0 && datasourceModel.length === 0) {\n setIsLoading(true);\n jamespot.datasource\n .get(uri, Format.VIEW)\n .then((response) => {\n setDatasourceModel(response.result.model);\n setDatasourceData(response.result.data);\n })\n .finally(() => setIsLoading(false));\n }\n }, [uri, tableColumnsData, datasourceModel]);\n\n useEffect(() => {\n if (!uri) {\n setDatasourceModel([]);\n }\n }, [uri]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n const columns = useMemo(\n () => getVisibleColumns(tableColumnsData, datasourceModel),\n [tableColumnsData, datasourceModel],\n );\n\n if (tableColumnsData.length === 0 && !isLoading && mode === 'edit') {\n return (\n <>\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.ExcelDatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={definition.label} />\n <JRCButton label=\"GLOBAL_Settings\" />\n </AbsoluteWrapper>\n </>\n );\n }\n\n return isLoading ? (\n <AbsoluteWrapper>\n <Loader />\n </AbsoluteWrapper>\n ) : (\n <>\n {!isLoading && datasourceData.length === 0 && mode !== 'edit' ? (\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.ExcelDatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={'WIDGET_Datasource_No_Results'} />\n </AbsoluteWrapper>\n ) : (\n <WidgetTable\n rows={datasourceData}\n columns={columns}\n limit={limit}\n tableHeadColor={tableHeadColor}\n tableHeadTextColor={tableHeadTextColor}\n tableHeadIconColor={tableHeadIconColor}\n tableRowColor={tableRowColor}\n tableRowTextColor={tableRowTextColor}\n tableBorderRadius={tableBorderRadius}\n tableColumnsData={tableColumnsData}\n tableSizedColumns={tableSizedColumns}\n tableSizedColumnsWidth={tableSizedColumnsWidth}\n />\n )}\n </>\n );\n};\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FormattedMessage } from 'react-intl';\nimport jamespot, {\n DatasourceResultSort,\n DatasourceType,\n Format,\n WidgetDatasourceTableContent,\n WidgetDatasourceValues,\n WidgetDisplayMode,\n WidgetsName,\n WidgetTableColumn,\n} from 'jamespot-user-api';\nimport styled from 'styled-components';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { getVisibleColumns } from './utils';\nimport { FitType, useArticleRT } from '../hooks';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst WidgetTable = commonComponentsRegistry.getLazyComponent('WidgetTable');\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const Wrapper = styled.div``;\n\nexport const AbsoluteWrapper = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n`;\n\nexport const WidgetDatasourceTableWrapper = ({\n uri,\n limit,\n tableHeadColor,\n tableHeadTextColor,\n tableHeadIconColor,\n tableRowColor,\n tableRowTextColor,\n tableColumnsData = [],\n tableBorderRadius,\n tableSizedColumns,\n tableSizedColumnsWidth,\n mode,\n}: WidgetDatasourceTableContent & { uniqid: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [datasourceData, setDatasourceData] = useState<Record<string, WidgetDatasourceValues>[]>([]);\n const [datasourceModel, setDatasourceModel] = useState<WidgetTableColumn[]>([]);\n const [datasourceSort, setDatasourceSort] = useState<DatasourceResultSort>({ order: 'ascending', name: 'unknown' });\n const [datasourceType, setDatasourceType] = useState<DatasourceType | undefined>(undefined);\n const [datasourceIdentifier, setDatasourceIdentifier] = useState<string>('');\n\n const definition = useMemo(() => Widget.definition(WidgetsName.DatasourceTable), []);\n const rtConditions = useMemo<FitType[]>(() => {\n if (datasourceType === 'studio') {\n return [{ type: [datasourceIdentifier] }];\n }\n\n return [];\n }, [datasourceType, datasourceIdentifier]);\n const rtAudience = useMemo<string[]>(() => {\n if (datasourceType === 'doc') {\n return [datasourceIdentifier];\n }\n\n return [];\n }, [datasourceType, datasourceIdentifier]);\n\n const { rtLastObject } = useArticleRT(rtConditions, rtAudience);\n\n const fetchDatasource = useCallback(() => {\n if (!uri) {\n return;\n }\n\n setIsLoading(true);\n jamespot.datasource\n .get(uri, Format.VIEW)\n .then((response) => {\n setDatasourceModel(response.result.model);\n setDatasourceData(response.result.data);\n setDatasourceSort(response.result.sort);\n setDatasourceType(response.result.datasource.datasourceType);\n setDatasourceIdentifier(response.result.datasource.datasourceIdentifier);\n })\n .finally(() => setIsLoading(false));\n }, [uri]);\n\n useEffect(() => {\n if (uri !== undefined && tableColumnsData.length !== 0 && datasourceModel.length === 0) {\n fetchDatasource();\n }\n }, [uri, tableColumnsData, datasourceModel, fetchDatasource]);\n\n useEffect(() => {\n if (!rtLastObject) {\n return;\n }\n\n fetchDatasource();\n }, [rtLastObject, fetchDatasource]);\n\n useEffect(() => {\n if (!uri) {\n setDatasourceModel([]);\n }\n }, [uri]);\n\n useEffect(() => {\n if (mode === 'view' || mode === 'preview') {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n }\n }, [mode, dispatch]);\n\n const columns = useMemo(\n () => getVisibleColumns(tableColumnsData, datasourceModel),\n [tableColumnsData, datasourceModel],\n );\n\n if (tableColumnsData.length === 0 && !isLoading && mode === 'edit') {\n return (\n <>\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.DatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={definition.label} />\n <JRCButton label=\"GLOBAL_Settings\" />\n </AbsoluteWrapper>\n </>\n );\n }\n\n return isLoading ? (\n <AbsoluteWrapper>\n <Loader />\n </AbsoluteWrapper>\n ) : (\n <>\n {!isLoading && datasourceData.length === 0 && mode !== 'edit' ? (\n <AbsoluteWrapper>\n <img src={`/img/fast-intranet/${WidgetsName.DatasourceTable}.png`} alt=\"\" />\n <FormattedMessage id={'WIDGET_Datasource_No_Results'} />\n </AbsoluteWrapper>\n ) : (\n <WidgetTable\n rows={datasourceData}\n columns={columns}\n limit={limit}\n tableHeadColor={tableHeadColor}\n tableHeadTextColor={tableHeadTextColor}\n tableHeadIconColor={tableHeadIconColor}\n tableRowColor={tableRowColor}\n tableRowTextColor={tableRowTextColor}\n tableBorderRadius={tableBorderRadius}\n tableColumnsData={tableColumnsData}\n tableSizedColumns={tableSizedColumns}\n tableSizedColumnsWidth={tableSizedColumnsWidth}\n tableDefaultSortOrder={datasourceSort.order}\n tableDefaultSortName={datasourceSort.name}\n />\n )}\n </>\n );\n};\n","import { useAppSelector } from '../../../redux/store';\nimport { Hook } from 'jamespot-front-business';\nimport { LicenseHookListType } from 'jamespot-user-api';\nimport { ReactNode } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nconst UILicenseRequired = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: ${(props) => props.theme.color.orange};\n`;\n\nexport const WidgetLicenseWrapper = ({ children, name }: { children: ReactNode; name: keyof LicenseHookListType }) => {\n const hook = useAppSelector((state) => Hook.selectors.selectHook(state, name));\n const intl = useIntl();\n\n if (hook && !hook.hasLicense) {\n return (\n <UILicenseRequired>\n {intl.formatMessage({ id: 'WIDGET_Missing_License' }, { label: 'label' in hook ? hook.label : '' })}\n </UILicenseRequired>\n );\n }\n\n return <>{children}</>;\n};\n","import {\n CombinedWidgetType,\n ensureWidgetArticleAttachmentType,\n ensureWidgetArticleButtonType,\n ensureWidgetArticleGalleryType,\n ensureWidgetArticleImageType,\n ensureWidgetArticleSliderType,\n ensureWidgetArticleTextType,\n ensureWidgetArticleTitleType,\n ensureWidgetCalendarCalDavType,\n ensureWidgetCheckListType,\n ensureWidgetContactCardDavType,\n ensureWidgetDatasourceTableType,\n ensureWidgetEmailsImapType,\n ensureWidgetExcelDatasourceTableType,\n ensureWidgetExtensionType,\n ensureWidgetLuccaAbsenceType,\n ensureWidgetPresenceType,\n ensureWidgetQuickSurveyType,\n ensureWidgetUserProfileType,\n ensureWidgetColorType,\n ensureWidgetWelcomeType,\n WidgetDisplayMode,\n WidgetWrapperLevel,\n // hygen: inject:here ensure\n} from 'jamespot-user-api';\nimport { ReactNode } from 'react';\nimport styled from 'styled-components';\nimport { WidgetHeaderEdit } from './wrapper/components/WidgetHeaderEdit';\nimport { WidgetTitle } from './wrapper/components/WidgetTitle';\nimport { JRCWidgetArticleAttachmentWrapper } from './wrapper/JRCWidgetArticleAttachmentWrapper';\nimport { JRCWidgetArticleButtonWrapper } from './wrapper/JRCWidgetArticleButtonWrapper';\nimport { JRCWidgetArticleGalleryWrapper } from './wrapper/JRCWidgetArticleGalleryWrapper';\nimport { JRCWidgetArticleImageWrapper } from './wrapper/JRCWidgetArticleImageWrapper';\nimport { JRCWidgetArticleSliderWrapper } from './wrapper/JRCWidgetArticleSliderWrapper';\nimport { JRCWidgetArticleTextWrapper } from './wrapper/JRCWidgetArticleTextWrapper';\nimport { JRCWidgetArticleTitleWrapper } from './wrapper/JRCWidgetArticleTitleWrapper';\nimport { JRCWidgetCalendarCalDavWrapper } from './wrapper/JRCWidgetCalendarCalDavWrapper';\nimport { JRCWidgetCheckListWrapper } from './wrapper/JRCWidgetCheckListWrapper';\nimport { JRCWidgetContactCardDavWrapper } from './wrapper/JRCWidgetContactCardDavWrapper';\nimport { JRCWidgetEmailsImapWrapper } from './wrapper/JRCWidgetEmailsImapWrapper';\nimport { JRCWidgetLuccaAbsenceWrapper } from './wrapper/JRCWidgetLuccaAbsenceWrapper';\nimport { JRCWidgetPresenceWrapper } from './wrapper/JRCWidgetPresenceWrapper';\nimport { JRCWidgetQuickSurveyWrapper } from './wrapper/JRCWidgetQuickSurveyWrapper';\nimport { JRCWidgetUserProfileWrapper } from './wrapper/JRCWidgetUserProfileWrapper';\nimport { JRCWidgetWelcomeWrapper } from './wrapper/JRCWidgetWelcomeWrapper';\nimport { JRCWidgetColorWrapper } from './wrapper/JRCWidgetColorWrapper';\nimport { JRCWidgetExtensionWrapper } from './wrapper/JRCWidgetExtensionWrapper';\nimport { WidgetExcelDatasourceTableWrapper } from './wrapper/JRCWidgetExcelDatasourceTableWrapper';\nimport { WidgetDatasourceTableWrapper } from './wrapper/JRCWidgetDatasourceTableWrapper';\nimport { WidgetLicenseWrapper } from './wrapper/WidgetLicenseWrapper';\n\nexport const CSSWidgetWithTitle = styled.div`\n display: flex;\n flex: 1;\n flex-direction: column;\n`;\n\nexport const DisplayWidget = ({\n widget,\n width,\n inplace = false,\n mode = 'view',\n onWidgetUpdate,\n cannotDisplayComponent,\n levelFallback,\n dataCy,\n}: {\n widget: CombinedWidgetType;\n width?: number | undefined;\n inplace: boolean;\n mode: WidgetDisplayMode;\n onWidgetUpdate?: () => void;\n cannotDisplayComponent?: (widget: string) => ReactNode;\n levelFallback?: (level: WidgetWrapperLevel, url: string) => ReactNode | undefined;\n dataCy?: string;\n}) => {\n const { name } = widget;\n\n if (ensureWidgetArticleButtonType(widget)) {\n return <JRCWidgetArticleButtonWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleGalleryType(widget)) {\n return <JRCWidgetArticleGalleryWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetLuccaAbsenceType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'LuccaAbsenceHook'}>\n <JRCWidgetLuccaAbsenceWrapper uniqid={widget.uniqid} />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetArticleAttachmentType(widget)) {\n return <JRCWidgetArticleAttachmentWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleImageType(widget)) {\n return <JRCWidgetArticleImageWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetArticleSliderType(widget)) {\n return <JRCWidgetArticleSliderWrapper widget={widget} inplace={inplace} mode={mode} width={width ?? 800} />;\n } else if (ensureWidgetArticleTitleType(widget)) {\n return <JRCWidgetArticleTitleWrapper widget={widget} inplace={inplace} mode={mode} dataCy={dataCy} />;\n } else if (ensureWidgetArticleTextType(widget)) {\n return <JRCWidgetArticleTextWrapper widget={widget} inplace={inplace} mode={mode} />;\n } else if (ensureWidgetExcelDatasourceTableType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetTitle uniqid={widget.uniqid} />\n <WidgetExcelDatasourceTableWrapper {...widget.content} uniqid={widget.uniqid} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetDatasourceTableType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetTitle uniqid={widget.uniqid} />\n <WidgetDatasourceTableWrapper {...widget.content} uniqid={widget.uniqid} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetCheckListType(widget, widget.name === 'widget-check-list')) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetCheckListWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n onWidgetUpdate={onWidgetUpdate}\n />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetPresenceType(widget)) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetPresenceWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetQuickSurveyType(widget)) {\n return (\n <CSSWidgetWithTitle>\n {mode === 'edit' ? (\n <WidgetHeaderEdit name={widget.name} uniqid={widget.uniqid} />\n ) : (\n <WidgetTitle uniqid={widget.uniqid} />\n )}\n <JRCWidgetQuickSurveyWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetCalendarCalDavType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetCalendarCalDavWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetContactCardDavType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetContactCardDavWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetEmailsImapType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <WidgetLicenseWrapper name={'OfficeHook'}>\n <JRCWidgetEmailsImapWrapper\n widget={widget}\n inplace={inplace}\n mode={mode}\n levelFallback={levelFallback}\n />\n </WidgetLicenseWrapper>\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetUserProfileType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <JRCWidgetUserProfileWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetColorType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <JRCWidgetColorWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetWelcomeType(widget)) {\n return (\n <CSSWidgetWithTitle>\n <JRCWidgetWelcomeWrapper widget={widget} inplace={inplace} mode={mode} />\n </CSSWidgetWithTitle>\n );\n } else if (ensureWidgetExtensionType(widget) && widget.content.extensionName) {\n return (\n <CSSWidgetWithTitle>\n <JRCWidgetExtensionWrapper\n uniqid={widget.uniqid}\n name={widget.name}\n extensionName={widget.content.extensionName}\n />\n </CSSWidgetWithTitle>\n );\n // hygen: inject:here elseif\n } else {\n return cannotDisplayComponent ? <>{cannotDisplayComponent(name)}</> : <>cannot display widget ({name})</>;\n }\n};\n","import styled from 'styled-components';\n\nexport const CSSWidgetLayer = styled.div<{ opacity: number; backgroundColor: string; pointerEvents: string }>`\n position: absolute;\n inset: 0;\n opacity: ${(props) => props.opacity};\n background-color: ${(props) => props.backgroundColor};\n pointer-events: ${(props) => props.pointerEvents};\n`;\n","import { ReactElement, useCallback, useEffect, useRef, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetVector, WidgetDisplayMode, WidgetKeys } from 'jamespot-user-api';\nimport { WidgetEditor, Widget } from 'jamespot-front-business';\n// eslint-disable-next-line import/no-cycle\nimport WidgetWrapperCore from '../WidgetWrapperCore';\nimport { CSSWidgetLayer } from './WidgetLayer.style';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst BETA_JRCDoubleClick = commonComponentsRegistry.getLazyComponent('DoubleClick');\n\n/*\n Widget layering\n*/\n\nexport const WidgetLayer = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const layers = useAppSelector((state) => state.widgets.ids[uniqid].widget.layers, shallowEqual);\n return (\n <>\n {layers?.map((layer, index) => {\n if (mode === 'edit') {\n return <Layer uniqid={layer} key={index} mode={'edit'} />;\n }\n\n return <Layer uniqid={layer} key={index} mode={'edit'} />;\n })}\n </>\n );\n};\n\nconst Layer = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const layer = useAppSelector((state) => state.widgets.layers[uniqid]);\n if (mode === 'view') {\n return (\n <CSSWidgetLayer opacity={1} backgroundColor={'transparent'} pointerEvents={'none'}>\n {layer.widgets.map((widgetWrapper, index) => {\n return (\n <LayerWidget\n key={index}\n layerId={layer.uniqid}\n uniqid={widgetWrapper.widget.uniqid}\n mode={'view'}\n />\n );\n })}\n </CSSWidgetLayer>\n );\n }\n\n return (\n <CSSWidgetLayer\n opacity={layer.visible ? 1 : 0}\n backgroundColor={layer.visible ? 'rgba(255,255,255,.1)' : 'transparent'}\n pointerEvents={layer.locked ? 'none' : 'all'}>\n {layer.widgets.map((widgetWrapper, index) => {\n return (\n <LayerWidget\n key={index}\n layerId={layer.uniqid}\n uniqid={widgetWrapper.widget.uniqid}\n mode={'edit'}\n />\n );\n })}\n </CSSWidgetLayer>\n );\n};\n\n/*\n Widget from the layer\n*/\nconst LayerWidget = ({ uniqid, layerId, mode }: { uniqid: string; layerId: string; mode: WidgetDisplayMode }) => {\n const dispatch = useAppDispatch();\n const widgetWrapper = useAppSelector((state) => state.widgets.ids[uniqid], shallowEqual);\n const layer = useAppSelector((state) => state.widgets.layers[layerId]);\n\n if (!widgetWrapper) {\n return <></>;\n }\n\n if (!layer) {\n return <></>;\n }\n\n if (!layer.position) {\n return <></>;\n }\n\n const onDoubleTap = (uniqid: string, name: WidgetKeys) => {\n /*\n Open editor\n */\n dispatch(WidgetEditor.slice.actions.registerEditor({ uniqid, name }));\n };\n\n const onMouseUp = (position: WidgetVector) => {\n dispatch(Widget.slice.actions.updateLayer({ uniqid: layerId, props: { position } }));\n };\n\n if (mode === 'view') {\n return (\n <div style={{ position: 'absolute', top: layer.position.y, left: layer.position.x }}>\n <WidgetWrapperCore\n uniqid={uniqid}\n widget={widgetWrapper}\n mode={mode}\n inplace={true}\n context={'article'}\n />\n </div>\n );\n }\n\n return (\n <DraggableHandler\n position={{ x: layer.position.x, y: layer.position.y }}\n onMouseUp={(position: WidgetVector) => {\n if (\n (layer.position && layer.position.x !== position.x) ||\n (layer.position && layer.position.y !== position.y)\n ) {\n onMouseUp(position);\n }\n }}>\n <BETA_JRCDoubleClick\n onDoubleTap={() => onDoubleTap(widgetWrapper.widget.uniqid, widgetWrapper.widget.name)}>\n <WidgetWrapperCore\n uniqid={uniqid}\n widget={widgetWrapper}\n mode={mode}\n inplace={true}\n context={'article'}\n />\n </BETA_JRCDoubleClick>\n </DraggableHandler>\n );\n};\n\nexport type Vector = {\n x: number;\n y: number;\n};\n\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\n// TODO: COMBINE WITH THE ONE USED ON COLOR PICKER\nexport const DraggableHandler = ({\n position,\n children,\n onMouseUp,\n}: {\n position: Vector;\n children: ReactElement;\n onMouseUp: (position: Vector) => void;\n}) => {\n const [mouseIsDown, setMouseDown] = useState<boolean>(false);\n const [mouse, setMouse] = useState<Vector>({ x: 0, y: 0 });\n const [start, setStart] = useState<Vector>({ x: 0, y: 0 });\n const [child, setChild] = useState<Vector>({ x: position.x, y: position.y });\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleMouseDown = useCallback(\n (event: any) => {\n setMouseDown(true);\n if (ref.current) {\n setMouse({ x: event.nativeEvent.clientX, y: event.nativeEvent.clientY });\n setStart({ x: child.x, y: child.y });\n }\n },\n [child.x, child.y],\n );\n\n const handleMouseMove = useCallback(\n (event: any) => {\n if (mouseIsDown && ref.current) {\n const dx = start.x + (event.clientX - mouse.x);\n const dy = start.y + (event.clientY - mouse.y);\n\n setChild({ x: dx, y: dy });\n }\n },\n [mouse.x, mouse.y, mouseIsDown, start.x, start.y],\n );\n\n const handleMouseUp = useCallback(() => {\n setMouseDown(false);\n onMouseUp({ x: child.x, y: child.y });\n }, [child.x, child.y, onMouseUp]);\n\n useEffect(() => {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [handleMouseMove, handleMouseUp]);\n\n return (\n <div style={{ position: 'absolute', top: child.y, left: child.x }} ref={ref} onMouseDown={handleMouseDown}>\n {children}\n </div>\n );\n};\n","import { WidgetKeys } from 'jamespot-user-api';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppSelector } from '../../redux/store';\n\nconst JRCLoader = commonComponentsRegistry.getLazyComponent('Loader');\n\n/*\n Widget state\n*/\n\n//TODO: REFACTORING\nexport const WidgetState = ({ uniqid, inplace }: { name: WidgetKeys; uniqid: string; inplace: boolean }) => {\n const state = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid));\n\n if (state?.loading) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255,255,255,.7)',\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n }}>\n <JRCLoader />\n </div>\n );\n }\n\n if (state?.hover) {\n return (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(255,255,255,.7)',\n display: 'flex',\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n }}></div>\n );\n }\n\n if (!state?.initialized && inplace) {\n return <></>;\n }\n\n return <></>;\n};\n","import { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { DashedFocusBorder } from 'jamespot-react-components';\nimport { WidgetKeys } from 'jamespot-user-api';\nimport { useCallback } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\n\nconst JRCHtml = commonComponentsRegistry.getLazyComponent('Html');\n\nexport const WrapperEditMode = styled.button`\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n gap: ${(props) => props.theme.space.md}px;\n color: ${(props) => props.theme.color.primary};\n cursor: pointer;\n opacity: 0;\n border: 1px solid ${(props) => props.theme.color.primary};\n &:hover {\n background-color: ${(props) => props.theme.color.grey2};\n opacity: 0.9;\n }\n\n ${DashedFocusBorder()}\n`;\n\nexport const WidgetWrapperCoreEditHover = ({ uniqid, name }: { uniqid: string; name: WidgetKeys }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n\n const registerEditor = useCallback(() => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid,\n name,\n }),\n );\n }, [dispatch, uniqid, name]);\n const def = Widget.definition(name);\n\n return (\n <WrapperEditMode onClick={registerEditor}>\n <JRCHtml\n __html={`${intl.formatMessage({ id: 'WIDGET_Set_Widget' })} <b>${intl.formatMessage({\n id: def.label,\n })}</b>`}\n />\n </WrapperEditMode>\n );\n};\n","import { ReactNode, useMemo } from 'react';\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../../../redux/store';\nimport styled, { useTheme } from 'styled-components';\n\nexport const UIWrapper = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\n/*\n DO NOT USE PADDING HERE (LOOK AT WIDGET STYLE PADDING COMPONENT)\n*/\nconst WidgetStyle = ({ uniqid, onClick, children }: { uniqid: string; onClick: () => void; children: ReactNode }) => {\n const theme = useTheme();\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n borderRadius: styles && styles['border-radius'] ? `${styles['border-radius']}px` : '0px',\n borderColor: styles['border-color'] ? String(styles['border-color']) : theme.color.black,\n borderWidth: styles['border-width'] ? `${styles['border-width']}px` : '0px',\n borderStyle: styles['border-style'] ? String(styles['border-style']) : 'none',\n };\n }, [styles, theme]);\n\n return (\n <UIWrapper\n onClick={onClick}\n style={{\n color: initialValues.color,\n borderColor: initialValues.borderColor,\n borderStyle: initialValues.borderStyle,\n borderRadius: initialValues.borderRadius,\n borderWidth: initialValues.borderWidth,\n backgroundColor: initialValues.backgroundColor,\n overflow: Number(initialValues.borderRadius) > 0 ? 'hidden' : 'initial',\n }}>\n {children}\n </UIWrapper>\n );\n};\n\nexport const WidgetStyleWrapper = WidgetStyle;\n","import { WidgetKeys, WidgetWrapperLevel } from 'jamespot-user-api';\n\nimport { Widget } from 'jamespot-front-business';\nimport { shallowEqual } from 'react-redux';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\nimport styled from 'styled-components';\n\nconst WidgetIcon = commonComponentsRegistry.getLazyComponent('WidgetIcon');\n\nexport const CSSIconAbsoluteA = styled.a<{ color: string | undefined }>`\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n color: ${(props) => (props.color ? props.color : props.theme.color.black)};\n transition: background-color 0.4s;\n &:hover {\n background-color: rgba(0, 0, 0, 0.1);\n color: ${(props) => (props.color ? props.color : props.theme.color.black)};\n }\n`;\n\nexport const JRCWidgetIconWrapper = ({\n uniqid,\n name,\n url,\n level,\n}: {\n uniqid: string;\n name: WidgetKeys;\n url: string;\n level: WidgetWrapperLevel;\n}) => {\n const def = Widget.definition(name);\n const count = useAppSelector(\n (state) => (level === 2 ? Widget.selectors.selectWidgetChipCount(state, uniqid) : 0),\n shallowEqual,\n );\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n return (\n <CSSIconAbsoluteA\n href={url}\n target=\"_blank\"\n color={String(styles.color) ?? undefined}\n rel=\"noreferrer\"\n aria-label={def.label}>\n <WidgetIcon count={count} img={def.img} label={def.label} maxValue={999} />\n </CSSIconAbsoluteA>\n );\n};\n","import { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { jCommentList, WidgetContext, WidgetDisplayMode, WidgetWrapperProps } from 'jamespot-user-api';\nimport { ReactNode, useCallback, useEffect } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { useComponentVisible } from './hooks';\nimport { DisplayWidget } from './Widget';\n\n// eslint-disable-next-line import/no-cycle\nimport { WidgetLayer } from './WidgetLayer/WidgetLayer';\nimport { WidgetState } from './WidgetState';\nimport { WidgetWrapperCoreEditHover } from './WidgetWrapperCoreEditHover';\n\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { WidgetStyleWrapper } from './wrapper/components/WidgetStyleWrapper';\nimport { JRCWidgetIconWrapper } from './wrapper/JRCWidgetIconWrapper';\ntype WidgetWrapperCoreProps = {\n uniqid: string;\n widgetObject?: Partial<jCommentList>;\n widget: WidgetWrapperProps;\n inplace?: boolean;\n mode: WidgetDisplayMode;\n width?: number | undefined;\n context: WidgetContext;\n onWidgetUpdate?: () => void;\n cannotDisplayComponent?: (widget: string) => ReactNode;\n dataCy?: string;\n};\n\n/*\n This is a widget wrapper\n*/\nexport const WidgetWrapperCore = ({\n uniqid,\n widgetObject,\n widget,\n inplace = true,\n mode,\n width,\n context,\n onWidgetUpdate,\n cannotDisplayComponent,\n dataCy,\n}: WidgetWrapperCoreProps) => {\n const dispatch = useAppDispatch();\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid));\n const indexOrder = useAppSelector((state) => state.widgets.editableMap[uniqid], shallowEqual);\n const currentEditableWidgetId = useAppSelector((state) => state.widgets.currentEditableWidgetId, shallowEqual);\n const isActive = useAppSelector((state) => state.widgets.currentEditableWidgetId === uniqid, shallowEqual);\n const { isComponentVisible, setIsComponentVisible } = useComponentVisible(false);\n\n useEffect(() => {\n if (widgetObject) {\n dispatch(Widget.slice.actions.registerWidgetObject({ uniqid, object: widgetObject }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (widget) {\n /*\n Register widget\n */\n dispatch(Widget.slice.actions.registerWidget({ uniqid, widget, context }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!isComponentVisible) {\n if (uniqid === currentEditableWidgetId) {\n dispatch(Widget.slice.actions.setEditableWidgetId({ uniqid: undefined }));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isComponentVisible]);\n\n useEffect(() => {\n if (isComponentVisible !== isActive) {\n setIsComponentVisible(isActive);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isActive]);\n\n const registerEditor = useCallback(() => {\n if (widgetWrapper === undefined || mode === 'view') {\n return;\n }\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n /*\n Register editor\n */\n const { widget } = widgetWrapper;\n dispatch(\n WidgetEditor.slice.actions.registerEditor({\n uniqid: widget.uniqid,\n name: widget.name,\n }),\n );\n }, [dispatch, mode, widgetWrapper]);\n\n if (widgetWrapper === undefined) {\n return <>This widget cannot be displayed</>;\n }\n\n if (inplace && mode !== 'view') {\n return (\n <WidgetStyleWrapper\n uniqid={uniqid}\n onClick={() => {\n setIsComponentVisible(true);\n if (indexOrder) {\n dispatch(Widget.slice.actions.setEditableIndex({ index: indexOrder.index }));\n dispatch(Widget.slice.actions.setEditableWidgetId({ uniqid }));\n }\n }}>\n <DisplayWidget\n dataCy={dataCy}\n width={width}\n widget={{\n ...widgetWrapper.widget,\n ...(widgetWrapper.title && {\n title: widgetWrapper.title,\n }),\n }}\n inplace={inplace}\n mode={mode}\n levelFallback={(level, url) => {\n return (\n level <= 2 && (\n <JRCWidgetIconWrapper\n uniqid={widget.widget.uniqid}\n name={widget.widget.name}\n level={level}\n url={url}\n />\n )\n );\n }}\n />\n <WidgetLayer uniqid={uniqid} mode={mode} />\n <WidgetState name={widgetWrapper.widget.name} uniqid={widgetWrapper.widget.uniqid} inplace={inplace} />\n </WidgetStyleWrapper>\n );\n }\n\n return (\n <WidgetStyleWrapper uniqid={uniqid} onClick={registerEditor}>\n <DisplayWidget\n dataCy={dataCy}\n widget={{\n ...widgetWrapper.widget,\n ...(widgetWrapper.title && {\n title: widgetWrapper.title,\n }),\n }}\n inplace={inplace}\n mode={mode}\n width={width}\n onWidgetUpdate={onWidgetUpdate}\n cannotDisplayComponent={cannotDisplayComponent}\n levelFallback={(level, url) => {\n return (\n level <= 2 && (\n <JRCWidgetIconWrapper\n uniqid={widget.widget.uniqid}\n name={widget.widget.name}\n level={level}\n url={url}\n />\n )\n );\n }}\n />\n <WidgetLayer uniqid={uniqid} mode={mode} />\n {mode === 'edit' && <WidgetWrapperCoreEditHover uniqid={uniqid} name={widget.widget.name} />}\n <WidgetState name={widgetWrapper.widget.name} uniqid={widgetWrapper.widget.uniqid} inplace={inplace} />\n </WidgetStyleWrapper>\n );\n};\n\nexport default WidgetWrapperCore;\n","import styled from 'styled-components';\nexport const CSSCommentsBlocWidgetWrapper = styled.div`\n border-radius: ${(props) => props.theme.space.sm}px;\n border: 1px solid ${(props) => props.theme.color.grey1};\n background-color: ${(props) => props.theme.color.white};\n overflow: hidden;\n`;\n","import { Widget } from 'jamespot-front-business';\nimport { WidgetWrapperProps } from 'jamespot-user-api';\n\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport WidgetWrapperCore from '../widgets/WidgetWrapperCore';\nimport { CSSCommentsBlocWidgetWrapper } from './CommentsBloc.styles';\n\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\n\nexport const CommentsBlocAddCommentWidgetsWrapper = ({ widgets }: { widgets: WidgetWrapperProps[] }) => {\n const intl = useIntl();\n const flushedWidgets = useAppSelector(Widget.selectors.selectFlushedWidgets, shallowEqual);\n\n return (\n <>\n {widgets\n .filter((el) => !flushedWidgets.includes(el.widget.uniqid))\n .map(\n (widget) =>\n widget &&\n widget.widget && (\n <CSSCommentsBlocWidgetWrapper key={widget.widget.uniqid}>\n <WidgetWrapperCore\n uniqid={widget.widget.uniqid}\n widget={widget}\n inplace\n mode={'edit'}\n cannotDisplayComponent={(widget) => (\n <JRCMessage\n variant={'info'}\n message={intl.formatMessage({ id: 'WIDGET_Cannot_Display' }, { widget })}\n />\n )}\n context={'comment'}\n />\n </CSSCommentsBlocWidgetWrapper>\n ),\n )}\n </>\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { jCommentList, WidgetDisplayMode, WidgetWrapperProps } from 'jamespot-user-api';\n\nimport { useIntl } from 'react-intl';\nimport { shallowEqual } from 'react-redux';\nimport { useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport WidgetWrapperCore from '../widgets/WidgetWrapperCore';\nimport { CSSCommentsBlocWidgetWrapper } from './CommentsBloc.styles';\n\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\n\nexport const CommentsBlocCommentWidgetsWrapper = (props: {\n comment: jCommentList;\n widgets: WidgetWrapperProps[];\n mode: WidgetDisplayMode;\n inplace: boolean;\n handleWidgetUpdate: () => void;\n handleWidgetRemove: () => void;\n}) => {\n const intl = useIntl();\n const { widgets, comment, inplace, mode, handleWidgetUpdate } = props;\n const flushedWidgets = useAppSelector(Widget.selectors.selectFlushedWidgets, shallowEqual);\n\n return (\n <>\n {widgets\n .filter((el) => !flushedWidgets.includes(el.widget.uniqid))\n .map(\n (widget) =>\n widget && (\n <CSSCommentsBlocWidgetWrapper key={widget.widget.uniqid}>\n <WidgetWrapperCore\n uniqid={widget.widget.uniqid}\n widgetObject={comment}\n widget={widget}\n inplace={inplace}\n mode={mode}\n onWidgetUpdate={handleWidgetUpdate}\n cannotDisplayComponent={(widget) => {\n return (\n <JRCMessage\n variant={'info'}\n message={intl.formatMessage(\n { id: 'WIDGET_Cannot_Display' },\n { widget },\n )}\n />\n );\n }}\n context={'comment'}\n />\n </CSSCommentsBlocWidgetWrapper>\n ),\n )}\n </>\n );\n};\n","import { useMemo, useState } from 'react';\r\nimport { Editor, JTinyMCEExtensionsBuilders } from 'jamespot-react-components';\r\n\r\nexport const useGifsModal = (): {\r\n open: boolean;\r\n onSelect: (v: string) => void;\r\n close: () => void;\r\n ext: ReturnType<typeof JTinyMCEExtensionsBuilders.gifs>;\r\n isActive?: boolean;\r\n} => {\r\n const [open, setOpen] = useState(false);\r\n const [editor, setEditor] = useState<Editor>();\r\n const ext = useMemo(\r\n () =>\r\n JTinyMCEExtensionsBuilders.gifs(\r\n (ed) => setEditor(ed),\r\n () => setOpen(true),\r\n ),\r\n [],\r\n );\r\n return {\r\n open,\r\n onSelect: (v: string) => {\r\n editor?.execCommand('InsertHTML', false, `<img src=\"${v}\" alt=\"\" />`);\r\n setOpen(false);\r\n },\r\n close: () => setOpen(false),\r\n ext,\r\n isActive: true,\r\n };\r\n};\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { FormattedMessage } from 'react-intl';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\nimport jApi, { Gif } from 'jamespot-user-api';\r\nimport { useAppDispatch } from '../../../redux/store';\r\nimport { Toast } from 'jamespot-front-business';\r\nimport { useAbortController } from '../../../hooks';\r\n\r\nconst GifsSelector = commonComponentsRegistry.getLazyComponent('GifsSelector');\r\nconst Modal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type GifsModalProps = {\r\n onSelect: (url: string) => void;\r\n open: boolean;\r\n close: () => void;\r\n};\r\n\r\nconst nbItemsPerPage = 10;\r\n\r\nexport const GifsModal = ({ onSelect, open, close }: GifsModalProps) => {\r\n const dispatch = useAppDispatch();\r\n const abortController = useAbortController();\r\n const [loading, setLoading] = useState(false);\r\n const [gifs, setGifs] = useState<Gif[]>([]);\r\n const [query, setQuery] = useState<{ q?: string; offset: number }>({ q: undefined, offset: 0 });\r\n\r\n const doClose = useCallback(() => {\r\n close();\r\n setQuery({ q: undefined, offset: 0 });\r\n }, [close]);\r\n\r\n useEffect(() => {\r\n if (open) {\r\n setLoading(true);\r\n jApi.jamespot\r\n .getGifs(\r\n { q: query.q || 'awesome', limit: nbItemsPerPage, offset: query.offset },\r\n { signal: abortController.signal },\r\n )\r\n .then((res) => {\r\n setGifs(query.offset === 0 ? res.result : (prev) => [...prev, ...res.result]);\r\n })\r\n .catch((e) => {\r\n if (!e.aborted) {\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? 'GLOBAL_Error' }));\r\n }\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }\r\n }, [abortController, dispatch, open, query]);\r\n\r\n return (\r\n <Modal\r\n title={'Gif'}\r\n open={open}\r\n closeHandler={doClose}\r\n enableClickAwayCloseModal\r\n variant={'fixed-height'}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: doClose,\r\n },\r\n ]}>\r\n <GifsSelector\r\n gifs={gifs}\r\n onSelectGif={onSelect}\r\n loading={loading}\r\n onSearch={(q) => setQuery({ q, offset: 0 })}\r\n onReachEnd={() => {\r\n setQuery((prev) => ({ ...prev, offset: prev.offset + nbItemsPerPage }));\r\n }}\r\n />\r\n </Modal>\r\n );\r\n};\r\n","import {\n Application,\n Comment,\n Hook,\n Model,\n Platform,\n TinyMCE,\n Toast,\n UserCurrent,\n Widget,\n} from 'jamespot-front-business';\nimport { DriveOrFilebank } from 'jamespot-react-components';\nimport jApi, { AddCommentParams, jCommentList, UpdateCommentParams, WidgetWrapperProps } from 'jamespot-user-api';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\nimport useCommentRT from '../hooks/useCommentRT';\nimport useCommentsLikeRT from '../hooks/useCommentsLikeRT';\n\nimport { WidgetList } from './widgets/WidgetList/WidgetList';\n\nimport { useMarkdownModal } from '../hooks/useMarkdownModal';\nimport { useAppDispatch, useAppSelector } from '../redux/store';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\nimport { getTinyMCEMentionsQueries } from '../utils/tinymce';\nimport { AddReportModal, AddReportModalProps } from './comments/AddReportModal';\nimport { CommentsBlocAddCommentWidgetsWrapper } from './comments/CommentsBlocAddCommentWidgetsWrapper';\nimport { CommentsBlocCommentWidgetsWrapper } from './comments/CommentsBlocCommentWidgetsWrapper';\nimport { MarkdownModal } from './tinymce/extension/MarkdownModal';\nimport { useGifsModal } from '../hooks/useGifsModal';\nimport { GifsModal } from './tinymce/extension/GifsModal';\n\nconst JRCCommentsBloc = commonComponentsRegistry.getLazyComponent('JRCCommentsBloc');\n\nexport type CommentsBlocProps = {\n articleId: number;\n articleUri: string;\n variant?: 'modal' | 'inline';\n canComment: boolean;\n commentType?: 'comment' | 'commentResponse';\n socialQuestion?: {\n isResolved: boolean;\n responseId?: number;\n canSelectResponse: boolean;\n };\n};\n\nconst CommentsBlocWrapper = styled.div`\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n width: 100%;\n margin-top: 10px;\n`;\n\nexport const CommentsBloc = ({\n articleId,\n variant = 'inline',\n canComment,\n commentType = 'comment',\n socialQuestion,\n articleUri,\n}: CommentsBlocProps) => {\n const intl = useIntl();\n const theme = useTheme();\n const dispatch = useAppDispatch();\n\n const [token, setToken] = useState<string>();\n const [loading, setLoading] = useState(false);\n const [widgets, setWidgets] = useState<WidgetWrapperProps[]>([]);\n\n const [tokenLoading, setTokenLoading] = useState(false);\n\n const currentUser = useAppSelector(UserCurrent.selectors.get);\n const widgetIds = useAppSelector(Widget.selectors.selectWidgets);\n const tinyMCECommonOptions = useAppSelector(TinyMCE.selectors.selectTinyMCECommonOptions);\n const tinyMCEExtendedOptions = useAppSelector(TinyMCE.selectors.selectTinyMCEExtendedOptions);\n const models = useAppSelector(Model.selectors.selectAll);\n const platformConfig = useAppSelector(Platform.selectors.selectPlatformConfig);\n const commentsList = useAppSelector((state) => Comment.selectors.commentList(state, articleId));\n const driveHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'DriveHook'));\n const fileBank = useAppSelector((state) => Application.selectors.selectById(state, 'FileBankHook'));\n const widgetHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'WidgetHook'));\n const [socialQuestionOptions, setSocialQuestionOptions] = useState(socialQuestion);\n const [reportProps, setReportProps] = useState<Omit<AddReportModalProps, 'onClose'> | null>(null);\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n const {\n open: gifsModalOpen,\n close: closeGifsModal,\n onSelect: onSelectGif,\n ext: extGifs,\n isActive: isGifsActive,\n } = useGifsModal();\n\n useCommentRT(articleId);\n\n useCommentsLikeRT(\n commentsList.map((c) => c.id),\n articleId,\n );\n\n const onError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const onCommentUpdate = async (args: UpdateCommentParams) => {\n const commentToUpdate: jCommentList | undefined = commentsList.find((item) => item.id === args.idComment);\n if (!commentToUpdate) return;\n return jApi.article\n .updateComment({\n idComment: args.idComment,\n description: args.description ?? commentToUpdate.description ?? undefined,\n token: args.token,\n widgets: args.widgets,\n })\n .then(() => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n fetchToken();\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n };\n\n const onCommentDelete = async (idComment: number) => {\n dispatch(Comment.actions.deleteComment({ idComment, idArticle: articleId }));\n };\n\n const onWidgetUpdate = () => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n fetchToken();\n };\n\n const fetchToken = useCallback(() => {\n if (!token && !tokenLoading) {\n setTokenLoading(true);\n jApi.network\n .token()\n .then((res) => {\n setToken(res.result);\n setTokenLoading(false);\n\n // set comment token to our widget slice to be able to upload image inside our widgets\n dispatch(Widget.slice.actions.setToken({ token: res.result }));\n })\n .catch((e) => {\n onError(e.errorMsg);\n });\n }\n }, [onError, token, tokenLoading, dispatch]);\n\n const onComment = useCallback(\n async (params: Pick<AddCommentParams, 'content' | 'alertAuthor' | 'sendAlert'>) => {\n if (token) {\n setLoading(true);\n const finalWidget: WidgetWrapperProps[] = Object.keys(widgetIds)\n .map((id) => {\n if (widgets?.some((w) => w.widget.uniqid === id)) {\n return widgetIds[id];\n }\n return null;\n })\n .filter((w): w is WidgetWrapperProps => w !== null);\n\n try {\n // TODO : passer par le store pour avoir une réactivité directe après ajout (confirmée ensuite par retour RT)\n // -> état intermédiaire PENDING à gérer.\n await jApi.article\n .addComment({\n ...params,\n widgets: finalWidget,\n token,\n idArticle: articleId,\n type: commentType,\n })\n .then(() => {\n setWidgets([]);\n });\n fetchToken();\n } catch (e: any) {\n onError(e.errorMsg);\n throw e;\n } finally {\n setLoading(false);\n }\n }\n },\n [articleId, commentType, fetchToken, onError, token, widgetIds, widgets],\n );\n\n useEffect(() => {\n fetchToken();\n }, [fetchToken]);\n\n useEffect(() => {\n dispatch(Comment.actions.fetchComments({ idArticle: articleId }));\n }, [articleId, dispatch]);\n\n useEffect(() => {\n if (!commentsList) {\n return;\n }\n commentsList.forEach((comment) => {\n comment._widgets?.forEach((widget) => {\n dispatch(Widget.slice.actions.registerWidgetObject({ uniqid: widget.widget.uniqid, object: comment }));\n dispatch(\n Widget.slice.actions.registerWidgetObjectRights({\n uniqid: widget.widget.uniqid,\n rights: comment._right,\n }),\n );\n });\n });\n }, [commentsList, dispatch]);\n\n return (\n <>\n {tinyMCECommonOptions && tinyMCEExtendedOptions && (\n <>\n <CommentsBlocWrapper>\n <JRCCommentsBloc\n canComment={canComment}\n loading={loading}\n token={token}\n comments={commentsList}\n onComment={onComment}\n onCommentUpdate={onCommentUpdate}\n onCommentDelete={onCommentDelete}\n isWidgetActive={!!(widgetHook?.isActive && widgetHook?.autorize?.includes('comment'))}\n canCreateWidget={\n !!(\n widgetHook?.isActive &&\n widgetHook?.create &&\n widgetHook?.autorize?.includes('comment')\n )\n }\n widgetListComponent={\n <WidgetList\n mode={'comment'}\n namespace={'comment'}\n onChange={(widget) => {\n setWidgets([widget]); // COMMENT DO NOT SUPPORT MULTI WIDGET\n dispatch(\n Widget.slice.actions.registerWidget({\n uniqid: widget.widget.uniqid,\n widget: widget,\n context: 'comment',\n }),\n );\n setToken(undefined);\n fetchToken();\n }}\n view={'edit'}\n />\n }\n newWidgetsWrapperComponent={<CommentsBlocAddCommentWidgetsWrapper widgets={widgets} />}\n existingWidgetsWrapperComponent={(comment, widgets, mode, inplace = true) => (\n <CommentsBlocCommentWidgetsWrapper\n comment={comment}\n widgets={widgets}\n mode={mode}\n inplace={inplace}\n handleWidgetUpdate={onWidgetUpdate}\n handleWidgetRemove={fetchToken}\n />\n )}\n currentUser={currentUser}\n tinyMCEConfig={{\n commonOptions: {\n ...tinyMCECommonOptions,\n toolbar: tinyMCEExtendedOptions.commentsToolbar,\n },\n mentionsQueries: getTinyMCEMentionsQueries(models, theme, onError),\n }}\n onError={onError}\n highlightFields={platformConfig.userHighlightFields}\n userAccountStatus={platformConfig.userAccountStatus}\n userModel={models.find((m) => m.type === 'user')}\n onGetHashError={(message?: string) =>\n dispatch(\n Toast.actions.error({\n label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }),\n }),\n )\n }\n activeDrives={\n [\n ...(fileBank && driveHook ? ['fileBank'] : []),\n ...Hook.utils.buildDrivesArrayFromObject(driveHook?.drives),\n ] as DriveOrFilebank[]\n }\n variant={variant}\n handlers={{\n drive: jApi.drive,\n filebank: jApi.filebank,\n file: jApi.file,\n fileIntegrity: jApi.fileIntegrity,\n user: jApi.user,\n global: jApi.global,\n questionAnswer: jApi.questionAnswer,\n }}\n socialQuestion={\n socialQuestionOptions\n ? {\n ...socialQuestionOptions,\n onSelectResponse: (responseId: number) => {\n setSocialQuestionOptions({\n ...socialQuestionOptions,\n responseId,\n isResolved: true,\n });\n },\n onUnselectResponse: () => {\n setSocialQuestionOptions({\n ...socialQuestionOptions,\n responseId: undefined,\n isResolved: false,\n });\n },\n }\n : undefined\n }\n articleId={articleId}\n additionalExtensions={[extMarkdown, extGifs]}\n onReport={(commentUri) => setReportProps({ articleId, commentUri, articleUri })}\n />\n </CommentsBlocWrapper>\n </>\n )}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n {reportProps && <AddReportModal onClose={() => setReportProps(null)} {...reportProps} />}\n {isGifsActive && <GifsModal open={gifsModalOpen} close={closeGifsModal} onSelect={onSelectGif} />}\n </>\n );\n};\n","import { Application } from 'jamespot-front-business';\n\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\n\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppSelector } from '../../redux/store';\n\nconst AppsDropdownItem = styled.li`\n list-style: none;\n`;\n\nconst AppsDropdownItemLink = styled.a`\n display: flex;\n align-items: center;\n gap: ${({ theme }) => theme.space.sm}px;\n text-decoration: none;\n color: ${({ theme }) => theme.font.color};\n padding: ${({ theme }) => theme.space.sm}px ${({ theme }) => theme.space.md}px ${({ theme }) => theme.space.sm}px\n ${({ theme }) => theme.space.xs}px;\n border-radius: ${({ theme }) => theme.size.sm}px;\n\n &:hover {\n text-decoration: none;\n background-color: ${({ theme }) => theme.color.grey1};\n color: ${({ theme }) => theme.font.color};\n }\n`;\n\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\nconst FlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\nconst DropDown = commonComponentsRegistry.getLazyComponent('DropDown');\n\nexport const CalendarHeader = () => {\n const theme = useTheme();\n const intl = useIntl();\n const animatedMeeting = useAppSelector((state) => Application.selectors.selectById(state, 'AnimatedMeetingHook'));\n const calendarApp = useAppSelector((state) => Application.selectors.selectById(state, 'calendar'));\n const surveyDate = useAppSelector((state) => Application.selectors.selectById(state, 'SurveyDateHook'));\n\n if (!calendarApp) {\n return null;\n }\n\n return (\n <FlexBox y={'center'}>\n <Icon name={'icon-' + calendarApp.icon} variant=\"circle\" color={calendarApp.color} size={40} />\n <Typography variant=\"h1\" size=\"xl\" weight=\"medium\">\n {calendarApp.label}\n </Typography>\n {(surveyDate || animatedMeeting) && (\n <>\n <Typography size=\"xl\" color={'grey4'}>\n /\n </Typography>\n <DropDown\n withBorder\n borderColor={'grey3'}\n trigger={\n <FlexBox y={'center'} gap={theme.space.xs}>\n <Typography size=\"xl\" color={'grey4'}>\n {intl.formatMessage({ id: 'CALENDAR_Agenda' })}\n </Typography>\n <Icon name={'icon-chevron-down'} color={'grey4'} size={16} />\n </FlexBox>\n }\n dropdown={() => (\n <FlexBox direction={'column'} gap={theme.space.sm} as={'ul'}>\n {surveyDate && (\n <AppsDropdownItem>\n <AppsDropdownItemLink href={surveyDate.url}>\n <Icon\n name={'icon-' + surveyDate.icon}\n size={25}\n variant={'circle'}\n color={surveyDate.color}\n />\n <Typography size=\"l\">{surveyDate.label}</Typography>\n </AppsDropdownItemLink>\n </AppsDropdownItem>\n )}\n {animatedMeeting && (\n <AppsDropdownItem>\n <AppsDropdownItemLink href={animatedMeeting.url}>\n <Icon\n name={'icon-' + animatedMeeting.icon}\n size={25}\n variant={'circle'}\n color={animatedMeeting.color}\n />\n <Typography size=\"l\">{animatedMeeting.label}</Typography>\n </AppsDropdownItemLink>\n </AppsDropdownItem>\n )}\n </FlexBox>\n )}\n />\n </>\n )}\n </FlexBox>\n );\n};\n","import { Application, Calendar, Hook } from 'jamespot-front-business';\nimport { CalendarApi, CalendarView } from 'jamespot-react-components';\nimport { Suspense, useMemo } from 'react';\nimport { FormattedMessage, useIntl } from 'react-intl';\nimport styled from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\n\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\nconst FlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\nconst ButtonDropdown = commonComponentsRegistry.getLazyComponent('ButtonDropdown');\nconst Dropdown = commonComponentsRegistry.getLazyComponent('DropDown');\nconst IconButton = commonComponentsRegistry.getLazyComponent('IconButton');\nconst InputSelectRaw = commonComponentsRegistry.getLazyComponent('InputSelectRaw');\nconst InputCheckboxRaw = commonComponentsRegistry.getLazyComponent('InputCheckboxRaw');\nconst StyledHref = commonComponentsRegistry.getLazyComponent('StyledHref');\n\nconst Label = styled(Typography)`\n text-transform: capitalize;\n margin-right: ${({ theme }) => theme.space.md}px;\n`;\n\nconst InputWrapper = styled.div`\n max-width: 200px;\n display: flex;\n align-items: center;\n`;\n\nconst DropdownContainer = styled.div`\n padding: 0 ${({ theme }) => theme.space.md}px;\n`;\n\ntype Filter = ('socialEvent' | 'meeting' | 'animatedMeeting' | 'boardCard' | 'recurringEvent')[];\ntype OptionView = {\n label: string;\n value: CalendarView;\n};\n\nexport const CalendarToolbar = ({\n label,\n view,\n viewsOptions,\n calendarApi,\n isLoading,\n navigateWithQuery,\n setView,\n setCreationType,\n setExportModalOpen,\n}: {\n label?: string;\n view: OptionView;\n viewsOptions: { label: string; value: CalendarView }[];\n calendarApi?: CalendarApi;\n isLoading: boolean;\n navigateWithQuery: (queries: { types?: Filter; view?: CalendarView }) => void;\n setView: (view: any) => void;\n setCreationType: (type: 'socialEvent' | 'meeting' | 'animatedMeeting' | null) => void;\n setExportModalOpen: (value: boolean) => void;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const { types } = useAppSelector(Calendar.selectors.selectCalendarEvents);\n const animatedMeeting = useAppSelector((state) => Application.selectors.selectById(state, 'AnimatedMeetingHook'));\n const animatedMeetingHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'AnimatedMeetingHook'));\n const meeting = useAppSelector((state) => Application.selectors.selectById(state, 'MeetingHook'));\n const boardCard = useAppSelector((state) => Application.selectors.selectById(state, 'BoardcardHook'));\n\n const createCalendarEventOptions = useMemo(\n () => [\n {\n label: intl.formatMessage({ id: 'CALENDAR_Create_SocialEvent' }),\n onClick: () => {\n setCreationType('socialEvent');\n },\n },\n ...(meeting\n ? [\n {\n label: intl.formatMessage({ id: 'CALENDAR_Create_Meeting' }),\n onClick: () => {\n setCreationType('meeting');\n },\n },\n ]\n : []),\n ...(animatedMeeting && animatedMeetingHook?.create\n ? [\n {\n label: intl.formatMessage({ id: 'CALENDAR_Create_AnimatedMeeting' }),\n href: '/?action=spotlight-edit&type=animatedMeeting',\n },\n ]\n : []),\n ],\n [animatedMeeting, animatedMeetingHook?.create, intl, meeting, setCreationType],\n );\n const viewOptionEntries = useMemo(\n () => [\n {\n label: <FormattedMessage id=\"CALENDAR_SocialEvents\" />,\n value: 'socialEvent',\n },\n ...(meeting\n ? [\n {\n label: <FormattedMessage id=\"CALENDAR_Meetings\" />,\n value: 'meeting',\n },\n ]\n : []),\n ...(animatedMeeting\n ? [\n {\n label: <FormattedMessage id=\"CALENDAR_AnimatedMeetings\" />,\n value: 'animatedMeeting',\n },\n ]\n : []),\n ...(boardCard\n ? [\n {\n label: <FormattedMessage id=\"CALENDAR_BoardCards\" />,\n value: 'boardCard',\n },\n ]\n : []),\n ],\n [animatedMeeting, boardCard, meeting],\n );\n\n return (\n <FlexBox y={'center'}>\n <Label size={'l'} weight={'medium'}>\n {label}\n </Label>\n <FlexBox>\n <IconButton icon={'icon-chevron-left'} onClick={() => calendarApi?.prev()} color={'grey5'} />\n <IconButton icon={'icon-chevron-right'} onClick={() => calendarApi?.next()} color={'grey5'} />\n </FlexBox>\n <IconButton\n icon={'icon-calendar'}\n onClick={() => calendarApi?.today()}\n tooltip={{ description: 'CALENDAR_Today', position: 'bottom' }}\n color={'grey5'}\n />\n <InputWrapper>\n <InputSelectRaw<{ selectView: OptionView }>\n onChange={setView}\n value={view}\n name={'selectView'}\n options={viewsOptions}\n getLabel={(option) => option.label}\n getValue={(option) => option.value}\n required\n minWidth={false}\n loading={isLoading}\n noMargin\n />\n </InputWrapper>\n <ButtonDropdown\n noMargin\n color={'primary'}\n icon={'icon-plus'}\n label={intl.formatMessage({ id: 'GLOBAL_Add' })}\n options={createCalendarEventOptions}\n dataCy={'calendar-create-dropdown'}\n />\n <Dropdown\n trigger={\n <IconButton\n aria-label={intl.formatMessage({ id: 'GLOBAL_Filter' })}\n colorVariant={'light'}\n icon={'icon-filter'}\n badgeNumber={types.length}\n />\n }\n dropdown={() => (\n <Suspense fallback={<></>}>\n <DropdownContainer>\n <FlexBox direction={'column'}>\n <Typography weight={'medium'} color={'primary'}>\n {intl.formatMessage({ id: 'GLOBAL_Filter' })}\n </Typography>\n <InputCheckboxRaw<Filter>\n labelPosition={'before'}\n checkboxMode={'checkbox'}\n direction={'column'}\n onChange={(f: Filter) => {\n dispatch(Calendar.actions.setTypes(f));\n navigateWithQuery({ types: f });\n }}\n options={viewOptionEntries}\n value={types}\n name={'0'}\n />\n <StyledHref\n onClick={() => {\n dispatch(Calendar.actions.setTypes([]));\n navigateWithQuery({ types: [] });\n }}\n as={'button'}\n color={'cancel'}\n disabled={types.length === 0}>\n {intl.formatMessage({ id: 'GLOBAL_Reset' })}\n </StyledHref>\n </FlexBox>\n </DropdownContainer>\n </Suspense>\n )}\n withBorder\n align={'right'}\n />\n <ButtonDropdown\n noMargin\n small\n smallOpenDirection={'left'}\n color={'primary'}\n variant={'outlined'}\n icon={'icon-ellipsis-v'}\n label={intl.formatMessage({ id: 'GLOBAL_Options' })}\n options={[\n {\n label: intl.formatMessage({ id: 'EVENT_Export_Calendar_ICalendar_Format' }),\n onClick: () => setExportModalOpen(true),\n },\n ]}\n />\n </FlexBox>\n );\n};\n","import { Recurrence } from 'jamespot-user-api';\r\n\r\ntype RecurrencePreset = {\r\n label: string;\r\n value: Recurrence;\r\n};\r\n\r\nexport const recurrencePresets: Array<RecurrencePreset> = [\r\n {\r\n label: 'CALENDAR_EventRecurrence_None',\r\n value: {},\r\n },\r\n {\r\n label: 'CALENDAR_EventRecurrence_Daily',\r\n value: {\r\n freq: 'DAILY',\r\n },\r\n },\r\n {\r\n label: 'CALENDAR_EventRecurrence_OpenDays',\r\n value: {\r\n freq: 'WEEKLY',\r\n byDay: ['MO', 'TU', 'WE', 'TH', 'FR'],\r\n },\r\n },\r\n {\r\n label: 'CALENDAR_EventRecurrence_Weekly',\r\n value: {\r\n freq: 'WEEKLY',\r\n },\r\n },\r\n {\r\n label: 'CALENDAR_EventRecurrence_Monthly',\r\n value: {\r\n freq: 'MONTHLY',\r\n },\r\n },\r\n {\r\n label: 'CALENDAR_EventRecurrence_Yearly',\r\n value: {\r\n freq: 'YEARLY',\r\n },\r\n },\r\n];\r\n\r\nexport const isPreset = (a: Recurrence, b: Recurrence) => {\r\n if (a === null && b === null) return true;\r\n return (\r\n a?.freq === b?.freq &&\r\n !a?.byDay?.some((d) => !b?.byDay?.includes(d)) &&\r\n !b?.byDay?.some((d) => !a?.byDay?.includes(d))\r\n );\r\n};\r\n\r\nexport const hasPreset = (recurrence?: Recurrence | null) => {\r\n return recurrence && Object.entries(recurrence).length > 0;\r\n};\r\n\r\nexport const getRecurrencePresetLabel = (recurrence: Recurrence): (typeof recurrencePresets)[number]['label'] => {\r\n if (!recurrence) return recurrencePresets[0].label;\r\n const preset = recurrencePresets.find((p) => isPreset(p.value, recurrence));\r\n return preset?.label ?? recurrencePresets[0].label;\r\n};\r\n","import { JTinyMCEExtensionsBuilders } from 'jamespot-react-components';\nimport { JIACapabilities } from 'jamespot-user-api';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\n\nexport type JiaTextEnhanceQuery = {\n resolve: (value: string | PromiseLike<string>) => void;\n reject: (reason?: any) => void;\n capability: JIACapabilities;\n text: string;\n};\n\nexport const useAI = () => {\n const [query, setQuery] = useState<JiaTextEnhanceQuery | undefined>();\n const intl = useIntl();\n\n const isActive = useMemo(() => {\n return (\n J.hooks?.MagicWandHook?.isActive &&\n J.hooks?.MagicWandHook?.menuItems &&\n J.hooks.MagicWandHook.menuItems.length\n );\n }, []);\n\n const PrepareAndSetQuery = useCallback((query: JiaTextEnhanceQuery) => {\n const internalResolve = (value: string | PromiseLike<string>) => {\n query.resolve(value);\n setQuery(undefined);\n };\n const internalReject = (value: any) => {\n query.reject(value);\n setQuery(undefined);\n };\n setQuery({\n ...query,\n reject: internalReject,\n resolve: internalResolve,\n });\n }, []);\n\n const fetch = useCallback(\n (text: string, capability: JIACapabilities) => {\n return new Promise<string>((resolve, reject) => {\n PrepareAndSetQuery({\n reject,\n resolve,\n text,\n capability,\n });\n });\n },\n [PrepareAndSetQuery],\n );\n\n const AICapabilities = useMemo(() => {\n return {\n develop: (text: string) => fetch(text, 'develop'),\n summarize: (text: string) => fetch(text, 'summarize'),\n tldr: (text: string) => fetch(text, 'tldr'),\n en: (text: string) => fetch(text, 'en'),\n es: (text: string) => fetch(text, 'es'),\n formal: (text: string) => fetch(text, 'formal'),\n funny: (text: string) => fetch(text, 'funny'),\n };\n }, [fetch]);\n\n const ext = useMemo(() => JTinyMCEExtensionsBuilders.jia(AICapabilities, intl), [intl, AICapabilities]);\n\n return { query, ext, isActive } as const;\n};\n","import { Model, Toast } from 'jamespot-front-business';\nimport { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useTheme } from 'styled-components';\nimport { JRCInputTinyMCEProps } from 'jamespot-react-components';\nimport { FieldValues } from 'react-hook-form';\nimport { AIModal } from './extension/AIModal';\nimport { useMarkdownModal } from '../../hooks/useMarkdownModal';\nimport { MarkdownModal } from './extension/MarkdownModal';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { tinymceCommonOptions } from '../../initTinymce';\nimport { getTinyMCEMentionsQueries } from '../../utils/tinymce';\nimport { useAI } from '../../hooks/useAI';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { GifsModal } from './extension/GifsModal';\nimport { useGifsModal } from '../../hooks/useGifsModal';\n\nconst JRCInputTinyMCE = commonComponentsRegistry.getLazyComponent('InputTinyMCE');\n\nexport type JRCInputTinyMCEWithExtProps<T extends FieldValues> = Omit<\n JRCInputTinyMCEProps<T>,\n 'commonOptions' | 'mentionsQueries' | 'additionalExtensions'\n>;\n\nexport const JRCInputTinyMCEWithExt = <T extends FieldValues = FieldValues>(props: JRCInputTinyMCEWithExtProps<T>) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const models = useAppSelector(Model.selectors.selectAll);\n const { query, ext: extAI, isActive: isAIActive } = useAI();\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n const {\n close: closeGifsModal,\n open: gifsModalOpen,\n isActive: isGifsActive,\n onSelect,\n ext: gifsExt,\n } = useGifsModal();\n\n const extArray = useMemo(() => {\n return [\n ...(isMarkdownActive ? [extMarkdown] : []),\n ...(isAIActive ? [extAI] : []),\n ...(isGifsActive ? [gifsExt] : []),\n ];\n }, [extAI, extMarkdown, gifsExt, isAIActive, isGifsActive, isMarkdownActive]);\n\n const onMentionsQueryError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onMentionsQueryError);\n }, [models, onMentionsQueryError, theme]);\n\n const commonOptions = useMemo(() => tinymceCommonOptions, []);\n\n return (\n <>\n {commonOptions && (\n <JRCInputTinyMCE\n commonOptions={commonOptions}\n additionalExtensions={extArray}\n mentionsQueries={tinyMentionsQueries}\n {...props}\n />\n )}\n {isAIActive && <AIModal query={query} />}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n {isGifsActive && <GifsModal onSelect={onSelect} open={gifsModalOpen} close={closeGifsModal} />}\n </>\n );\n};\n","import { isAfter } from 'date-fns';\r\nimport { Hook, Model, Toast } from 'jamespot-front-business';\r\nimport { AutocompleteView, DriveOrFilebank } from 'jamespot-react-components';\r\nimport jApi, {\r\n CalendarEventWithExtensions,\r\n jFileLittle,\r\n Join,\r\n jRecurringEventView,\r\n jSocialEventView,\r\n Recurrence,\r\n RecurringEventCreation,\r\n RecurringEventUpdate,\r\n SocialEventCreation,\r\n SocialEventUpdate,\r\n} from 'jamespot-user-api';\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { UseFormReturn, useWatch } from 'react-hook-form';\r\nimport { useIntl } from 'react-intl';\r\nimport styled, { useTheme } from 'styled-components';\r\nimport { v4 as uuid } from 'uuid';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\r\nimport { DisplayFormRef } from '../../../displayer/types';\r\nimport { hasPreset, isPreset, recurrencePresets } from '../../../utils/eventRecurrence';\r\nimport { DisplayForm } from '../../../displayer/DisplayForm.component';\r\nimport { JRCInputTinyMCEWithExt } from '../../tinymce/JRCInputTinyMCEWithExt';\r\n\r\nconst InputImage = commonComponentsRegistry.getLazyComponent('InputImage');\r\nconst InputText = commonComponentsRegistry.getLazyComponent('InputText');\r\nconst InputCheckbox = commonComponentsRegistry.getLazyComponent('InputCheckbox');\r\nconst InputCheckboxRaw = commonComponentsRegistry.getLazyComponent('InputCheckboxRaw');\r\nconst InputNumber = commonComponentsRegistry.getLazyComponent('InputNumber');\r\nconst InputAudience = commonComponentsRegistry.getLazyComponent('InputAudience');\r\nconst InputFileAdvancedRaw = commonComponentsRegistry.getLazyComponent('InputFileAdvancedRaw');\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst InputColor = commonComponentsRegistry.getLazyComponent('InputColor');\r\nconst InputDateTime = commonComponentsRegistry.getLazyComponent('InputDateTime');\r\nconst InputDateTimeRaw = commonComponentsRegistry.getLazyComponent('InputDateTimeRaw');\r\nconst FlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\r\nconst InputAutocomplete = commonComponentsRegistry.getLazyComponent('InputAutocomplete');\r\nconst InputSelectRaw = commonComponentsRegistry.getLazyComponent('InputSelectRaw');\r\nconst InputSelect = commonComponentsRegistry.getLazyComponent('InputSelect');\r\nconst Message = commonComponentsRegistry.getLazyComponent('Message');\r\n\r\nexport type SocialEventFormExtraInitialValues = {\r\n eventMode: 'onSpot' | 'visio' | 'hybrid';\r\n customColors: boolean;\r\n attachments: Array<jFileLittle>;\r\n tags: Record<string, unknown>;\r\n until?: string;\r\n};\r\n\r\nexport type SocialEventOrRecurringFormProps = {\r\n form: UseFormReturn<SocialEventOrRecurringEventFormValues, null, any>;\r\n setUploadLoading: (loading: boolean) => void;\r\n event?: CalendarEventWithExtensions<\r\n jSocialEventView | jRecurringEventView,\r\n ['socialEventRecord' | 'recurringEventRecord']\r\n >;\r\n extraInitialValues?: SocialEventFormExtraInitialValues;\r\n mode: 'create' | 'update';\r\n};\r\n\r\nexport type SocialEventOrRecurringEventFormValues = Omit<\r\n Join<Join<Join<SocialEventCreation, SocialEventUpdate>, RecurringEventCreation>, RecurringEventUpdate>,\r\n 'publishTo' | 'uiObjectLink' | 'alertAuthor' | 'sendAlert' | 'type'\r\n> & {\r\n publishTo: { uri: string; title: string }[];\r\n uiObjectLink?: { uri: string; title: string; icon?: string; color?: string };\r\n image?: object;\r\n alertAuthor?: boolean;\r\n sendAlert?: boolean;\r\n recurrenceRule?: Recurrence;\r\n};\r\n\r\nconst DisplayFormWrapper = styled.div`\r\n margin-top: -${({ theme }) => theme.space.sm}px;\r\n margin-bottom: -${({ theme }) => theme.space.l}px;\r\n`;\r\n\r\nconst ShowHide = styled.div<{ $show: boolean }>`\r\n ${({ $show }) =>\r\n !$show &&\r\n `\r\n position: absolute;\r\n visibility: hidden;\r\n pointer-events: none;\r\n height: 0;\r\n overflow: hidden;\r\n opacity: 0;\r\n `}\r\n`;\r\n\r\ntype OptionVisio = {\r\n label: string;\r\n value: string;\r\n};\r\n\r\nexport const SocialEventOrRecurringEventForm = ({\r\n form,\r\n setUploadLoading,\r\n extraInitialValues,\r\n mode,\r\n}: SocialEventOrRecurringFormProps) => {\r\n const intl = useIntl();\r\n const dispatch = useAppDispatch();\r\n const theme = useTheme();\r\n const displayFormRef = useRef<DisplayFormRef>(null);\r\n const [eventModeHasChanged, setEventModeHasChanged] = useState(false);\r\n const [eventMode, setEventMode] = useState<'onSpot' | 'visio' | 'hybrid'>(\r\n extraInitialValues?.eventMode ?? 'onSpot',\r\n );\r\n const [customColors, setCustomColors] = useState(extraInitialValues?.customColors ?? false);\r\n const [prevPlace, setPrevPlace] = useState<string | null>();\r\n const [prevAddress, setPrevAddress] = useState<string | null>();\r\n const calendarHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'calendarHook'));\r\n const fileBankHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'FileBankHook'));\r\n const spotHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'SpotHook'));\r\n const businessContactHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'BusinessContactHook'));\r\n const driveHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'DriveHook'));\r\n const visioConnectHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'VisioConnectHook'));\r\n const bbbHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'BigBlueButtonHook'));\r\n const sharedContentHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'SharedContentHook'));\r\n const models = useAppSelector(Model.selectors.selectAll);\r\n const [until, setUntil] = useState<string | undefined>(extraInitialValues?.until);\r\n\r\n // For tags only\r\n displayFormRef.current?.watch((v) => {\r\n Object.keys(v).forEach((key) => {\r\n form.setValue(key as keyof SocialEventOrRecurringEventFormValues, v[key]);\r\n });\r\n });\r\n\r\n const sendAlert = useWatch({ control: form.control, name: 'sendAlert' });\r\n useEffect(() => {\r\n if (!sendAlert) {\r\n form.setValue('alertAuthor', false);\r\n }\r\n }, [form, sendAlert]);\r\n\r\n const dateStart = useWatch({ control: form.control, name: 'dateStart' });\r\n const dateEnd = useWatch({ control: form.control, name: 'dateEnd' });\r\n const isDateStartAfterDateEnd = useMemo(() => {\r\n return dateStart && dateEnd && isAfter(new Date(dateStart), new Date(dateEnd));\r\n }, [dateStart, dateEnd]);\r\n\r\n const eventModeOptions = useMemo(\r\n () => [\r\n { label: intl.formatMessage({ id: 'CALENDAR_On_Spot' }), value: 'onSpot' },\r\n { label: intl.formatMessage({ id: 'CALENDAR_Visio' }), value: 'visio' },\r\n { label: intl.formatMessage({ id: 'CALENDAR_Hybrid' }), value: 'hybrid' },\r\n ],\r\n [intl],\r\n );\r\n\r\n const audienceViews = useMemo<AutocompleteView[]>(() => {\r\n const res: Array<AutocompleteView> = [];\r\n\r\n if (spotHook && spotHook.isActive && spotHook.hasLicense) {\r\n res.push('group');\r\n }\r\n\r\n res.push('user');\r\n\r\n if (fileBankHook && fileBankHook.isActive) {\r\n res.push('folder');\r\n }\r\n\r\n if (businessContactHook && businessContactHook.isActive) {\r\n res.push('businessContact');\r\n }\r\n\r\n return res;\r\n }, [businessContactHook, fileBankHook, spotHook]);\r\n\r\n const onError = useCallback(\r\n (message?: string) =>\r\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) })),\r\n [dispatch, intl],\r\n );\r\n\r\n const token = useWatch({ control: form.control, name: 'token' });\r\n\r\n const deleteFile = useCallback(\r\n async (id: number) => {\r\n if (!token) return;\r\n try {\r\n await jApi.file.deleteFile(id, 'attachment', token);\r\n } catch (e: any) {\r\n if (onError) onError(e);\r\n }\r\n },\r\n [onError, token],\r\n );\r\n\r\n const autocompleteArticles = (input: string) =>\r\n jApi.article\r\n .list({ query: input, filters: [{ name: 'type', value: 'internalDraft', operator: '<>' }] })\r\n .then((res) =>\r\n res?.result?.data.map((a) => {\r\n const model = models.find((m) => m.type === a.type);\r\n return { uri: a.uri, title: a.title, icon: model?.icon, color: model?.color };\r\n }),\r\n );\r\n\r\n const visioOptions = useMemo(\r\n () => [\r\n {\r\n value: 'jitsi',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_Jitsi' }),\r\n },\r\n ...(visioConnectHook && visioConnectHook.isActive && visioConnectHook.hasLicense\r\n ? [\r\n {\r\n value: 'visioConnect',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_VisioConnect' }),\r\n },\r\n ]\r\n : []),\r\n ...(bbbHook && bbbHook.isActive && bbbHook.hasLicense\r\n ? [\r\n {\r\n value: 'bbb',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_BBB' }),\r\n },\r\n ...(sharedContentHook && sharedContentHook.isActive\r\n ? [\r\n {\r\n value: 'bbb-public',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_BBB_Public' }),\r\n },\r\n ]\r\n : []),\r\n ]\r\n : []),\r\n {\r\n value: 'other',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_Other' }),\r\n },\r\n ],\r\n [bbbHook, intl, sharedContentHook, visioConnectHook],\r\n );\r\n const [visioOption, setVisioOption] = useState<OptionVisio>(visioOptions[visioOptions.length - 1]);\r\n\r\n const updateVisioOption = useCallback(\r\n (option: OptionVisio) => {\r\n setVisioOption(option);\r\n switch (option.value) {\r\n case 'jitsi':\r\n form.setValue('place', 'jitsi:' + J.urlBase + '?action=jitsiRedirect&id=' + uuid());\r\n break;\r\n case 'visioConnect':\r\n form.setValue('place', 'visioConnect');\r\n break;\r\n case 'other':\r\n form.setValue('place', '');\r\n break;\r\n case 'bbb':\r\n form.setValue('place', 'bbb');\r\n break;\r\n case 'bbb-public':\r\n form.setValue('place', 'bbb-public');\r\n break;\r\n }\r\n },\r\n [form],\r\n );\r\n\r\n const place = useWatch({ control: form.control, name: 'place' });\r\n const address = useWatch({ control: form.control, name: 'address' });\r\n\r\n const updateEventMode = useCallback(\r\n (v: 'onSpot' | 'visio' | 'hybrid') =>\r\n setEventMode((prev) => {\r\n setEventModeHasChanged(true);\r\n if (prev === 'visio' || prev === 'hybrid') {\r\n setPrevPlace(place);\r\n }\r\n if (prev === 'onSpot' || prev === 'hybrid') {\r\n setPrevAddress(address);\r\n }\r\n if (v === 'onSpot') {\r\n form.setValue('place', null);\r\n if (prev !== 'hybrid') {\r\n form.setValue('address', prevAddress);\r\n }\r\n } else if (v === 'visio') {\r\n form.setValue('address', null);\r\n if (prev !== 'hybrid') {\r\n form.setValue('place', prevPlace);\r\n }\r\n } else if (v === 'hybrid') {\r\n if (prev !== 'onSpot') {\r\n form.setValue('address', prevAddress);\r\n }\r\n if (prev !== 'visio') {\r\n form.setValue('place', prevPlace);\r\n }\r\n }\r\n return v;\r\n }),\r\n [address, form, place, prevAddress, prevPlace],\r\n );\r\n\r\n const recurrence = useWatch({ control: form.control, name: 'recurrenceRule' });\r\n useEffect(() => {\r\n if (recurrence && hasPreset(recurrence) && recurrence.until !== until) {\r\n form.setValue('recurrenceRule', { ...recurrence, until: until || undefined });\r\n }\r\n }, [form, recurrence, until]);\r\n const hasRecurrence = useMemo(() => hasPreset(recurrence), [recurrence]);\r\n\r\n const allDay = useWatch({ control: form.control, name: 'allDay' });\r\n const textColor = useWatch({ control: form.control, name: 'textColor' });\r\n const bgColor = useWatch({ control: form.control, name: 'bgColor' });\r\n const socialEventUseCeiling = useWatch({ control: form.control, name: 'socialEventUseCeiling' });\r\n\r\n return (\r\n <FlexBox direction={'column'} gap={theme.space.l}>\r\n <ShowHide $show={mode === 'update' && !!hasRecurrence}>\r\n <Message variant={'warning'} message={intl.formatMessage({ id: 'CALENDAR_Recurrent_Event_Warning' })} />\r\n </ShowHide>\r\n <InputImage\r\n margin={'0'}\r\n name={'image'}\r\n dzDimensions={{ width: '100%', height: 275 }}\r\n control={form.control}\r\n token={token}\r\n aspectRatio={2}\r\n allowCustomRatio\r\n defaultImages={{\r\n imgs: [],\r\n columnCount: 1,\r\n }}\r\n />\r\n <InputText\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Title' })}\r\n name={'title'}\r\n control={form.control}\r\n rules={{ required: true }}\r\n />\r\n <FlexBox direction={'column'} gap={theme.space.sm}>\r\n {isDateStartAfterDateEnd && (\r\n <Message\r\n message={intl.formatMessage({ id: 'CALENDAR_Date_Start_After_Date_End' })}\r\n variant={'error'}\r\n />\r\n )}\r\n <FlexBox gap={theme.space.md} y={'center'}>\r\n <InputDateTime\r\n mode={allDay ? 'date' : 'datetime'}\r\n margin={'0'}\r\n width={'100%'}\r\n label={'CALENDAR_DateTime_Start'}\r\n control={form.control}\r\n name={'dateStart'}\r\n rules={{ required: true }}\r\n openDirection={'left'}\r\n />\r\n <InputDateTime\r\n mode={allDay ? 'date' : 'datetime'}\r\n margin={'0'}\r\n width={'100%'}\r\n label={'CALENDAR_DateTime_End'}\r\n control={form.control}\r\n name={'dateEnd'}\r\n rules={{ required: true }}\r\n />\r\n </FlexBox>\r\n <InputCheckbox\r\n control={form.control}\r\n margin={'0'}\r\n name={'allDay'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_All_Day' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n </FlexBox>\r\n {mode === 'create' && calendarHook?.recurringEventsEnabled && (\r\n <InputSelect\r\n noMargin\r\n label={intl.formatMessage({ id: 'CALENDAR_Event_Recurrence' })}\r\n name={'recurrenceRule'}\r\n control={form.control}\r\n options={recurrencePresets}\r\n rules={{ required: true }}\r\n isCurrentOption={isPreset}\r\n />\r\n )}\r\n <ShowHide $show={!!hasRecurrence}>\r\n <FlexBox direction={'column'}>\r\n <Typography>{intl.formatMessage({ id: 'CALENDAR_Event_Recurrence_UntilField' })}</Typography>\r\n <InputDateTimeRaw\r\n mode={'date'}\r\n width={'100%'}\r\n value={until}\r\n onChange={(v) => setUntil(v || undefined)}\r\n />\r\n </FlexBox>\r\n </ShowHide>\r\n <FlexBox direction={'column'} gap={theme.space.md}>\r\n {mode === 'update' && eventModeHasChanged && !recurrence && (\r\n <Message variant={'info'} message={intl.formatMessage({ id: 'Event_Warning_Message' })} />\r\n )}\r\n <ShowHide $show={!hasRecurrence}>\r\n <InputCheckboxRaw\r\n margin={'0'}\r\n checkboxMode={'radio'}\r\n direction={'row'}\r\n value={eventMode as any}\r\n name=\"value\"\r\n onChange={updateEventMode}\r\n options={eventModeOptions}\r\n />\r\n </ShowHide>\r\n <ShowHide $show={eventMode === 'onSpot' || eventMode === 'hybrid' || !!hasRecurrence}>\r\n <InputText\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'CALENDAR_Event_Address' })}\r\n name={'address'}\r\n control={form.control}\r\n />\r\n </ShowHide>\r\n <ShowHide $show={(eventMode === 'visio' || eventMode === 'hybrid') && !hasRecurrence}>\r\n <FlexBox direction={'column'}>\r\n <Typography>{intl.formatMessage({ id: 'CALENDAR_Event_Place' })}</Typography>\r\n <FlexBox gap={theme.space.md} y={'flex-end'}>\r\n <FlexBox flex={'1'} margin={'0 0 4px 0'}>\r\n <InputSelectRaw<{ visio: OptionVisio }>\r\n noMargin\r\n name={'visio'}\r\n onChange={updateVisioOption}\r\n options={visioOptions}\r\n value={visioOption}\r\n required\r\n getLabel={(o) => o.label}\r\n getValue={(o) => o.value}\r\n />\r\n </FlexBox>\r\n {(visioOption.value === 'other' || visioOption.value === 'jitsi') && (\r\n <FlexBox flex={'2'}>\r\n <InputText\r\n width={'100%'}\r\n margin={'0'}\r\n name={'place'}\r\n control={form.control}\r\n disabled={visioOption.value === 'jitsi'}\r\n />\r\n </FlexBox>\r\n )}\r\n </FlexBox>\r\n </FlexBox>\r\n </ShowHide>\r\n <ShowHide $show={!!calendarHook?.externalGestion && !hasRecurrence}>\r\n <InputText\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'CALENDAR_External_Link' })}\r\n description={intl.formatMessage({ id: 'CALENDAR_External_Link_Description' })}\r\n name={'urlGestion'}\r\n control={form.control}\r\n />\r\n </ShowHide>\r\n <JRCInputTinyMCEWithExt\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Description' })}\r\n control={form.control}\r\n name={'description'}\r\n handlers={{\r\n file: jApi.file,\r\n }}\r\n />\r\n <DisplayFormWrapper>\r\n <DisplayForm\r\n type={'socialEvent'}\r\n fields={[{ includes: 'tags' }]}\r\n ref={displayFormRef}\r\n defaultValues={extraInitialValues?.tags}\r\n />\r\n </DisplayFormWrapper>\r\n <ShowHide $show={!hasRecurrence}>\r\n <InputAutocomplete\r\n noMargin\r\n control={form.control}\r\n name=\"uiObjectLink\"\r\n label={intl.formatMessage({ id: 'GLOBAL_Object_Link' })}\r\n searchable\r\n asyncPromise={autocompleteArticles}\r\n />\r\n </ShowHide>\r\n <FlexBox direction={'column'} gap={theme.space.md}>\r\n <InputCheckboxRaw\r\n margin={'0'}\r\n onChange={(v) => {\r\n if (v) {\r\n form.setValue('textColor', theme.color.grey5);\r\n form.setValue('bgColor', theme.color.grey1);\r\n } else {\r\n form.setValue('textColor', null);\r\n form.setValue('bgColor', null);\r\n }\r\n setCustomColors(v);\r\n }}\r\n value={customColors as any}\r\n name=\"\"\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_Custom_Colors' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n <ShowHide $show={customColors}>\r\n {/* FIXME */}\r\n {/* Custom color is overridden for unattended events and subscription is unavailable\r\n for recurring events => no text color parameter for recurring events */}\r\n <ShowHide $show={!hasRecurrence}>\r\n <InputColor\r\n margin={'0'}\r\n control={form.control}\r\n name={'textColor'}\r\n label={'CALENDAR_Text_Color'}\r\n initialValue={textColor ?? theme.color.grey5}\r\n />\r\n </ShowHide>\r\n <InputColor\r\n margin={'0'}\r\n control={form.control}\r\n name={'bgColor'}\r\n label={'CALENDAR_Background_Color'}\r\n initialValue={bgColor ?? theme.color.grey1}\r\n />\r\n </ShowHide>\r\n </FlexBox>\r\n <ShowHide $show={!hasRecurrence}>\r\n <FlexBox direction={'column'} gap={theme.space.sm}>\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'socialEventUseCeiling'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_Subscribers_Limit' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n <ShowHide $show={!!socialEventUseCeiling}>\r\n <InputNumber margin={'0'} control={form.control} name={'socialEventCeiling'} />\r\n </ShowHide>\r\n </FlexBox>\r\n </ShowHide>\r\n <InputAudience\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n control={form.control}\r\n name={'publishTo'}\r\n searchable\r\n multiple\r\n views={{\r\n activeViews: audienceViews,\r\n handlers: {\r\n user: jApi.user,\r\n filebank: jApi.filebank,\r\n group: jApi.group,\r\n },\r\n onError,\r\n }}\r\n />\r\n <Typography>{intl.formatMessage({ id: 'GLOBAL_Attachments' })}</Typography>\r\n <InputFileAdvancedRaw\r\n token={token}\r\n multiple\r\n name={'attachment'}\r\n deleteFile={deleteFile}\r\n activeDrives={\r\n [\r\n ...(fileBankHook && driveHook ? ['fileBank'] : []),\r\n ...Hook.utils.buildDrivesArrayFromObject(driveHook?.drives),\r\n ] as DriveOrFilebank[]\r\n }\r\n handlers={{\r\n file: jApi.file,\r\n filebank: jApi.filebank,\r\n drive: jApi.drive,\r\n }}\r\n dispatchOnError={onError}\r\n onUploadStart={() => setUploadLoading(true)}\r\n onUploadSuccess={() => setUploadLoading(false)}\r\n existingFiles={extraInitialValues?.attachments ?? []}\r\n />\r\n <Typography>{intl.formatMessage({ id: 'CALENDAR_More_Options' })}</Typography>\r\n <div>\r\n <ShowHide $show={!hasRecurrence}>\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'noGestion'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n inverted // ⚠️\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_Activate_Subscription' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n </ShowHide>\r\n <ShowHide $show={!hasRecurrence}>\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'hideFromCalendar'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n inverted // ⚠️\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_Calendar_Display' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n </ShowHide>\r\n <ShowHide $show={!hasRecurrence}>\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'useQrcode'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_Use_QR_Code' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n </ShowHide>\r\n {mode === 'create' && (\r\n <>\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'sendAlert'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'GLOBAL_Send_Alert' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'alertAuthor'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'GLOBAL_Alert_Author' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n disabled={!sendAlert}\r\n />\r\n </>\r\n )}\r\n </div>\r\n </FlexBox>\r\n </FlexBox>\r\n );\r\n};\r\n","import { useIntl } from 'react-intl';\r\nimport { UseFormReturn } from 'react-hook-form';\r\nimport { FormEvent } from 'react';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\n\r\nexport type UpdateCalendarEventModalProps = {\r\n closeHandler: () => void;\r\n onSubmit: (e: FormEvent<Element>) => Promise<void>;\r\n children?: React.ReactNode;\r\n form: UseFormReturn<any, any, any>;\r\n uploadLoading: boolean;\r\n type: 'socialEvent' | 'meeting' | 'recurringEvent';\r\n loading: boolean;\r\n articleId?: number;\r\n isValid: boolean;\r\n};\r\n\r\nconst ModalForm = commonComponentsRegistry.getLazyComponent('ModalForm');\r\n\r\nexport const UpdateCalendarEventModal = ({\r\n closeHandler,\r\n onSubmit,\r\n children,\r\n form,\r\n uploadLoading,\r\n type,\r\n loading,\r\n articleId,\r\n}: UpdateCalendarEventModalProps) => {\r\n const intl = useIntl();\r\n\r\n return (\r\n <ModalForm\r\n onSubmit={onSubmit}\r\n loading={loading}\r\n open={!!articleId}\r\n closeHandler={closeHandler}\r\n buttons={[\r\n {\r\n color: 'cancel',\r\n children: intl.formatMessage({ id: 'GLOBAL_Cancel' }),\r\n clickHandler: closeHandler,\r\n },\r\n {\r\n color: 'valid',\r\n isSubmit: true,\r\n loading,\r\n disabled: !form.formState.isValid || loading || uploadLoading,\r\n children: intl.formatMessage({ id: 'GLOBAL_Save' }),\r\n },\r\n ]}\r\n extraTopButtons={\r\n articleId\r\n ? [\r\n {\r\n icon: 'icon-expand',\r\n href: `/?action=article-edit&IdArticle=${articleId}`,\r\n },\r\n ]\r\n : []\r\n }\r\n title={intl.formatMessage({\r\n id:\r\n type === 'socialEvent'\r\n ? 'CALENDAR_Update_SocialEvent_Title'\r\n : type === 'meeting'\r\n ? 'CALENDAR_Update_Meeting_Title'\r\n : 'CALENDAR_Update_RecurringEvent_Title',\r\n })}>\r\n {children}\r\n </ModalForm>\r\n );\r\n};\r\n","import {\r\n SocialEventOrRecurringEventForm,\r\n SocialEventFormExtraInitialValues,\r\n SocialEventOrRecurringEventFormValues,\r\n} from './SocialEventOrRecurringEventForm';\r\nimport { useIntl } from 'react-intl';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { useForm, useWatch } from 'react-hook-form';\r\nimport jApi, {\r\n CalendarEventWithExtensions,\r\n extractTaxonomiesFromObject,\r\n extractTaxonomiesFromObjectAndMapProperty,\r\n Format,\r\n jSocialEventView,\r\n SocialEventUpdate,\r\n socialEventUpdateSchema,\r\n} from 'jamespot-user-api';\r\nimport { Toast } from 'jamespot-front-business';\r\nimport { UpdateCalendarEventModal } from '../UpdateCalendarEventModal';\r\nimport { Utils } from 'jamespot-react-components';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\nimport { useAppDispatch } from '../../../redux/store';\r\nimport useAbortController from '../../../hooks/useAbortController';\r\nimport { stringifyAutocomplete } from '../../../utils/jamespot';\r\n\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst Modal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type UpdateSocialEventModalProps = {\r\n onUpdate: () => void;\r\n event?: CalendarEventWithExtensions<jSocialEventView, ['socialEventRecord']>;\r\n closeHandler: () => void;\r\n};\r\n\r\nconst mapFormValuesToApi = (\r\n data: SocialEventOrRecurringEventFormValues,\r\n uri: string | undefined,\r\n): SocialEventUpdate => ({\r\n ...data,\r\n publishTo: stringifyAutocomplete(data.publishTo),\r\n uiObjectLink: data.uiObjectLink ? data.uiObjectLink.uri : '',\r\n sendAlert: data.sendAlert ? '1' : '0',\r\n alertAuthor: data.alertAuthor ? '1' : '0',\r\n ...extractTaxonomiesFromObjectAndMapProperty(data, 'title', (arr: string[]) => arr.join(',')),\r\n uri: uri ?? '',\r\n type: 'socialEvent',\r\n});\r\n\r\nexport const UpdateSocialEventModal = ({ closeHandler, onUpdate, event }: UpdateSocialEventModalProps) => {\r\n const intl = useIntl();\r\n const abortController = useAbortController();\r\n const [isUpdateModalOpen, setUpdateModalOpen] = useState(false);\r\n const form = useForm<SocialEventOrRecurringEventFormValues>();\r\n const dispatch = useAppDispatch();\r\n const [initialLoading, setInitialLoading] = useState(true);\r\n const [loading, setLoading] = useState(false);\r\n const [uploadLoading, setUploadLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (event) {\r\n const lastModifiedTimestamp = Utils.date.strToTimestamp(event.dateModified);\r\n jApi.network\r\n .token(abortController.signal)\r\n .then((res) => {\r\n form.reset({\r\n socialEventCeiling: event.socialEventCeiling,\r\n title: event.title,\r\n noGestion: event.noGestion,\r\n dateEnd: event.dateEnd,\r\n dateStart: event.dateStart,\r\n socialEventUseCeiling: event.socialEventUseCeiling,\r\n address: event.address,\r\n allDay: event.allDay,\r\n bgColor: event.bgColor,\r\n image:\r\n lastModifiedTimestamp && event.image\r\n ? {\r\n type: 'socialEvent',\r\n id: event.id,\r\n timestamp: String(lastModifiedTimestamp),\r\n }\r\n : undefined,\r\n place: event.place,\r\n hideFromCalendar: event.hideFromCalendar,\r\n textColor: event.textColor,\r\n useQrcode: event.useQrcode,\r\n description: event.description ?? undefined,\r\n urlGestion: event.urlGestion ?? undefined,\r\n publishTo: event._audience.map((el) => ({ uri: el.uri, title: el.title })),\r\n uiObjectLink:\r\n event.uiObjectLink && event.uiObjectLink.length > 0\r\n ? { uri: event.uiObjectLink[0].uri, title: event.uiObjectLink[0].title }\r\n : undefined,\r\n token: res.result,\r\n });\r\n setInitialLoading(false);\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n });\r\n }\r\n }, [abortController.signal, dispatch, event, form, intl]);\r\n\r\n const extraInitialValues = useMemo<SocialEventFormExtraInitialValues | undefined>(() => {\r\n if (!event) return undefined;\r\n let eventMode: 'onSpot' | 'visio' | 'hybrid' = 'onSpot';\r\n if (event.place && event.address) {\r\n eventMode = 'hybrid';\r\n } else if (event.address) {\r\n eventMode = 'onSpot';\r\n } else if (event.place) {\r\n eventMode = 'visio';\r\n } else {\r\n eventMode = 'onSpot';\r\n }\r\n return {\r\n eventMode,\r\n customColors: !!event.textColor || !!event.bgColor,\r\n attachments: event._attachedFiles,\r\n tags: extractTaxonomiesFromObject(event),\r\n };\r\n }, [event]);\r\n\r\n const onSubmit = useCallback(\r\n (data: SocialEventOrRecurringEventFormValues) => {\r\n setLoading(true);\r\n jApi.article\r\n .update<SocialEventUpdate, Format.LITTLE>(\r\n {\r\n ...mapFormValuesToApi(data as SocialEventOrRecurringEventFormValues, event?.uri),\r\n },\r\n { signal: abortController.signal, format: Format.LITTLE },\r\n )\r\n .then((res) => {\r\n onUpdate();\r\n dispatch(\r\n Toast.actions.success({\r\n label: 'GLOBAL_Successfully_Saved',\r\n link: {\r\n label: 'GLOBAL_Go_To_Content',\r\n url: res.result._url,\r\n },\r\n }),\r\n );\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n })\r\n .finally(() => {\r\n if (abortController.signal.aborted) return;\r\n setLoading(false);\r\n });\r\n },\r\n [abortController.signal, dispatch, event?.uri, intl, onUpdate],\r\n );\r\n\r\n const values = useWatch({ control: form.control });\r\n const isValid = useMemo(\r\n () =>\r\n socialEventUpdateSchema.safeParse(\r\n mapFormValuesToApi(values as SocialEventOrRecurringEventFormValues, event?.uri),\r\n ).success,\r\n [event?.uri, values],\r\n );\r\n\r\n return (\r\n <>\r\n <UpdateCalendarEventModal\r\n articleId={event?.id}\r\n type={'socialEvent'}\r\n closeHandler={closeHandler}\r\n onSubmit={form.handleSubmit(onSubmit)}\r\n form={form}\r\n loading={loading}\r\n isValid={isValid}\r\n uploadLoading={uploadLoading}>\r\n {initialLoading ? null : (\r\n <SocialEventOrRecurringEventForm\r\n mode={'update'}\r\n form={form}\r\n setUploadLoading={setUploadLoading}\r\n extraInitialValues={extraInitialValues}\r\n />\r\n )}\r\n </UpdateCalendarEventModal>\r\n <Modal\r\n open={isUpdateModalOpen}\r\n closeHandler={() => setUpdateModalOpen(false)}\r\n title={intl.formatMessage({ id: 'GLOBAL_Save' })}\r\n buttons={[\r\n {\r\n color: 'cancel',\r\n clickHandler: () => setUpdateModalOpen(false),\r\n children: intl.formatMessage({ id: 'GLOBAL_Cancel' }),\r\n },\r\n {\r\n color: 'danger',\r\n clickHandler: form.handleSubmit(onSubmit),\r\n loading: loading,\r\n children: intl.formatMessage({ id: 'GLOBAL_Save' }),\r\n dataCy: 'delete-continue',\r\n },\r\n ]}>\r\n <Typography>\r\n {intl.formatMessage({\r\n id: 'CALENDAR_Update_Confirmation_Recurrent',\r\n })}\r\n </Typography>\r\n </Modal>\r\n </>\r\n );\r\n};\r\n","import { isAfter } from 'date-fns';\r\nimport { Hook, Model, Toast } from 'jamespot-front-business';\r\nimport { AutocompleteView, DriveOrFilebank } from 'jamespot-react-components';\r\nimport jApi, {\r\n AudienceAutocomplete,\r\n CalendarEventWithExtensions,\r\n jFileLittle,\r\n jMeetingView,\r\n MeetingCreation,\r\n} from 'jamespot-user-api';\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { UseFormReturn, useWatch } from 'react-hook-form';\r\nimport { useIntl } from 'react-intl';\r\nimport styled, { useTheme } from 'styled-components';\r\nimport { v4 as uuid } from 'uuid';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\r\nimport { DisplayFormRef } from '../../../displayer/types';\r\nimport { JRCInputTinyMCEWithExt } from '../../tinymce/JRCInputTinyMCEWithExt';\r\nimport { DisplayForm } from '../../../displayer/DisplayForm.component';\r\n\r\nconst InputImage = commonComponentsRegistry.getLazyComponent('InputImage');\r\nconst InputText = commonComponentsRegistry.getLazyComponent('InputText');\r\nconst InputCheckbox = commonComponentsRegistry.getLazyComponent('InputCheckbox');\r\nconst InputCheckboxRaw = commonComponentsRegistry.getLazyComponent('InputCheckboxRaw');\r\nconst InputAudience = commonComponentsRegistry.getLazyComponent('InputAudience');\r\nconst InputFileAdvancedRaw = commonComponentsRegistry.getLazyComponent('InputFileAdvancedRaw');\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst InputColor = commonComponentsRegistry.getLazyComponent('InputColor');\r\nconst InputDateTime = commonComponentsRegistry.getLazyComponent('InputDateTime');\r\nconst FlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\r\nconst InputAutocomplete = commonComponentsRegistry.getLazyComponent('InputAutocomplete');\r\nconst InputSelectRaw = commonComponentsRegistry.getLazyComponent('InputSelectRaw');\r\nconst Collapse = commonComponentsRegistry.getLazyComponent('Collapse');\r\nconst Message = commonComponentsRegistry.getLazyComponent('Message');\r\n\r\nexport type MeetingFormExtraInitialValues = {\r\n eventMode: 'onSpot' | 'visio' | 'hybrid';\r\n customColors: boolean;\r\n attachments: Array<jFileLittle>;\r\n reportFile: jFileLittle | null;\r\n tags: Record<string, unknown>;\r\n};\r\n\r\nexport type MeetingFormProps = {\r\n form: UseFormReturn<MeetingFormValues, null, any>;\r\n setUploadLoading: (loading: boolean) => void;\r\n meeting?: CalendarEventWithExtensions<jMeetingView, ['socialEventRecord']>;\r\n extraInitialValues?: MeetingFormExtraInitialValues;\r\n mode: 'create' | 'update';\r\n};\r\n\r\nexport type MeetingFormValues = Omit<\r\n MeetingCreation,\r\n 'publishTo' | 'uiObjectLink' | 'alertAuthor' | 'sendAlert' | 'type'\r\n> & {\r\n publishTo: AudienceAutocomplete[];\r\n uiObjectLink?: { uri: string; title: string; icon?: string; color?: string };\r\n image?: object;\r\n alertAuthor?: boolean;\r\n sendAlert?: boolean;\r\n};\r\n\r\nconst DisplayFormWrapper = styled.div`\r\n margin-top: -${({ theme }) => theme.space.sm}px;\r\n margin-bottom: -${({ theme }) => theme.space.l}px;\r\n`;\r\n\r\nconst ReportSection = styled.div`\r\n padding: ${({ theme }) => theme.space.md}px;\r\n background-color: ${({ theme }) => theme.color.grey0};\r\n border-radius: ${({ theme }) => theme.size.sm}px;\r\n border: 1px solid ${({ theme }) => theme.color.grey1};\r\n`;\r\n\r\nconst ShowHide = styled.div<{ $show: boolean }>`\r\n display: ${({ $show }) => ($show ? 'block' : 'none')};\r\n`;\r\n\r\ntype OptionVisio = {\r\n label: string;\r\n value: string;\r\n};\r\n\r\nexport const MeetingForm = ({ form, setUploadLoading, extraInitialValues, mode }: MeetingFormProps) => {\r\n const intl = useIntl();\r\n const dispatch = useAppDispatch();\r\n const theme = useTheme();\r\n const displayFormRef = useRef<DisplayFormRef>(null);\r\n const [eventModeHasChanged, setEventModeHasChanged] = useState(false);\r\n const [eventMode, setEventMode] = useState<'onSpot' | 'visio' | 'hybrid'>(\r\n extraInitialValues?.eventMode ?? 'onSpot',\r\n );\r\n const [customColors, setCustomColors] = useState(extraInitialValues?.customColors ?? false);\r\n const [prevPlace, setPrevPlace] = useState<string | null>();\r\n const [prevAddress, setPrevAddress] = useState<string | null>();\r\n const calendarHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'calendarHook'));\r\n const fileBankHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'FileBankHook'));\r\n const spotHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'SpotHook'));\r\n const businessContactHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'BusinessContactHook'));\r\n const driveHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'DriveHook'));\r\n const visioConnectHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'VisioConnectHook'));\r\n const bbbHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'BigBlueButtonHook'));\r\n const sharedContentHook = useAppSelector((state) => Hook.selectors.selectHook(state, 'SharedContentHook'));\r\n const models = useAppSelector(Model.selectors.selectAll);\r\n\r\n // For tags only\r\n displayFormRef.current?.watch((v) => {\r\n Object.keys(v).forEach((key) => {\r\n form.setValue(key as keyof MeetingFormValues, v[key]);\r\n });\r\n });\r\n\r\n const sendAlert = useWatch({ control: form.control, name: 'sendAlert' });\r\n useEffect(() => {\r\n if (!sendAlert) {\r\n form.setValue('alertAuthor', false);\r\n }\r\n }, [form, sendAlert]);\r\n\r\n const dateStart = useWatch({ control: form.control, name: 'dateStart' });\r\n const dateEnd = useWatch({ control: form.control, name: 'dateEnd' });\r\n const isDateStartAfterDateEnd = useMemo(() => {\r\n return dateStart && dateEnd && isAfter(new Date(dateStart), new Date(dateEnd));\r\n }, [dateStart, dateEnd]);\r\n\r\n const eventModeOptions = useMemo(\r\n () => [\r\n { label: intl.formatMessage({ id: 'CALENDAR_On_Spot' }), value: 'onSpot' },\r\n { label: intl.formatMessage({ id: 'CALENDAR_Visio' }), value: 'visio' },\r\n { label: intl.formatMessage({ id: 'CALENDAR_Hybrid' }), value: 'hybrid' },\r\n ],\r\n [intl],\r\n );\r\n\r\n const audienceViews = useMemo<AutocompleteView[]>(() => {\r\n const res: Array<AutocompleteView> = [];\r\n\r\n if (spotHook && spotHook.isActive && spotHook.hasLicense) {\r\n res.push('group');\r\n }\r\n\r\n res.push('user');\r\n\r\n if (fileBankHook && fileBankHook.isActive) {\r\n res.push('folder');\r\n }\r\n\r\n if (businessContactHook && businessContactHook.isActive) {\r\n res.push('businessContact');\r\n }\r\n\r\n return res;\r\n }, [businessContactHook, fileBankHook, spotHook]);\r\n\r\n const onError = useCallback(\r\n (message?: string) =>\r\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) })),\r\n [dispatch, intl],\r\n );\r\n\r\n const deleteFile = useCallback(\r\n async (id: number) => {\r\n const token = form.watch('token');\r\n if (!token) return;\r\n try {\r\n await jApi.file.deleteFile(id, 'attachment', token);\r\n } catch (e: any) {\r\n if (onError) onError(e);\r\n }\r\n },\r\n [form, onError],\r\n );\r\n\r\n const autocompleteArticles = (input: string) =>\r\n jApi.article\r\n .list({\r\n query: input,\r\n filters: [{ name: 'type', value: 'internalDraft', operator: '<>' }],\r\n })\r\n .then((res) =>\r\n res?.result?.data.map((a) => {\r\n const model = models.find((m) => m.type === a.type);\r\n return { uri: a.uri, title: a.title, icon: model?.icon, color: model?.color };\r\n }),\r\n );\r\n\r\n const visioOptions = useMemo(\r\n () => [\r\n {\r\n value: 'jitsi',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_Jitsi' }),\r\n },\r\n ...(visioConnectHook && visioConnectHook.isActive && visioConnectHook.hasLicense\r\n ? [\r\n {\r\n value: 'visioConnect',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_VisioConnect' }),\r\n },\r\n ]\r\n : []),\r\n ...(bbbHook && bbbHook.isActive && bbbHook.hasLicense\r\n ? [\r\n {\r\n value: 'bbb',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_BBB' }),\r\n },\r\n ...(sharedContentHook && sharedContentHook.isActive\r\n ? [\r\n {\r\n value: 'bbb-public',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_BBB_Public' }),\r\n },\r\n ]\r\n : []),\r\n ]\r\n : []),\r\n {\r\n value: 'other',\r\n label: intl.formatMessage({ id: 'CALENDAR_Visio_Other' }),\r\n },\r\n ],\r\n [bbbHook, intl, sharedContentHook, visioConnectHook],\r\n );\r\n const [visioOption, setVisioOption] = useState<OptionVisio>(visioOptions[visioOptions.length - 1]);\r\n\r\n const updateVisioOption = useCallback(\r\n (option: OptionVisio) => {\r\n setVisioOption(option);\r\n switch (option.value) {\r\n case 'jitsi':\r\n form.setValue('place', 'jitsi:' + J.urlBase + '?action=jitsiRedirect&id=' + uuid());\r\n break;\r\n case 'visioConnect':\r\n form.setValue('place', 'visioConnect');\r\n break;\r\n case 'other':\r\n form.setValue('place', '');\r\n break;\r\n case 'bbb':\r\n form.setValue('place', 'bbb');\r\n break;\r\n case 'bbb-public':\r\n form.setValue('place', 'bbb-public');\r\n break;\r\n }\r\n },\r\n [form],\r\n );\r\n\r\n const place = useWatch({ control: form.control, name: 'place' });\r\n const address = useWatch({ control: form.control, name: 'address' });\r\n\r\n const updateEventMode = useCallback(\r\n (v: 'onSpot' | 'visio' | 'hybrid') =>\r\n setEventMode((prev) => {\r\n setEventModeHasChanged(true);\r\n if (prev === 'visio' || prev === 'hybrid') {\r\n setPrevPlace(place);\r\n }\r\n if (prev === 'onSpot' || prev === 'hybrid') {\r\n setPrevAddress(address);\r\n }\r\n if (v === 'onSpot') {\r\n form.setValue('place', null);\r\n if (prev !== 'hybrid') {\r\n form.setValue('address', prevAddress);\r\n }\r\n } else if (v === 'visio') {\r\n form.setValue('address', null);\r\n if (prev !== 'hybrid') {\r\n form.setValue('place', prevPlace);\r\n }\r\n } else if (v === 'hybrid') {\r\n if (prev !== 'onSpot') {\r\n form.setValue('address', prevAddress);\r\n }\r\n if (prev !== 'visio') {\r\n form.setValue('place', prevPlace);\r\n }\r\n }\r\n return v;\r\n }),\r\n [address, form, place, prevAddress, prevPlace],\r\n );\r\n\r\n return (\r\n <FlexBox direction={'column'} gap={theme.space.l}>\r\n <InputImage\r\n margin={'0'}\r\n name={'image'}\r\n dzDimensions={{ width: '100%', height: 275 }}\r\n control={form.control}\r\n token={form.watch('token')}\r\n aspectRatio={2}\r\n allowCustomRatio\r\n defaultImages={{\r\n imgs: [],\r\n columnCount: 1,\r\n }}\r\n />\r\n <InputText\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Title' })}\r\n name={'title'}\r\n control={form.control}\r\n rules={{ required: true }}\r\n />\r\n <FlexBox direction={'column'} gap={theme.space.sm}>\r\n {isDateStartAfterDateEnd && (\r\n <Message\r\n message={intl.formatMessage({ id: 'CALENDAR_Date_Start_After_Date_End' })}\r\n variant={'error'}\r\n />\r\n )}\r\n <FlexBox gap={theme.space.md} y={'center'}>\r\n <InputDateTime\r\n mode={form.watch('allDay') ? 'date' : 'datetime'}\r\n margin={'0'}\r\n width={'100%'}\r\n label={'CALENDAR_DateTime_Start'}\r\n control={form.control}\r\n name={'dateStart'}\r\n rules={{ required: true }}\r\n openDirection={'left'}\r\n />\r\n <InputDateTime\r\n mode={form.watch('allDay') ? 'date' : 'datetime'}\r\n margin={'0'}\r\n width={'100%'}\r\n label={'CALENDAR_DateTime_End'}\r\n control={form.control}\r\n name={'dateEnd'}\r\n rules={{ required: true }}\r\n />\r\n </FlexBox>\r\n <InputCheckbox\r\n control={form.control}\r\n margin={'0'}\r\n name={'allDay'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_All_Day' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n </FlexBox>\r\n <FlexBox direction={'column'} gap={theme.space.md}>\r\n <ShowHide $show={mode === 'update' && eventModeHasChanged}>\r\n <Message variant={'info'} message={intl.formatMessage({ id: 'Event_Warning_Message' })} />\r\n </ShowHide>\r\n <InputCheckboxRaw\r\n margin={'0'}\r\n checkboxMode={'radio'}\r\n direction={'row'}\r\n value={eventMode as any}\r\n name=\"value\"\r\n onChange={updateEventMode}\r\n options={eventModeOptions}\r\n />\r\n {(eventMode === 'onSpot' || eventMode === 'hybrid') && (\r\n <InputText\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'CALENDAR_Event_Address' })}\r\n name={'address'}\r\n control={form.control}\r\n />\r\n )}\r\n {(eventMode === 'visio' || eventMode === 'hybrid') && (\r\n <FlexBox direction={'column'}>\r\n <Typography>{intl.formatMessage({ id: 'CALENDAR_Event_Place' })}</Typography>\r\n <FlexBox gap={theme.space.md} y={'flex-end'}>\r\n <FlexBox flex={'1'} margin={'0 0 4px 0'}>\r\n <InputSelectRaw<{ visio: OptionVisio }>\r\n noMargin\r\n name={'visio'}\r\n onChange={updateVisioOption}\r\n options={visioOptions}\r\n value={visioOption}\r\n required\r\n getLabel={(o) => o.label}\r\n getValue={(o) => o.value}\r\n />\r\n </FlexBox>\r\n {(visioOption.value === 'other' || visioOption.value === 'jitsi') && (\r\n <FlexBox flex={'2'}>\r\n <InputText\r\n width={'100%'}\r\n margin={'0'}\r\n name={'place'}\r\n control={form.control}\r\n disabled={visioOption.value === 'jitsi'}\r\n />\r\n </FlexBox>\r\n )}\r\n </FlexBox>\r\n </FlexBox>\r\n )}\r\n {calendarHook?.externalGestion && (\r\n <InputText\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'CALENDAR_External_Link' })}\r\n description={intl.formatMessage({ id: 'CALENDAR_External_Link_Description' })}\r\n name={'urlGestion'}\r\n control={form.control}\r\n />\r\n )}\r\n <JRCInputTinyMCEWithExt\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Description' })}\r\n control={form.control}\r\n name={'agenda'}\r\n handlers={{\r\n file: jApi.file,\r\n }}\r\n />\r\n <DisplayFormWrapper>\r\n <DisplayForm\r\n type={'meeting'}\r\n fields={[{ includes: 'tags' }]}\r\n ref={displayFormRef}\r\n defaultValues={extraInitialValues?.tags}\r\n />\r\n </DisplayFormWrapper>\r\n <InputAutocomplete\r\n noMargin\r\n control={form.control}\r\n name=\"uiObjectLink\"\r\n label={intl.formatMessage({ id: 'GLOBAL_Object_Link' })}\r\n searchable\r\n asyncPromise={autocompleteArticles}\r\n />\r\n <FlexBox direction={'column'} gap={theme.space.md}>\r\n <InputCheckboxRaw\r\n margin={'0'}\r\n onChange={(v) => {\r\n if (v) {\r\n form.setValue('textColor', theme.color.grey5);\r\n form.setValue('bgColor', theme.color.grey1);\r\n } else {\r\n form.setValue('textColor', null);\r\n form.setValue('bgColor', null);\r\n }\r\n setCustomColors(v);\r\n }}\r\n value={customColors as any}\r\n name=\"\"\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_Custom_Colors' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n <ShowHide $show={customColors}>\r\n <InputColor\r\n margin={'0'}\r\n control={form.control}\r\n name={'textColor'}\r\n label={'CALENDAR_Text_Color'}\r\n initialValue={form.watch('textColor') ?? theme.color.grey5}\r\n />\r\n <InputColor\r\n margin={'0'}\r\n control={form.control}\r\n name={'bgColor'}\r\n label={'CALENDAR_Background_Color'}\r\n initialValue={form.watch('bgColor') ?? theme.color.grey1}\r\n />\r\n </ShowHide>\r\n </FlexBox>\r\n <InputAudience\r\n margin={'0'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n control={form.control}\r\n name={'publishTo'}\r\n searchable\r\n multiple\r\n views={{\r\n activeViews: audienceViews,\r\n handlers: {\r\n user: jApi.user,\r\n filebank: jApi.filebank,\r\n group: jApi.group,\r\n },\r\n onError,\r\n }}\r\n />\r\n <Typography>{intl.formatMessage({ id: 'GLOBAL_Attachments' })}</Typography>\r\n <InputFileAdvancedRaw\r\n token={form.watch('token')}\r\n multiple\r\n name={'attachment'}\r\n deleteFile={deleteFile}\r\n activeDrives={\r\n [\r\n ...(fileBankHook && driveHook ? ['fileBank'] : []),\r\n ...Hook.utils.buildDrivesArrayFromObject(driveHook?.drives),\r\n ] as DriveOrFilebank[]\r\n }\r\n handlers={{\r\n file: jApi.file,\r\n filebank: jApi.filebank,\r\n drive: jApi.drive,\r\n }}\r\n dispatchOnError={onError}\r\n onUploadStart={() => setUploadLoading(true)}\r\n onUploadSuccess={() => setUploadLoading(false)}\r\n existingFiles={extraInitialValues?.attachments ?? []}\r\n />\r\n <ReportSection>\r\n <Collapse\r\n openByDefault={mode === 'update'}\r\n header={<Typography>{intl.formatMessage({ id: 'CALENDAR_Report' })}</Typography>}\r\n content={\r\n <FlexBox direction={'column'} gap={theme.space.l}>\r\n <JRCInputTinyMCEWithExt\r\n margin={'0'}\r\n control={form.control}\r\n name={'report'}\r\n handlers={{\r\n file: jApi.file,\r\n }}\r\n />\r\n <Typography>{intl.formatMessage({ id: 'CALENDAR_Report_File' })}</Typography>\r\n <InputFileAdvancedRaw\r\n token={form.watch('token')}\r\n multiple\r\n name={'reportFile'}\r\n deleteFile={deleteFile}\r\n activeDrives={\r\n [\r\n ...(fileBankHook && driveHook ? ['fileBank'] : []),\r\n ...Hook.utils.buildDrivesArrayFromObject(driveHook?.drives),\r\n ] as DriveOrFilebank[]\r\n }\r\n handlers={{\r\n file: jApi.file,\r\n filebank: jApi.filebank,\r\n drive: jApi.drive,\r\n }}\r\n dispatchOnError={onError}\r\n onUploadStart={() => setUploadLoading(true)}\r\n onUploadSuccess={() => setUploadLoading(false)}\r\n existingFiles={\r\n extraInitialValues?.reportFile ? [extraInitialValues.reportFile] : []\r\n }\r\n />\r\n </FlexBox>\r\n }\r\n />\r\n </ReportSection>\r\n <Typography>{intl.formatMessage({ id: 'CALENDAR_More_Options' })}</Typography>\r\n <div>\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'noGestion'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n inverted // ⚠️\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'CALENDAR_Activate_Subscription' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n {mode === 'create' && (\r\n <>\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'sendAlert'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'GLOBAL_Send_Alert' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n />\r\n <InputCheckbox\r\n margin={'0'}\r\n control={form.control}\r\n name={'alertAuthor'}\r\n checkboxMode={'checkbox'}\r\n valueTypeIsBoolean\r\n options={[\r\n {\r\n label: intl.formatMessage({ id: 'GLOBAL_Alert_Author' }),\r\n value: 'YES',\r\n },\r\n ]}\r\n disabled={!sendAlert}\r\n />\r\n </>\r\n )}\r\n </div>\r\n </FlexBox>\r\n </FlexBox>\r\n );\r\n};\r\n","import { useIntl } from 'react-intl';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { useForm, useWatch } from 'react-hook-form';\r\nimport jApi, {\r\n CalendarEventWithExtensions,\r\n extractTaxonomiesFromObject,\r\n extractTaxonomiesFromObjectAndMapProperty,\r\n Format,\r\n jMeetingView,\r\n MeetingUpdate,\r\n meetingUpdateSchema,\r\n} from 'jamespot-user-api';\r\nimport { Toast } from 'jamespot-front-business';\r\nimport { UpdateCalendarEventModal } from '../UpdateCalendarEventModal';\r\nimport { Utils } from 'jamespot-react-components';\r\nimport { MeetingForm, MeetingFormExtraInitialValues, MeetingFormValues } from './MeetingForm';\r\nimport useAbortController from '../../../hooks/useAbortController';\r\nimport { useAppDispatch } from '../../../redux/store';\r\nimport { stringifyAutocomplete } from '../../../utils/jamespot';\r\n\r\nexport type UpdateMeetingModalProps = {\r\n onUpdate: () => void;\r\n meeting?: CalendarEventWithExtensions<jMeetingView, ['socialEventRecord']>;\r\n closeHandler: () => void;\r\n};\r\n\r\nconst mapFormValuesToApi = (data: MeetingFormValues, uri: string | undefined): MeetingUpdate => ({\r\n ...data,\r\n publishTo: stringifyAutocomplete(data.publishTo),\r\n uiObjectLink: data.uiObjectLink ? data.uiObjectLink.uri : '',\r\n sendAlert: data.sendAlert ? '1' : '0',\r\n alertAuthor: data.alertAuthor ? '1' : '0',\r\n ...extractTaxonomiesFromObjectAndMapProperty(data, 'title', (arr: string[]) => arr.join(',')),\r\n uri: uri ?? '',\r\n type: 'meeting',\r\n});\r\n\r\nexport const UpdateMeetingModal = ({ closeHandler, onUpdate, meeting }: UpdateMeetingModalProps) => {\r\n const intl = useIntl();\r\n const abortController = useAbortController();\r\n const form = useForm<MeetingFormValues>();\r\n const dispatch = useAppDispatch();\r\n const [initialLoading, setInitialLoading] = useState(true);\r\n const [loading, setLoading] = useState(false);\r\n const [uploadLoading, setUploadLoading] = useState(false);\r\n\r\n const values = useWatch({ control: form.control });\r\n const isValid = useMemo(\r\n () => meetingUpdateSchema.safeParse(mapFormValuesToApi(values as MeetingFormValues, meeting?.uri)).success,\r\n [meeting?.uri, values],\r\n );\r\n\r\n useEffect(() => {\r\n if (meeting) {\r\n const lastModifiedTimestamp = Utils.date.strToTimestamp(meeting.dateModified);\r\n jApi.network\r\n .token(abortController.signal)\r\n .then((res) => {\r\n form.reset({\r\n title: meeting.title,\r\n noGestion: meeting.noGestion,\r\n dateEnd: meeting.dateEnd,\r\n dateStart: meeting.dateStart,\r\n address: meeting.address,\r\n allDay: meeting.allDay,\r\n bgColor: meeting.bgColor,\r\n image:\r\n lastModifiedTimestamp && meeting.image\r\n ? {\r\n type: 'meeting',\r\n id: meeting.id,\r\n timestamp: String(lastModifiedTimestamp),\r\n }\r\n : undefined,\r\n place: meeting.place,\r\n textColor: meeting.textColor,\r\n agenda: meeting.agenda ?? undefined,\r\n report: meeting.report ?? undefined,\r\n urlGestion: meeting.urlGestion ?? undefined,\r\n publishTo: meeting._audience.map((el) => ({ uri: el.uri, title: el.title })),\r\n uiObjectLink:\r\n meeting.uiObjectLink && meeting.uiObjectLink.length > 0\r\n ? { uri: meeting.uiObjectLink[0].uri, title: meeting.uiObjectLink[0].title }\r\n : undefined,\r\n token: res.result,\r\n });\r\n setInitialLoading(false);\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n });\r\n }\r\n }, [meeting, form, abortController.signal, dispatch, intl]);\r\n\r\n const extraInitialValues = useMemo<MeetingFormExtraInitialValues | undefined>(() => {\r\n if (!meeting) return undefined;\r\n let eventMode: 'onSpot' | 'visio' | 'hybrid' = 'onSpot';\r\n if (meeting.place && meeting.address) {\r\n eventMode = 'hybrid';\r\n } else if (meeting.address) {\r\n eventMode = 'onSpot';\r\n } else if (meeting.place) {\r\n eventMode = 'visio';\r\n } else {\r\n eventMode = 'onSpot';\r\n }\r\n return {\r\n eventMode,\r\n customColors: !!meeting.textColor || !!meeting.bgColor,\r\n attachments: meeting._attachedFiles,\r\n reportFile: meeting.reportFile,\r\n tags: extractTaxonomiesFromObject(meeting),\r\n };\r\n }, [meeting]);\r\n\r\n const onSubmit = useCallback(\r\n (data: MeetingFormValues) => {\r\n setLoading(true);\r\n jApi.article\r\n .update<MeetingUpdate, Format.LITTLE>(mapFormValuesToApi(data, meeting?.uri), {\r\n signal: abortController.signal,\r\n format: Format.LITTLE,\r\n })\r\n .then((res) => {\r\n onUpdate();\r\n dispatch(\r\n Toast.actions.success({\r\n label: 'GLOBAL_Successfully_Saved',\r\n link: {\r\n label: 'GLOBAL_Go_To_Content',\r\n url: res.result._url,\r\n },\r\n }),\r\n );\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n })\r\n .finally(() => {\r\n if (abortController.signal.aborted) return;\r\n setLoading(false);\r\n });\r\n },\r\n [abortController.signal, dispatch, intl, meeting?.uri, onUpdate],\r\n );\r\n\r\n return (\r\n <UpdateCalendarEventModal\r\n articleId={meeting?.id}\r\n type={'meeting'}\r\n closeHandler={closeHandler}\r\n onSubmit={form.handleSubmit(onSubmit)}\r\n form={form}\r\n loading={loading}\r\n uploadLoading={uploadLoading}\r\n isValid={isValid}>\r\n {initialLoading ? null : (\r\n <MeetingForm\r\n mode={'update'}\r\n form={form}\r\n setUploadLoading={setUploadLoading}\r\n extraInitialValues={extraInitialValues}\r\n />\r\n )}\r\n </UpdateCalendarEventModal>\r\n );\r\n};\r\n","import {\r\n SocialEventOrRecurringEventForm,\r\n SocialEventFormExtraInitialValues,\r\n SocialEventOrRecurringEventFormValues,\r\n} from './SocialEventOrRecurringEventForm';\r\nimport { useIntl } from 'react-intl';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { useForm, useWatch } from 'react-hook-form';\r\nimport jApi, {\r\n CalendarEventWithExtensions,\r\n extractTaxonomiesFromObject,\r\n extractTaxonomiesFromObjectAndMapProperty,\r\n Format,\r\n jRecurringEventOccurrenceView,\r\n RecurringEventUpdate,\r\n recurringEventUpdateSchema,\r\n} from 'jamespot-user-api';\r\nimport { Toast } from 'jamespot-front-business';\r\nimport { UpdateCalendarEventModal } from '../UpdateCalendarEventModal';\r\nimport { Utils } from 'jamespot-react-components';\r\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\r\nimport { useAppDispatch } from '../../../redux/store';\r\nimport useAbortController from '../../../hooks/useAbortController';\r\nimport { stringifyAutocomplete } from '../../../utils/jamespot';\r\n\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst Modal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type UpdateRecurringEventModalProps = {\r\n onUpdate: () => void;\r\n event?: CalendarEventWithExtensions<jRecurringEventOccurrenceView, ['socialEventRecord', 'recurringEventRecord']>;\r\n closeHandler: () => void;\r\n};\r\n\r\nconst mapFormValuesToApi = (\r\n data: SocialEventOrRecurringEventFormValues,\r\n uri: string | undefined,\r\n): RecurringEventUpdate => ({\r\n ...data,\r\n publishTo: stringifyAutocomplete(data.publishTo),\r\n sendAlert: data.sendAlert ? '1' : '0',\r\n alertAuthor: data.alertAuthor ? '1' : '0',\r\n ...extractTaxonomiesFromObjectAndMapProperty(data, 'title', (arr: string[]) => arr.join(',')),\r\n uri: uri ?? '',\r\n type: 'recurringEvent',\r\n});\r\n\r\nexport const UpdateRecurringEventModal = ({\r\n closeHandler,\r\n onUpdate,\r\n event: recurringEventOccurrence,\r\n}: UpdateRecurringEventModalProps) => {\r\n const event = recurringEventOccurrence?._extend?.recurringEventRecord;\r\n const intl = useIntl();\r\n const abortController = useAbortController();\r\n const [isUpdateModalOpen, setUpdateModalOpen] = useState(false);\r\n const form = useForm<SocialEventOrRecurringEventFormValues>();\r\n const dispatch = useAppDispatch();\r\n const [initialLoading, setInitialLoading] = useState(true);\r\n const [loading, setLoading] = useState(false);\r\n const [uploadLoading, setUploadLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (event) {\r\n const lastModifiedTimestamp = Utils.date.strToTimestamp(event.dateModified);\r\n jApi.network\r\n .token(abortController.signal)\r\n .then((res) => {\r\n form.reset({\r\n title: event.title,\r\n dateEnd: event.dateEnd,\r\n dateStart: event.dateStart,\r\n address: event.address,\r\n allDay: event.allDay,\r\n bgColor: event.bgColor,\r\n image:\r\n lastModifiedTimestamp && event.image\r\n ? {\r\n type: 'recurringEvent',\r\n id: event.id,\r\n timestamp: String(lastModifiedTimestamp),\r\n }\r\n : undefined,\r\n textColor: event.textColor,\r\n description: event.description ?? undefined,\r\n publishTo: event._audience.map((el) => ({ uri: el.uri, title: el.title })),\r\n recurrenceRule: event.recurrenceRule,\r\n token: res.result,\r\n });\r\n setInitialLoading(false);\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n });\r\n }\r\n }, [abortController.signal, dispatch, event, form, intl]);\r\n\r\n const extraInitialValues = useMemo<SocialEventFormExtraInitialValues | undefined>(() => {\r\n if (!event) return undefined;\r\n let eventMode: 'onSpot' | 'visio' | 'hybrid' = 'onSpot';\r\n if (event.place && event.address) {\r\n eventMode = 'hybrid';\r\n } else if (event.address) {\r\n eventMode = 'onSpot';\r\n } else if (event.place) {\r\n eventMode = 'visio';\r\n } else {\r\n eventMode = 'onSpot';\r\n }\r\n return {\r\n eventMode,\r\n customColors: !!event.textColor || !!event.bgColor,\r\n attachments: event._attachedFiles,\r\n tags: extractTaxonomiesFromObject(event),\r\n until: event.recurrenceRule.until,\r\n };\r\n }, [event]);\r\n\r\n const onSubmit = useCallback(\r\n (data: SocialEventOrRecurringEventFormValues) => {\r\n setLoading(true);\r\n jApi.article\r\n .update<RecurringEventUpdate, Format.LITTLE>(mapFormValuesToApi(data, event?.uri), {\r\n signal: abortController.signal,\r\n format: Format.LITTLE,\r\n })\r\n .then((res) => {\r\n onUpdate();\r\n dispatch(\r\n Toast.actions.success({\r\n label: 'GLOBAL_Successfully_Saved',\r\n link: {\r\n label: 'GLOBAL_Go_To_Content',\r\n url: res.result._url,\r\n },\r\n }),\r\n );\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n })\r\n .finally(() => {\r\n if (abortController.signal.aborted) return;\r\n setLoading(false);\r\n });\r\n },\r\n [abortController.signal, dispatch, event?.uri, intl, onUpdate],\r\n );\r\n\r\n const values = useWatch({ control: form.control });\r\n const isValid = useMemo(\r\n () =>\r\n recurringEventUpdateSchema.safeParse(\r\n mapFormValuesToApi(values as SocialEventOrRecurringEventFormValues, event?.uri),\r\n ).success,\r\n [event?.uri, values],\r\n );\r\n\r\n return (\r\n <>\r\n <UpdateCalendarEventModal\r\n articleId={event?.id}\r\n type={'recurringEvent'}\r\n closeHandler={closeHandler}\r\n onSubmit={form.handleSubmit(onSubmit)}\r\n form={form}\r\n loading={loading}\r\n isValid={isValid}\r\n uploadLoading={uploadLoading}>\r\n {initialLoading ? null : (\r\n <SocialEventOrRecurringEventForm\r\n mode={'update'}\r\n form={form}\r\n setUploadLoading={setUploadLoading}\r\n extraInitialValues={extraInitialValues}\r\n />\r\n )}\r\n </UpdateCalendarEventModal>\r\n <Modal\r\n open={isUpdateModalOpen}\r\n closeHandler={() => setUpdateModalOpen(false)}\r\n title={intl.formatMessage({ id: 'GLOBAL_Save' })}\r\n buttons={[\r\n {\r\n color: 'cancel',\r\n clickHandler: () => setUpdateModalOpen(false),\r\n children: intl.formatMessage({ id: 'GLOBAL_Cancel' }),\r\n },\r\n {\r\n color: 'danger',\r\n clickHandler: form.handleSubmit(onSubmit),\r\n loading: loading,\r\n children: intl.formatMessage({ id: 'GLOBAL_Save' }),\r\n dataCy: 'delete-continue',\r\n },\r\n ]}>\r\n <Typography>\r\n {intl.formatMessage({\r\n id: 'CALENDAR_Update_Confirmation_Recurrent',\r\n })}\r\n </Typography>\r\n </Modal>\r\n </>\r\n );\r\n};\r\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport { useIntl } from 'react-intl';\r\nimport { UseFormReturn, useWatch } from 'react-hook-form';\r\nimport styled, { useTheme } from 'styled-components';\r\nimport { formatDate, isSameDay } from 'date-fns';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\nimport jApi from 'jamespot-user-api';\r\n\r\nexport type CreateCalendarEventModalProps = {\r\n open: boolean;\r\n closeHandler: () => void;\r\n onSubmit: () => void;\r\n onSchedule: () => void;\r\n children?: React.ReactNode;\r\n form: UseFormReturn<any, any, any>;\r\n uploadLoading: boolean;\r\n type: 'socialEvent' | 'meeting';\r\n scheduleLoading: boolean;\r\n publishLoading: boolean;\r\n isValid: boolean;\r\n};\r\n\r\nconst SidePanelModal = commonComponentsRegistry.getLazyComponent('SidePanelModal');\r\nconst FlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\r\nconst Button = commonComponentsRegistry.getLazyComponent('Button');\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst IconButton = commonComponentsRegistry.getLazyComponent('IconButton');\r\n\r\nconst LastDraftDate = styled.div`\r\n margin-right: ${({ theme }) => theme.space.sm}px;\r\n`;\r\n\r\nexport const CreateCalendarEventModal = ({\r\n open,\r\n closeHandler,\r\n onSubmit,\r\n onSchedule,\r\n children,\r\n form,\r\n uploadLoading,\r\n type,\r\n scheduleLoading,\r\n publishLoading,\r\n isValid,\r\n}: CreateCalendarEventModalProps) => {\r\n const intl = useIntl();\r\n const theme = useTheme();\r\n const idDraft = useRef<string>();\r\n const [lastDraftDate, setLastDraftDate] = useState<Date>();\r\n\r\n const closeCreationModal = useCallback(() => {\r\n closeHandler();\r\n }, [closeHandler]);\r\n\r\n useEffect(() => {\r\n if (open) {\r\n idDraft.current = undefined;\r\n form.reset();\r\n setLastDraftDate(undefined);\r\n }\r\n }, [form, open]);\r\n\r\n const data = useWatch({ control: form.control });\r\n useEffect(() => {\r\n let timeout: NodeJS.Timeout;\r\n if (\r\n open &&\r\n Object.keys(form.formState.dirtyFields).filter((k) => !['dateStart', 'dateEnd'].includes(k)).length > 0\r\n ) {\r\n timeout = setTimeout(() => {\r\n jApi.article\r\n .saveAsDraft({\r\n idDraft: idDraft.current,\r\n form: { ...data, type },\r\n contentType: type,\r\n })\r\n .then((res) => {\r\n idDraft.current = res.result.idDraft;\r\n setLastDraftDate(new Date());\r\n });\r\n }, 2000);\r\n }\r\n return () => {\r\n if (timeout) {\r\n clearTimeout(timeout);\r\n }\r\n };\r\n }, [open, data, type, form]);\r\n\r\n const loading = useMemo(\r\n () => uploadLoading || scheduleLoading || publishLoading,\r\n [publishLoading, scheduleLoading, uploadLoading],\r\n );\r\n\r\n return (\r\n <SidePanelModal\r\n offsetTop={0}\r\n position={'right'}\r\n open={open}\r\n closeHandler={closeCreationModal}\r\n showIconClose\r\n options={\r\n <IconButton\r\n icon=\"icon-expand\"\r\n href={\r\n idDraft.current\r\n ? `/?action=se&from=draft&idDraft=${idDraft.current}`\r\n : `/?action=spotlight-edit&type=${type}`\r\n }\r\n tooltip={{ description: intl.formatMessage({ id: 'GLOBAL_Form_All' }) }}\r\n srOnly={intl.formatMessage({ id: 'GLOBAL_Form_All' })}\r\n />\r\n }\r\n title={intl.formatMessage({\r\n id: type === 'socialEvent' ? 'CALENDAR_Create_SocialEvent_Title' : 'CALENDAR_Create_Meeting_Title',\r\n })}\r\n sticky={true}\r\n footer={\r\n <FlexBox direction={'column'} x={'flex-end'} gap={theme.space.xs}>\r\n {lastDraftDate && (\r\n <LastDraftDate>\r\n <Typography color={'grey5'} size={'s'}>\r\n {isSameDay(lastDraftDate, new Date())\r\n ? intl.formatMessage(\r\n {\r\n id: 'CALENDAR_Draft_Saved_Today',\r\n },\r\n { time: formatDate(lastDraftDate, 'HH:mm') },\r\n )\r\n : intl.formatMessage(\r\n {\r\n id: 'CALENDAR_Draft_Saved',\r\n },\r\n {\r\n date: intl.formatDate(lastDraftDate, {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n }),\r\n time: formatDate(lastDraftDate, 'HH:mm'),\r\n },\r\n )}\r\n </Typography>\r\n </LastDraftDate>\r\n )}\r\n <FlexBox>\r\n <Button\r\n color={'cancel'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Cancel' })}\r\n onClick={closeCreationModal}\r\n />\r\n <Button\r\n color={'cancel'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Schedule_Action' })}\r\n onClick={onSchedule}\r\n disabled={!isValid || loading}\r\n loader={scheduleLoading}\r\n />\r\n <Button\r\n color={'valid'}\r\n label={intl.formatMessage({ id: 'GLOBAL_Publish' })}\r\n onClick={() => onSubmit()}\r\n dataCy={`${type}-publish`}\r\n disabled={!isValid || loading}\r\n loader={publishLoading}\r\n />\r\n </FlexBox>\r\n </FlexBox>\r\n }>\r\n <form onSubmit={onSubmit}>{children}</form>\r\n </SidePanelModal>\r\n );\r\n};\r\n","import { FormattedMessage, useIntl } from 'react-intl';\r\nimport { Control } from 'react-hook-form';\r\nimport jamespot from 'jamespot-user-api';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\n\r\nconst JRCInputAudience = commonComponentsRegistry.getLazyComponent('InputAudience');\r\nconst JRCMessage = commonComponentsRegistry.getLazyComponent('Message');\r\nconst JRCModal = commonComponentsRegistry.getLazyComponent('Modal');\r\n\r\nexport type ModalAudienceProps = {\r\n open: boolean;\r\n closeHandler: () => void;\r\n title?: string;\r\n control: Control<any>;\r\n warningMessage?: string;\r\n onSubmit: () => void;\r\n name?: string;\r\n};\r\n\r\nexport const ModalAudience = ({\r\n open,\r\n closeHandler,\r\n title,\r\n control,\r\n warningMessage,\r\n onSubmit,\r\n name = 'publishTo',\r\n}: ModalAudienceProps) => {\r\n const intl = useIntl();\r\n return (\r\n <JRCModal\r\n open={open}\r\n closeHandler={closeHandler}\r\n title={title ?? intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: () => closeHandler(),\r\n },\r\n {\r\n dataCy: 'no-audience-continue',\r\n children: <FormattedMessage id=\"GLOBAL_Continue\" />,\r\n color: 'danger',\r\n clickHandler: () => {\r\n closeHandler();\r\n onSubmit();\r\n },\r\n },\r\n ]}>\r\n <JRCMessage\r\n variant={'warning'}\r\n message={warningMessage ?? intl.formatMessage({ id: 'FORM_Audience_Empty' })}\r\n />\r\n <JRCInputAudience\r\n asyncPromise={(inputValue: string) => jamespot.audience.autocomplete(inputValue)}\r\n searchable={true}\r\n control={control}\r\n multiple={true}\r\n placeholder={intl.formatMessage({ id: 'GLOBAL_Audience' })}\r\n name={name}\r\n />\r\n </JRCModal>\r\n );\r\n};\r\n","import { useEffect, useMemo } from 'react';\r\nimport { FormattedMessage, useIntl } from 'react-intl';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\nimport { useForm, useWatch } from 'react-hook-form';\r\nimport { Utils } from 'jamespot-react-components';\r\nimport { v4 as uuid } from 'uuid';\r\nimport { Platform, Toast } from 'jamespot-front-business';\r\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\r\nimport styled from 'styled-components';\r\nimport { padStartTwoDigits } from 'jamespot-user-api';\r\n\r\nconst ModalForm = commonComponentsRegistry.getLazyComponent('ModalForm');\r\nconst InputDateTime = commonComponentsRegistry.getLazyComponent('InputDateTime');\r\nconst InputTextRaw = commonComponentsRegistry.getLazyComponent('InputTextRaw');\r\nconst FlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\r\nconst IconButton = commonComponentsRegistry.getLazyComponent('IconButton');\r\n\r\ntype ScheduleData = {\r\n scheduleDate: string;\r\n permalinkId: string;\r\n};\r\n\r\nexport type ModalScheduleProps = {\r\n open: boolean;\r\n closeHandler: () => void;\r\n onSubmit: (data: ScheduleData) => void;\r\n};\r\n\r\nconst IconButtonWrapper = styled.div`\r\n margin-bottom: ${({ theme }) => theme.space.xs}px;\r\n`;\r\n\r\nexport const ModalSchedule = ({ open, closeHandler, onSubmit }: ModalScheduleProps) => {\r\n const intl = useIntl();\r\n const dispatch = useAppDispatch();\r\n const urlBase = useAppSelector(Platform.selectors.selectUrlBase);\r\n const form = useForm<ScheduleData>({\r\n defaultValues: async () => {\r\n const now = new Date();\r\n return {\r\n scheduleDate: `${Utils.date.formatDate(now)} ${padStartTwoDigits(now.getHours())}:${padStartTwoDigits(now.getMinutes())}`,\r\n permalinkId: uuid(),\r\n };\r\n },\r\n });\r\n\r\n const onSubmitHandler = form.handleSubmit((data) => {\r\n onSubmit(data);\r\n });\r\n\r\n useEffect(() => {\r\n if (open) {\r\n form.reset();\r\n }\r\n }, [form, open]);\r\n\r\n const permalinkId = useWatch({ control: form.control, name: 'permalinkId' });\r\n const permalink = useMemo(() => {\r\n return `${urlBase}permalink/${permalinkId}`;\r\n }, [permalinkId, urlBase]);\r\n\r\n return (\r\n <ModalForm\r\n open={open}\r\n closeHandler={closeHandler}\r\n onSubmit={onSubmitHandler}\r\n maxHeight={'620px'}\r\n title={intl.formatMessage({ id: 'GLOBAL_Schedule_Action' })}\r\n buttons={[\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Cancel\" />,\r\n color: 'cancel',\r\n clickHandler: () => closeHandler(),\r\n },\r\n {\r\n children: <FormattedMessage id=\"GLOBAL_Schedule_Action\" />,\r\n color: 'valid',\r\n clickHandler: () => {\r\n closeHandler();\r\n onSubmitHandler();\r\n },\r\n disabled: !form.watch('scheduleDate'),\r\n },\r\n ]}>\r\n <InputDateTime\r\n rules={{ required: true }}\r\n label={'GLOBAL_Scheduled_Date'}\r\n control={form.control}\r\n name={'scheduleDate'}\r\n />\r\n <FlexBox y={'flex-end'}>\r\n <InputTextRaw\r\n label={intl.formatMessage({ id: 'GLOBAL_Permalink' })}\r\n value={permalink}\r\n onChange={() => null}\r\n margin={'0'}\r\n width={'100%'}\r\n />\r\n <IconButtonWrapper>\r\n <IconButton\r\n srOnly={'GLOBAL_Copy_Link'}\r\n icon={'icon-copy'}\r\n colorVariant={'primary'}\r\n onClick={() => {\r\n navigator.clipboard.writeText(permalink).then(() => {\r\n dispatch(\r\n Toast.actions.success({\r\n label: intl.formatMessage({ id: 'CLIPBOARD_Copy_Success' }),\r\n }),\r\n );\r\n });\r\n }}\r\n />\r\n </IconButtonWrapper>\r\n </FlexBox>\r\n </ModalForm>\r\n );\r\n};\r\n","import { CreateCalendarEventModal, CreateCalendarEventModalProps } from '../CreateCalendarEventModal';\r\nimport { useIntl } from 'react-intl';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { useForm, useWatch } from 'react-hook-form';\r\nimport jApi, {\r\n extractTaxonomiesFromObjectAndMapProperty,\r\n Format,\r\n MeetingCreation,\r\n meetingCreationSchema,\r\n} from 'jamespot-user-api';\r\nimport { Platform, Toast } from 'jamespot-front-business';\r\nimport { addHours, formatDate } from 'date-fns';\r\nimport { MeetingForm, MeetingFormValues } from './MeetingForm';\r\nimport { useSelector } from 'react-redux';\r\nimport useAbortController from '../../../hooks/useAbortController';\r\nimport { useAppDispatch } from '../../../redux/store';\r\nimport { ModalAudience } from '../../modals/ModalAudience';\r\nimport { ModalSchedule } from '../../modals/ModalSchedule';\r\nimport { stringifyAutocomplete } from '../../../utils/jamespot';\r\n\r\nexport type CreateMeetingModalProps = Pick<CreateCalendarEventModalProps, 'open' | 'closeHandler'> & {\r\n onCreate: () => void;\r\n};\r\n\r\nconst mapFormValuesToApi = (data: MeetingFormValues): MeetingCreation => ({\r\n ...data,\r\n publishTo: stringifyAutocomplete(data.publishTo),\r\n uiObjectLink: data.uiObjectLink ? data.uiObjectLink.uri : '',\r\n sendAlert: data.sendAlert ? '1' : '0',\r\n alertAuthor: data.alertAuthor ? '1' : '0',\r\n ...extractTaxonomiesFromObjectAndMapProperty(data, 'title', (arr: string[]) => arr.join(',')),\r\n type: 'meeting',\r\n});\r\n\r\nexport const CreateMeetingModal = ({ open, closeHandler, onCreate }: CreateMeetingModalProps) => {\r\n const intl = useIntl();\r\n const abortController = useAbortController();\r\n const [noAudienceModalMode, setNoAudienceModalMode] = useState<'schedule' | 'publish' | null>(null);\r\n const [isScheduleModalOpen, setScheduleModalOpen] = useState(false);\r\n const [scheduleDate, setScheduleDate] = useState<string>();\r\n const [permalinkId, setPermalinkId] = useState<string>();\r\n const platform = useSelector(Platform.selectors.selectPlatformConfig);\r\n const form = useForm<MeetingFormValues>({\r\n defaultValues: async () => {\r\n let defaultDateStart = new Date();\r\n defaultDateStart.setMinutes(defaultDateStart.getMinutes() < 30 ? 30 : 0);\r\n defaultDateStart = defaultDateStart.getMinutes() === 0 ? addHours(defaultDateStart, 1) : defaultDateStart;\r\n let defaultDateEnd = defaultDateStart;\r\n defaultDateEnd = addHours(defaultDateEnd, 1);\r\n return {\r\n title: '',\r\n sendAlert: platform.sendAlert === 1,\r\n alertAuthor: platform.sendAlert === 1,\r\n dateStart: formatDate(defaultDateStart, 'yyyy-MM-dd HH:mm'),\r\n dateEnd: formatDate(defaultDateEnd, 'yyyy-MM-dd HH:mm'),\r\n publishTo: [],\r\n };\r\n },\r\n });\r\n const dispatch = useAppDispatch();\r\n const [publishLoading, setPublishLoading] = useState(false);\r\n const [scheduleLoading, setScheduleLoading] = useState(false);\r\n const [uploadLoading, setUploadLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (open) {\r\n jApi.network\r\n .token(abortController.signal)\r\n .then((res) => {\r\n form.setValue('token', res.result);\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n });\r\n }\r\n }, [abortController.signal, dispatch, form, intl, open]);\r\n\r\n const values = useWatch({ control: form.control });\r\n const isValid = useMemo(\r\n () => meetingCreationSchema.safeParse(mapFormValuesToApi(values as MeetingFormValues)).success,\r\n [values],\r\n );\r\n\r\n const onSubmit = useCallback(\r\n (forceUpdate?: boolean) =>\r\n form.handleSubmit((data) => {\r\n if ((!data.publishTo || data.publishTo.length === 0) && !forceUpdate) {\r\n setNoAudienceModalMode('publish');\r\n return;\r\n }\r\n setPublishLoading(true);\r\n jApi.article\r\n .create<MeetingCreation, Format.LITTLE>(mapFormValuesToApi(data), {\r\n signal: abortController.signal,\r\n format: Format.LITTLE,\r\n })\r\n .then((res) => {\r\n onCreate();\r\n dispatch(\r\n Toast.actions.success({\r\n label: 'GLOBAL_Successfully_Saved',\r\n link: {\r\n label: 'GLOBAL_Go_To_Content',\r\n url: res.result[0]._url,\r\n },\r\n }),\r\n );\r\n })\r\n .catch((e) => {\r\n dispatch(\r\n Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }),\r\n );\r\n })\r\n .finally(() => {\r\n setPublishLoading(false);\r\n });\r\n })(),\r\n [dispatch, form, intl, onCreate],\r\n );\r\n\r\n const onSchedule = useCallback(\r\n (scheduleDate: string, permalinkId: string, forceUpdate?: boolean) =>\r\n form.handleSubmit((data) => {\r\n const payload = mapFormValuesToApi(data);\r\n if ((!payload.publishTo || payload.publishTo.length === 0) && !forceUpdate) {\r\n setNoAudienceModalMode('schedule');\r\n setScheduleDate(scheduleDate);\r\n setPermalinkId(permalinkId);\r\n return;\r\n }\r\n setScheduleLoading(true);\r\n jApi.article\r\n .saveAsDraft(\r\n {\r\n form: payload,\r\n contentType: 'meeting',\r\n scheduleDate,\r\n permalinkId,\r\n },\r\n { signal: abortController.signal },\r\n )\r\n .then(() => {\r\n onCreate();\r\n dispatch(\r\n Toast.actions.success({\r\n label: 'GLOBAL_Successfully_Saved',\r\n }),\r\n );\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(\r\n Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }),\r\n );\r\n })\r\n .finally(() => {\r\n if (abortController.signal.aborted) return;\r\n setScheduleLoading(false);\r\n });\r\n })(),\r\n [abortController.signal, dispatch, form, intl, onCreate],\r\n );\r\n\r\n return (\r\n <>\r\n <CreateCalendarEventModal\r\n type={'meeting'}\r\n open={open}\r\n closeHandler={closeHandler}\r\n onSubmit={onSubmit}\r\n onSchedule={() => setScheduleModalOpen(true)}\r\n form={form}\r\n publishLoading={publishLoading}\r\n scheduleLoading={scheduleLoading}\r\n uploadLoading={uploadLoading}\r\n isValid={isValid}>\r\n <MeetingForm mode={'create'} form={form} setUploadLoading={setUploadLoading} />\r\n </CreateCalendarEventModal>\r\n <ModalAudience\r\n open={noAudienceModalMode !== null}\r\n closeHandler={() => setNoAudienceModalMode(null)}\r\n control={form.control}\r\n onSubmit={() => {\r\n if (noAudienceModalMode === 'publish') {\r\n onSubmit(true);\r\n } else if (noAudienceModalMode === 'schedule' && scheduleDate && permalinkId) {\r\n onSchedule(scheduleDate, permalinkId, true);\r\n }\r\n }}\r\n />\r\n <ModalSchedule\r\n open={isScheduleModalOpen}\r\n closeHandler={() => setScheduleModalOpen(false)}\r\n onSubmit={({ scheduleDate, permalinkId }) => onSchedule(scheduleDate, permalinkId)}\r\n />\r\n </>\r\n );\r\n};\r\n","import { Hook, Toast } from 'jamespot-front-business';\r\nimport { useIntl } from 'react-intl';\r\nimport styled from 'styled-components';\r\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\r\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\r\n\r\nexport type ExportCalendarModalProps = {\r\n open: boolean;\r\n closeHandler: () => void;\r\n};\r\n\r\nconst Modal = commonComponentsRegistry.getLazyComponent('Modal');\r\nconst Message = commonComponentsRegistry.getLazyComponent('Message');\r\nconst Typography = commonComponentsRegistry.getLazyComponent('Typography');\r\nconst FlexBox = commonComponentsRegistry.getLazyComponent('FlexBox');\r\nconst IconButton = commonComponentsRegistry.getLazyComponent('IconButton');\r\nconst InputTextRaw = commonComponentsRegistry.getLazyComponent('InputTextRaw');\r\n\r\nconst Container = styled.div`\r\n display: flex;\r\n flex-direction: column;\r\n gap: ${({ theme }) => theme.space.sm}px;\r\n margin-bottom: ${({ theme }) => theme.space.l}px;\r\n`;\r\n\r\nexport const ExportCalendarModal = ({ open, closeHandler }: ExportCalendarModalProps) => {\r\n const intl = useIntl();\r\n const dispatch = useAppDispatch();\r\n const iCalendarUrls = useAppSelector((state) => Hook.selectors.selectHook(state, 'calendarHook'))?.iCalendarUrls;\r\n\r\n if (!iCalendarUrls) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Modal\r\n title={intl.formatMessage({ id: 'EVENT_Export_Calendar_ICalendar_Format' })}\r\n open={open}\r\n closeHandler={closeHandler}\r\n enableClickAwayCloseModal>\r\n <Container>\r\n <Message\r\n message={intl.formatMessage({ id: 'EVENT_ICalendar_Export_Url_Explanation' })}\r\n variant={'info'}\r\n />\r\n <FlexBox direction={'column'}>\r\n <Typography weight={'medium'}>\r\n {intl.formatMessage({ id: 'EVENT_ICalendar_Export_Url' })}\r\n </Typography>\r\n <FlexBox>\r\n <IconButton\r\n icon={'icon-copy'}\r\n colorVariant={'primary'}\r\n onClick={() => {\r\n navigator.clipboard.writeText(iCalendarUrls.all).then(() => {\r\n dispatch(\r\n Toast.actions.success({\r\n label: intl.formatMessage({ id: 'CLIPBOARD_Copy_Success' }),\r\n }),\r\n );\r\n });\r\n }}\r\n />\r\n <InputTextRaw value={iCalendarUrls.all} margin={'0'} width={'100%'} />\r\n </FlexBox>\r\n </FlexBox>\r\n <FlexBox direction={'column'}>\r\n <Typography weight={'medium'}>\r\n {intl.formatMessage({ id: 'EVENT_ICalendar_Export_Url_Subscribed' })}\r\n </Typography>\r\n <FlexBox>\r\n <IconButton\r\n icon={'icon-copy'}\r\n colorVariant={'primary'}\r\n onClick={() => {\r\n navigator.clipboard.writeText(iCalendarUrls.accepted).then(() => {\r\n dispatch(\r\n Toast.actions.success({\r\n label: intl.formatMessage({ id: 'CLIPBOARD_Copy_Success' }),\r\n }),\r\n );\r\n });\r\n }}\r\n />\r\n <InputTextRaw value={iCalendarUrls.accepted} margin={'0'} width={'100%'} />\r\n </FlexBox>\r\n </FlexBox>\r\n </Container>\r\n </Modal>\r\n );\r\n};\r\n","import {\r\n SocialEventOrRecurringEventForm,\r\n SocialEventOrRecurringEventFormValues,\r\n} from './SocialEventOrRecurringEventForm';\r\nimport { CreateCalendarEventModal, CreateCalendarEventModalProps } from '../CreateCalendarEventModal';\r\nimport { useIntl } from 'react-intl';\r\nimport { useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { useForm, useWatch } from 'react-hook-form';\r\nimport jApi, {\r\n extractTaxonomiesFromObjectAndMapProperty,\r\n Format,\r\n Join,\r\n RecurringEventCreation,\r\n recurringEventCreationSchema,\r\n SocialEventCreation,\r\n socialEventCreationSchema,\r\n zPassThrough,\r\n} from 'jamespot-user-api';\r\nimport { Platform, Toast } from 'jamespot-front-business';\r\nimport { addHours, formatDate } from 'date-fns';\r\nimport { useSelector } from 'react-redux';\r\nimport { useAppDispatch } from '../../../redux/store';\r\nimport useAbortController from '../../../hooks/useAbortController';\r\nimport { ModalAudience } from '../../modals/ModalAudience';\r\nimport { ModalSchedule } from '../../modals/ModalSchedule';\r\nimport { stringifyAutocomplete } from '../../../utils/jamespot';\r\nimport { hasPreset } from '../../../utils/eventRecurrence';\r\n\r\nexport type CreateSocialEventOrRecurringEventModalProps = Pick<\r\n CreateCalendarEventModalProps,\r\n 'open' | 'closeHandler'\r\n> & {\r\n onCreate: () => void;\r\n defaultDateSelection?: { start: Date; end: Date; allDay: boolean } | null;\r\n};\r\n\r\nconst mapFormValuesToApi = (\r\n data: SocialEventOrRecurringEventFormValues,\r\n): Join<SocialEventCreation, RecurringEventCreation> => ({\r\n ...data,\r\n publishTo: stringifyAutocomplete(data.publishTo),\r\n uiObjectLink: data.uiObjectLink ? data.uiObjectLink.uri : '',\r\n sendAlert: data.sendAlert ? '1' : '0',\r\n alertAuthor: data.alertAuthor ? '1' : '0',\r\n ...extractTaxonomiesFromObjectAndMapProperty(data, 'title', (arr: string[]) => arr.join(',')),\r\n type:\r\n 'recurrenceRule' in data && data.recurrenceRule && hasPreset(data.recurrenceRule)\r\n ? 'recurringEvent'\r\n : 'socialEvent',\r\n});\r\n\r\nexport const CreateSocialEventOrRecurringEventModal = ({\r\n open,\r\n closeHandler,\r\n onCreate,\r\n defaultDateSelection,\r\n}: CreateSocialEventOrRecurringEventModalProps) => {\r\n const intl = useIntl();\r\n const abortController = useAbortController();\r\n const [noAudienceModalMode, setNoAudienceModalMode] = useState<'schedule' | 'publish' | null>(null);\r\n const [isScheduleModalOpen, setScheduleModalOpen] = useState(false);\r\n const [scheduleDate, setScheduleDate] = useState<string>();\r\n const [permalinkId, setPermalinkId] = useState<string>();\r\n const platform = useSelector(Platform.selectors.selectPlatformConfig);\r\n const form = useForm<SocialEventOrRecurringEventFormValues>({\r\n defaultValues: async () => {\r\n let defaultDateStart = new Date();\r\n defaultDateStart.setMinutes(defaultDateStart.getMinutes() < 30 ? 30 : 0);\r\n defaultDateStart = defaultDateStart.getMinutes() === 0 ? addHours(defaultDateStart, 1) : defaultDateStart;\r\n let defaultDateEnd = defaultDateStart;\r\n defaultDateEnd = addHours(defaultDateEnd, 1);\r\n return {\r\n title: '',\r\n sendAlert: platform.sendAlert === 1,\r\n alertAuthor: platform.sendAlert === 1,\r\n dateStart: formatDate(defaultDateStart, 'yyyy-MM-dd HH:mm'),\r\n dateEnd: formatDate(defaultDateEnd, 'yyyy-MM-dd HH:mm'),\r\n publishTo: [],\r\n recurrenceRule: {},\r\n token: '',\r\n uri: '',\r\n bgColor: undefined,\r\n place: undefined,\r\n textColor: undefined,\r\n urlGestion: undefined,\r\n socialEventCeiling: undefined,\r\n socialEventUseCeiling: undefined,\r\n allDay: undefined,\r\n noGestion: undefined,\r\n address: undefined,\r\n uiObjectLink: undefined,\r\n image: undefined,\r\n description: undefined,\r\n useQrcode: undefined,\r\n hideFromCalendar: undefined,\r\n };\r\n },\r\n });\r\n const dispatch = useAppDispatch();\r\n const [publishLoading, setPublishLoading] = useState(false);\r\n const [scheduleLoading, setScheduleLoading] = useState(false);\r\n const [uploadLoading, setUploadLoading] = useState(false);\r\n\r\n useEffect(() => {\r\n if (open) {\r\n if (defaultDateSelection) {\r\n form.setValue(\r\n 'dateStart',\r\n formatDate(\r\n defaultDateSelection.start,\r\n defaultDateSelection.allDay ? 'yyyy-MM-dd' : 'yyyy-MM-dd HH:mm',\r\n ),\r\n );\r\n form.setValue(\r\n 'dateEnd',\r\n formatDate(\r\n defaultDateSelection.end,\r\n defaultDateSelection.allDay ? 'yyyy-MM-dd' : 'yyyy-MM-dd HH:mm',\r\n ),\r\n );\r\n form.setValue('allDay', defaultDateSelection.allDay);\r\n }\r\n jApi.network\r\n .token(abortController.signal)\r\n .then((res) => {\r\n form.setValue('token', res.result);\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\r\n });\r\n }\r\n }, [abortController.signal, defaultDateSelection, dispatch, form, intl, open]);\r\n\r\n const onSubmit = useCallback(\r\n (forceUpdate?: boolean) =>\r\n form.handleSubmit((data) => {\r\n const payload = mapFormValuesToApi(data);\r\n if ((!payload.publishTo || payload.publishTo.length === 0) && !forceUpdate) {\r\n setNoAudienceModalMode('publish');\r\n return;\r\n }\r\n setPublishLoading(true);\r\n jApi.article\r\n .create<Join<SocialEventCreation, RecurringEventCreation>, Format.LITTLE>(\r\n mapFormValuesToApi(data),\r\n {\r\n format: Format.LITTLE,\r\n },\r\n )\r\n .then((res) => {\r\n onCreate();\r\n dispatch(\r\n Toast.actions.success({\r\n label: 'GLOBAL_Successfully_Saved',\r\n link: {\r\n label: 'GLOBAL_Go_To_Content',\r\n url: res.result[0]._url,\r\n },\r\n }),\r\n );\r\n })\r\n .catch((e) => {\r\n dispatch(\r\n Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }),\r\n );\r\n })\r\n .finally(() => {\r\n setPublishLoading(false);\r\n });\r\n })(),\r\n [dispatch, form, intl, onCreate],\r\n );\r\n\r\n const onSchedule = useCallback(\r\n (scheduleDate: string, permalinkId: string, forceUpdate?: boolean) =>\r\n form.handleSubmit((data) => {\r\n const payload = mapFormValuesToApi(data);\r\n if ((!payload.publishTo || payload.publishTo.length === 0) && !forceUpdate) {\r\n setNoAudienceModalMode('schedule');\r\n setScheduleDate(scheduleDate);\r\n setPermalinkId(permalinkId);\r\n return;\r\n }\r\n setScheduleLoading(true);\r\n jApi.article\r\n .saveAsDraft(\r\n {\r\n form: payload,\r\n contentType: payload.type,\r\n scheduleDate,\r\n permalinkId,\r\n },\r\n { signal: abortController.signal },\r\n )\r\n .then(() => {\r\n onCreate();\r\n dispatch(\r\n Toast.actions.success({\r\n label: 'GLOBAL_Successfully_Saved',\r\n }),\r\n );\r\n })\r\n .catch((e) => {\r\n if (abortController.signal.aborted) return;\r\n dispatch(\r\n Toast.actions.error({ label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }),\r\n );\r\n })\r\n .finally(() => {\r\n if (abortController.signal.aborted) return;\r\n setScheduleLoading(false);\r\n });\r\n })(),\r\n [abortController.signal, dispatch, form, intl, onCreate],\r\n );\r\n\r\n const values = useWatch({ control: form.control });\r\n const isValid = useMemo(\r\n () =>\r\n zPassThrough(socialEventCreationSchema.or(recurringEventCreationSchema)).safeParse(\r\n mapFormValuesToApi(values as SocialEventOrRecurringEventFormValues),\r\n ).success,\r\n [values],\r\n );\r\n\r\n return (\r\n <>\r\n <CreateCalendarEventModal\r\n type={'socialEvent'}\r\n open={open}\r\n closeHandler={closeHandler}\r\n onSubmit={onSubmit}\r\n onSchedule={() => setScheduleModalOpen(true)}\r\n form={form}\r\n publishLoading={publishLoading}\r\n scheduleLoading={scheduleLoading}\r\n uploadLoading={uploadLoading}\r\n isValid={isValid}>\r\n <SocialEventOrRecurringEventForm form={form} setUploadLoading={setUploadLoading} mode={'create'} />\r\n </CreateCalendarEventModal>\r\n <ModalAudience\r\n open={noAudienceModalMode !== null}\r\n closeHandler={() => setNoAudienceModalMode(null)}\r\n control={form.control}\r\n onSubmit={() => {\r\n if (noAudienceModalMode === 'publish') {\r\n onSubmit(true);\r\n } else if (noAudienceModalMode === 'schedule' && scheduleDate && permalinkId) {\r\n onSchedule(scheduleDate, permalinkId, true);\r\n }\r\n }}\r\n />\r\n <ModalSchedule\r\n open={isScheduleModalOpen}\r\n closeHandler={() => setScheduleModalOpen(false)}\r\n onSubmit={({ scheduleDate, permalinkId }) => onSchedule(scheduleDate, permalinkId)}\r\n />\r\n </>\r\n );\r\n};\r\n","import jApi, { isRecurringEventOccurrence, jMeetingView, jSocialEventView } from 'jamespot-user-api';\nimport { CalendarApi, CalendarEvent, JRCCalendarProps, CalendarView, Utils } from 'jamespot-react-components';\nimport { Calendar as CalendarSlice, Hook, Toast } from 'jamespot-front-business';\nimport { Suspense, useCallback, useEffect, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { CommentsBloc } from '../CommentsBloc';\nimport useCalendarRT from '../../hooks/useCalendarRT';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { CalendarHeader } from './CalendarHeader';\nimport { CalendarToolbar } from './CalendarToolbar';\nimport { UpdateSocialEventModal } from './socialEvent/UpdateSocialEventModal';\nimport { UpdateMeetingModal } from './meeting/UpdateMeetingModal';\nimport { UpdateRecurringEventModal } from './socialEvent/UpdateRecurringEventModal';\nimport { CreateMeetingModal } from './meeting/CreateMeetingModal';\nimport { ExportCalendarModal } from './ExportCalendarModal';\nimport { CreateSocialEventOrRecurringEventModal } from './socialEvent/CreateSocialEventOrRecurringEventModal';\n\ntype Filter = ('socialEvent' | 'meeting' | 'animatedMeeting' | 'boardCard' | 'recurringEvent')[];\n\nconst Calendar = commonComponentsRegistry.getLazyComponent('Calendar');\n\nconst CommentsContainer = styled.div`\n margin-bottom: ${({ theme }) => theme.space.md}px;\n`;\n\nconst Header = styled.div<{ view: CalendarView }>`\n height: 54px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n ${({ view, theme }) => view === 'list' && `border-bottom: 1px solid ${theme.color.grey2};`}\n padding: 0 ${({ theme }) => theme.space.md}px;\n`;\n\nconst options: { label: string; value: CalendarView }[] = [\n {\n label: 'CALENDAR_dayGridMonth',\n value: 'dayGridMonth',\n },\n {\n label: 'CALENDAR_timeGridWeek',\n value: 'timeGridWeek',\n },\n {\n label: 'CALENDAR_timeGridDay',\n value: 'timeGridDay',\n },\n {\n label: 'CALENDAR_listWeek',\n value: 'list',\n },\n];\n\nexport const CalendarWrapper = ({\n views = ['dayGridMonth', 'list', 'timeGridDay', 'timeGridWeek'],\n mode = 'full',\n withPadding = true,\n withHeader = true,\n withToolbar = true,\n fluid,\n}: {\n views: Array<'dayGridMonth' | 'timeGridWeek' | 'timeGridDay' | 'list'>;\n mode?: JRCCalendarProps['mode'];\n fluid?: boolean;\n withPadding?: boolean;\n withHeader?: boolean;\n withToolbar?: boolean;\n}) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const navigate = useNavigate();\n useCalendarRT();\n const [label, setLabel] = useState<string>();\n const { loading, list, pendingStatusChanges } = useAppSelector(CalendarSlice.selectors.selectCalendarEvents);\n const [calendarApi, setCalendarApi] = useState<CalendarApi>();\n const [eventToUpdate, setEventToUpdate] = useState<CalendarEvent | null>(null);\n const [isExportModalOpen, setExportModalOpen] = useState(false);\n const [dateSelection, setDateSelection] = useState<{ start: Date; end: Date; allDay: boolean } | null>(null);\n const globalDefaultView = useAppSelector((state) => Hook.selectors.selectHook(state, 'calendarHook'))?.defaultView;\n const defaultView = useMemo(() => {\n const urlQuery = new URLSearchParams(window.location.search).get('view');\n switch (urlQuery) {\n case 'dayGridMonth':\n case 'timeGridDay':\n case 'timeGridWeek':\n case 'list':\n return urlQuery;\n default:\n switch (globalDefaultView) {\n case 'month':\n default:\n return 'dayGridMonth';\n case 'week':\n return 'timeGridWeek';\n case 'day':\n return 'timeGridDay';\n case 'list':\n return 'list';\n }\n }\n }, [globalDefaultView]);\n\n const viewsOptions = useMemo<{ label: string; value: CalendarView }[]>(\n () =>\n options\n .filter((el) => views.includes(el.value))\n .map((option) => {\n return { label: intl.formatMessage({ id: option.label }), value: option.value };\n }),\n [views, intl],\n );\n const [view, setView] = useState<(typeof viewsOptions)[number]>(\n viewsOptions.find((v) => v.value === defaultView) ?? viewsOptions[0],\n );\n\n const navigateWithQuery = useCallback(\n (queries: { types?: Filter; view?: CalendarView }) => {\n const params = new URLSearchParams(window.location.search);\n if (queries.types !== undefined) {\n if (queries.types.length > 0) {\n params.set('types', queries.types.join(','));\n } else {\n params.delete('types');\n }\n }\n if (queries.view !== undefined) {\n if (queries.view) {\n params.set('view', queries.view);\n } else {\n params.delete('view');\n }\n }\n navigate(`?${params.toString()}`, { replace: true });\n },\n [navigate],\n );\n\n const onError = useCallback(\n (err?: string) => {\n dispatch(Toast.actions.error({ label: err ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const onSuccess = useCallback(\n (message: string) => {\n dispatch(Toast.actions.success({ label: message }));\n },\n [dispatch],\n );\n\n const handleChangeView = useCallback(\n (view: { label: string; value: CalendarView }) => {\n setView(view);\n navigateWithQuery({ view: view.value });\n },\n [navigateWithQuery],\n );\n\n const handleChangeDates = useCallback(\n (start: Date, end: Date) => {\n const dates = { start: Utils.date.formatDate(start), end: Utils.date.formatDate(end) };\n dispatch(CalendarSlice.actions.setDates(dates));\n },\n [dispatch],\n );\n\n const [creationType, setCreationType] = useState<'socialEvent' | 'meeting' | 'animatedMeeting' | null>(null);\n\n useEffect(() => {\n dispatch(\n CalendarSlice.actions.setTypes(\n (new URLSearchParams(window.location.search)\n .get('types')\n ?.split(',')\n .filter((type) =>\n ['socialEvent', 'meeting', 'animatedMeeting', 'boardCard'].includes(type),\n ) as Filter) ?? [],\n ),\n );\n }, [dispatch]);\n\n return (\n <>\n {(withHeader || withToolbar) && (\n <Header view={view.value}>\n {withHeader && <CalendarHeader />}\n {withToolbar && (\n <Suspense fallback={<></>}>\n <CalendarToolbar\n label={label}\n isLoading={loading === 'pending'}\n view={view}\n calendarApi={calendarApi}\n viewsOptions={viewsOptions}\n navigateWithQuery={navigateWithQuery}\n setView={setView}\n setCreationType={setCreationType}\n setExportModalOpen={setExportModalOpen}\n />\n <CreateSocialEventOrRecurringEventModal\n defaultDateSelection={dateSelection}\n closeHandler={() => {\n setCreationType(null);\n setDateSelection(null);\n }}\n open={creationType === 'socialEvent' || !!dateSelection}\n onCreate={() => {\n setCreationType(null);\n setDateSelection(null);\n }}\n />\n <CreateMeetingModal\n closeHandler={() => setCreationType(null)}\n open={creationType === 'meeting'}\n onCreate={() => {\n setCreationType(null);\n }}\n />\n <ExportCalendarModal\n open={isExportModalOpen}\n closeHandler={() => setExportModalOpen(false)}\n />\n </Suspense>\n )}\n </Header>\n )}\n <Calendar\n fluid={fluid}\n mode={mode}\n fullScreen\n withPadding={withPadding}\n events={list}\n loading={loading === 'pending'}\n handler={{\n global: jApi.global,\n calendar: jApi.calendar,\n article: jApi.article,\n }}\n defaultView={view.value}\n eventModalExtraComponent={({ id, uri, _right, type }) => {\n if (type === 'recurringEventOccurrence') return null;\n return (\n <CommentsContainer>\n <CommentsBloc articleId={id} articleUri={uri} canComment={_right.comment} />\n </CommentsContainer>\n );\n }}\n deportedToolbar={{\n onChangeLabel: setLabel,\n onCalendarApiInit: setCalendarApi,\n view,\n }}\n onChangeDates={handleChangeDates}\n onError={onError}\n onSuccess={onSuccess}\n onChangeView={handleChangeView}\n onDeleteEvent={() => {\n dispatch(\n Toast.actions.success({ label: intl.formatMessage({ id: 'GLOBAL_Successfully_Deleted' }) }),\n );\n }}\n onClickUpdateEvent={setEventToUpdate}\n onUpdateStatus={(params) => dispatch(CalendarSlice.actions.changeResponse(params))}\n isUpdateStatusLoading={(id) => pendingStatusChanges.some((psc) => psc.eventId === id)}\n onSelect={setDateSelection}\n disableSelect={dateSelection !== null || creationType !== null}\n />\n <UpdateSocialEventModal\n event={eventToUpdate?.type === 'socialEvent' ? (eventToUpdate as jSocialEventView) : undefined}\n onUpdate={() => {\n setEventToUpdate(null);\n }}\n closeHandler={() => setEventToUpdate(null)}\n />\n <UpdateMeetingModal\n meeting={eventToUpdate?.type === 'meeting' ? (eventToUpdate as jMeetingView) : undefined}\n onUpdate={() => {\n setEventToUpdate(null);\n }}\n closeHandler={() => setEventToUpdate(null)}\n />\n <UpdateRecurringEventModal\n event={eventToUpdate && isRecurringEventOccurrence(eventToUpdate) ? eventToUpdate : undefined}\n onUpdate={() => {\n setEventToUpdate(null);\n }}\n closeHandler={() => setEventToUpdate(null)}\n />\n </>\n );\n};\n","import { useEffect, useMemo } from 'react';\nimport { Calendar } from 'jamespot-front-business';\nimport socket from '../utils/socket';\nimport { useAppDispatch } from '../redux/store';\nimport jApi from 'jamespot-user-api';\n\nconst useCalendarRT = () => {\n const dispatch = useAppDispatch();\n const reactSocket = useMemo(() => socket, []);\n const rtHandlers = useMemo(() => Calendar.getCalendarRTHandlers(dispatch, jApi), [dispatch]);\n\n useEffect(() => {\n rtHandlers.forEach((handler) => {\n reactSocket.onMessage(handler.namespace, handler.function, handler.handler);\n });\n return () => {\n rtHandlers.forEach((handler) => {\n reactSocket.offMessage(handler.namespace, handler.function, handler.handler);\n });\n };\n }, [rtHandlers, reactSocket]);\n};\n\nexport default useCalendarRT;\n","import styled from 'styled-components';\nimport { EDITOR_MENU_WIDTH, EDITOR_WIDTH } from './const';\nimport { DashedFocusBorder } from 'jamespot-react-components';\n\nconst INPUT_HEIGHT = 50;\nconst RADIUS = 8;\n\nexport const CSSEditorComponentWrapper = styled.div`\n margin-bottom: 24px;\n`;\n\nexport const CSSEditorComponentLabel = styled.div`\n margin-bottom: 4px;\n`;\n\nexport const CSSEditorPortal = styled.div<{ isActive: boolean }>`\n position: absolute;\n background-color: ${(props) => (props.isActive ? 'rgba(0,0,0,.1)' : 'transparent')};\n inset: 0;\n pointer-events: ${(props) => (props.isActive ? 'all' : 'none')};\n flex: 1;\n display: flex;\n overflow: hidden;\n`;\n\nexport const CSSEditorHeader = styled.div`\n flex-direction: row;\n display: flex;\n min-height: 60px;\n border-bottom: 1px solid ${(props) => props.theme.color.grey2};\n`;\n\nexport const CSSEditorAction = styled.div`\n width: 60px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const CSSEditorLabel = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\n// This is a mask to hide top shadow. EDITOR_WIDTH + 20 is used to keep the left shadow\nexport const CSSEditorMask = styled.div`\n position: relative;\n overflow: hidden;\n top: 0px;\n width: ${EDITOR_WIDTH + 20}px;\n`;\n\nexport const CSSEditor = styled.div<{ position: 'left' | 'right' }>`\n position: absolute;\n top: 0;\n ${(props) => (props.position === 'left' ? 'left: 0px;' : '')}\n ${(props) => (props.position === 'right' ? 'right: -1000px;' : '')}\n width: ${EDITOR_WIDTH}px;\n bottom: 00px;\n display: flex;\n background-color: ${(props) => props.theme.color.white};\n flex-direction: row;\n transition: all 0.4s;\n box-shadow: -4px 0px 20px 0px #00000017;\n\n &.animate {\n right: 0px;\n }\n`;\n\nexport const CSSEditorContent = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 12px;\n overflow: auto;\n margin-bottom: 12px;\n position: relative;\n`;\n\nexport const CSSEditorTab = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n`;\n\nexport const CSSEditorIsBusy = styled.div`\n position: absolute;\n inset: 0;\n background-color: rgba(255, 255, 255, 0.8);\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const CSSEditorIsLocked = styled.div`\n position: absolute;\n inset: 0;\n background-color: ${(props) => props.theme.color.white};\n padding: ${(props) => props.theme.space.md}px;\n`;\n\nexport const CSSEditorMenu = styled.div`\n width: ${EDITOR_MENU_WIDTH}px;\n padding-top: 60px;\n display: flex;\n flex-direction: column;\n border-right: 1px solid ${(props) => props.theme.color.grey2};\n`;\n\nexport const CSSEditorMenuButton = styled.button<{ isActive?: boolean }>`\n border-radius: 4px;\n cursor: pointer;\n height: 42px;\n margin: 4px;\n width: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${(props) => (props.isActive ? props.theme.color.grey2 : props.theme.color.white)};\n\n ${DashedFocusBorder()}\n\n &:hover {\n background-color: ${(props) => props.theme.color.grey2};\n }\n`;\n\nexport const CSSInputWrapper = styled.div`\n display: flex;\n border: 1px solid ${(props) => props.theme.color.grey1};\n border-radius: ${RADIUS}px;\n margin-bottom: 24px;\n input {\n width: 100%;\n border: 0;\n height: ${INPUT_HEIGHT}px;\n margin: 0;\n }\n`;\n\nexport const CSSEditorWidget = styled.div`\n display: flex;\n flex-direction: row;\n padding: 12px;\n background-color: ${(props) => props.theme.color.grey0};\n border-radius: 8px;\n margin-bottom: 4px;\n`;\n\nexport const CSSEditorWidgetLabel = styled.div`\n display: flex;\n flex: 1;\n align-items: center;\n`;\n\nexport const CSSEditorWidgetOption = styled.div`\n width: 40px;\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nexport const CSSEditorLayer = styled.div`\n flex-direction: row;\n display: flex;\n align-items: center;\n`;\n\nexport const CSSEditorLayerTitle = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n`;\n","export const EDITOR_TOP = 90;\nexport const EDITOR_WIDTH = 440;\nexport const EDITOR_MENU_WIDTH = 50;\nexport const EDITOR_CONTENT_WIDTH = EDITOR_WIDTH - EDITOR_MENU_WIDTH;\n","import { CSSEditorAction, CSSEditorHeader, CSSEditorLabel, CSSEditorMenuButton } from './style';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { WidgetEditor } from 'jamespot-front-business';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\nconst JRCIcon = commonComponentsRegistry.getLazyComponent('Icon');\n\n/*\n Editor popup (center part)\n*/\nexport const EditorPopup = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid));\n\n const onClick = () => {\n dispatch(WidgetEditor.slice.actions.flushEditorPopup({ uniqid }));\n };\n\n const onSave = () => {\n dispatch(WidgetEditor.slice.actions.flushEditorPopup({ uniqid }));\n };\n\n if (editor && editor.popup && editor.view) {\n return (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', backgroundColor: 'white', marginTop: 90 }}>\n <CSSEditorHeader>\n <CSSEditorAction />\n <CSSEditorLabel>Popup</CSSEditorLabel>\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClick}>\n <JRCIcon name=\"icon-times\" color=\"grey2\" size={26.75} />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n </CSSEditorHeader>\n <div style={{ flex: 1, display: 'flex' }}>{editor.view}</div>\n <CSSEditorHeader>\n <JRCButton onClick={onSave}>Save</JRCButton>\n </CSSEditorHeader>\n </div>\n );\n }\n\n return <></>;\n};\n","import { Hook, Toast, updateWidgetContent, Widget, WidgetEditor } from 'jamespot-front-business';\nimport { Utils } from 'jamespot-react-components';\nimport jamespot, {\n CombinedWidgetContent,\n ensureWidgetArticleAttachmentType,\n ensureWidgetArticleButtonType,\n ensureWidgetArticleGalleryType,\n ensureWidgetArticleImageType,\n ensureWidgetArticleSliderType,\n ensureWidgetArticleTextType,\n ensureWidgetArticleTitleType,\n ensureWidgetCalendarCalDavType,\n ensureWidgetCheckListType,\n ensureWidgetContactCardDavType,\n ensureWidgetDatasourceTableType,\n ensureWidgetEmailsImapType,\n ensureWidgetExcelDatasourceTableType,\n ensureWidgetExtensionType,\n ensureWidgetLuccaAbsenceType,\n ensureWidgetPresenceType,\n ensureWidgetQuickSurveyType,\n ensureWidgetUserProfileType,\n ensureWidgetColorType,\n ensureWidgetWelcomeType,\n // hygen: inject:here ensure\n HookListType,\n WidgetArticleAttachmentContent,\n WidgetArticleButtonContent,\n WidgetArticleGalleryContent,\n WidgetArticleImageContent,\n WidgetArticleSliderContent,\n WidgetArticleTextContent,\n WidgetArticleTitleContent,\n WidgetCheckListContent,\n WidgetDatasourceTableContent,\n WidgetExtensionContent,\n WidgetPresenceContent,\n WidgetQuickSurveyContent,\n WidgetWelcomeContent,\n WidgetStateProps,\n WidgetUserProfileContent,\n WidgetColorContent,\n // hygen: inject:here content\n} from 'jamespot-user-api';\nimport { ReactElement } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { store } from '../../redux/initStore';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\n\nconst WidgetArticleTitleEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleTitleEditor');\nconst WidgetArticleTextEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleTextEditor');\nconst WidgetArticleGalleryEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleGalleryEditor');\nconst WidgetArticleAttachmentEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleAttachmentEditor');\nconst WidgetArticleSliderEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleSliderEditor');\nconst WidgetArticleImageEditor = commonComponentsRegistry.getLazyComponent('WidgetArticleImageEditor');\nconst WidgetButtonEditor = commonComponentsRegistry.getLazyComponent('WidgetButtonEditor');\nconst WidgetCheckListEditor = commonComponentsRegistry.getLazyComponent('WidgetCheckListEditor');\nconst WidgetQuickSurveyEditor = commonComponentsRegistry.getLazyComponent('WidgetQuickSurveyEditor');\nconst WidgetDatasourceTableEditor = commonComponentsRegistry.getLazyComponent('WidgetDatasourceTableEditor');\nconst WidgetExcelDatasourceTableEditor = commonComponentsRegistry.getLazyComponent('WidgetExcelDatasourceTableEditor');\nconst WidgetPresenceEditor = commonComponentsRegistry.getLazyComponent('WidgetPresenceEditor');\nconst WidgetLuccaAbsenceEditor = commonComponentsRegistry.getLazyComponent('WidgetLuccaAbsenceEditor');\nconst WidgetEmailsImapEditor = commonComponentsRegistry.getLazyComponent('WidgetEmailsImapEditor');\nconst WidgetContactCardDavEditor = commonComponentsRegistry.getLazyComponent('WidgetContactCardDavEditor');\nconst WidgetCalendarCalDavEditor = commonComponentsRegistry.getLazyComponent('WidgetCalendarCalDavEditor');\nconst WidgetUserProfileEditor = commonComponentsRegistry.getLazyComponent('WidgetUserProfileEditor');\nconst WidgetColorEditor = commonComponentsRegistry.getLazyComponent('WidgetColorEditor');\nconst WidgetWelcomeEditor = commonComponentsRegistry.getLazyComponent('WidgetWelcomeEditor');\nconst WidgetExtensionEditor = commonComponentsRegistry.getLazyComponent('WidgetExtensionEditor');\n// hygen: inject:here getLazy\n\n/*\n Editor Factory\n*/\nexport const Editor = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const token = useAppSelector(Widget.selectors.selectToken);\n const widgetWrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n\n const onSaveCallback = useAppSelector(\n (state) => WidgetEditor.selectors.selectEditor(state, uniqid)?.onSave,\n shallowEqual,\n );\n\n const handleHookIsActive = (name: keyof HookListType) => {\n return Hook.selectors.selectHook(store.getState(), name)?.isActive;\n };\n\n const onSave = (content: Partial<CombinedWidgetContent>) => {\n /*\n Update widget & Flush editor\n */\n if (widgetWrapper) {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content }));\n }\n\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n\n if (onSaveCallback) {\n onSaveCallback(content);\n }\n };\n\n const onStateChange = (states: WidgetStateProps, id?: string) => {\n /*\n Set widget state (busy, loading, initialized)\n */\n if (id !== undefined) {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid: id, ...states }));\n } else {\n dispatch(Widget.slice.actions.setWidgetState({ uniqid, ...states }));\n }\n };\n\n const onOpen = (view: ReactElement) => {\n /*\n Register popup (central)\n */\n dispatch(WidgetEditor.slice.actions.registerEditorPopup({ uniqid, view }));\n };\n\n const widget = widgetWrapper?.widget;\n\n if (!widget) return null;\n\n if (ensureWidgetArticleButtonType(widget)) {\n return (\n <WidgetButtonEditor\n {...widget.content}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleButtonContent>(uniqid, content, false));\n }}\n onSave={() => onSave({})}\n />\n );\n } else if (ensureWidgetArticleGalleryType(widget)) {\n return (\n <WidgetArticleGalleryEditor\n token={token}\n content={widget.content}\n onChange={(content) =>\n dispatch(updateWidgetContent<WidgetArticleGalleryContent>(uniqid, content, false))\n }\n onSave={onSave}\n onStateChange={onStateChange}\n />\n );\n } else if (ensureWidgetArticleAttachmentType(widget)) {\n return (\n <WidgetArticleAttachmentEditor\n token={token}\n content={widget.content}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleAttachmentContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n onOpen={onOpen}\n />\n );\n } else if (ensureWidgetLuccaAbsenceType(widget)) {\n return <WidgetLuccaAbsenceEditor />;\n } else if (ensureWidgetArticleImageType(widget)) {\n return (\n <WidgetArticleImageEditor\n content={widget.content}\n token={token}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleImageContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n />\n );\n } else if (ensureWidgetArticleSliderType(widget)) {\n return token !== undefined ? (\n <WidgetArticleSliderEditor\n slides={widget.content.slides ?? []}\n loop={widget.content.loop ?? false}\n useDots={widget.content.useDots ?? true}\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleSliderContent>(uniqid, content, false));\n }}\n token={token}\n onSave={onSave}\n />\n ) : (\n <>Token is mandatory</>\n );\n } else if (ensureWidgetArticleTitleType(widget)) {\n return (\n <WidgetArticleTitleEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleTitleContent>(uniqid, content, false));\n }}\n onSave={onSave}\n content={widget.content}\n onOpen={onOpen}\n />\n );\n } else if (ensureWidgetArticleTextType(widget)) {\n return (\n <WidgetArticleTextEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetArticleTextContent>(uniqid, content, false));\n }}\n onSave={onSave}\n content={widget.content}\n />\n );\n } else if (ensureWidgetPresenceType(widget)) {\n return (\n <WidgetPresenceEditor\n onChange={(content) => {\n dispatch(updateWidgetContent<WidgetPresenceContent>(uniqid, content, false));\n }}\n onSave={onSave}\n onStateChange={onStateChange}\n {...widget.content}\n />\n );\n } else if (ensureWidgetCheckListType(widget)) {\n return (\n <WidgetCheckListEditor\n token={token}\n uniqid={widget.uniqid}\n content={{\n ...widget.content,\n arr: widget.content.arr?.map((w) => ({\n ...w,\n title: Utils.html.htmlDecodeSpecialChars(w.title),\n })),\n }}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent(uniqid, content, false));\n }}\n onChangeWrapper={(content) => {\n dispatch(\n Widget.slice.actions.updateWidgetWrapper({\n ...content,\n title: Utils.html.htmlDecodeSpecialChars(content.title),\n }),\n );\n }}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetCheckListContent>(uniqid, content, false))\n }\n />\n );\n } else if (ensureWidgetQuickSurveyType(widget)) {\n return (\n <WidgetQuickSurveyEditor\n token={token}\n uniqid={widget.uniqid}\n content={widget.content}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent<WidgetQuickSurveyContent>(uniqid, content, false));\n }}\n onChangeWrapper={(content) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ ...content }));\n }}\n handleChange={(content) =>\n dispatch(updateWidgetContent<WidgetQuickSurveyContent>(uniqid, content, false))\n }\n />\n );\n } else if (ensureWidgetExcelDatasourceTableType(widget)) {\n return (\n <WidgetExcelDatasourceTableEditor\n {...widget.content}\n uri={widget.content.uri}\n limit={widget.content.limit ?? 20}\n hook={{ isActive: handleHookIsActive }}\n handlers={{\n jamespot: {\n datasource: jamespot.datasource,\n network: jamespot.network,\n filebank: jamespot.filebank,\n wedoc: jamespot.wedoc,\n },\n handleStart: () => onStateChange({ busy: true }),\n handleCatch: (err) => dispatch(Toast.actions.error({ label: err.errorMsg })),\n handleFinally: () => onStateChange({ busy: false }),\n }}\n onSave={onSave}\n onChange={(content, override) =>\n dispatch(updateWidgetContent<WidgetDatasourceTableContent>(uniqid, content, override ?? false))\n }\n onStateChange={onStateChange}\n onError={(label) => dispatch(Toast.actions.error({ label }))}\n />\n );\n } else if (ensureWidgetEmailsImapType(widget)) {\n return <WidgetEmailsImapEditor />;\n } else if (ensureWidgetExtensionType(widget)) {\n return (\n <WidgetExtensionEditor\n extensionName={widget.content.extensionName}\n onChange={(content, override) =>\n dispatch(updateWidgetContent<WidgetExtensionContent>(uniqid, content, override ?? false))\n }\n onSave={onSave}\n onStateChange={onStateChange}\n />\n );\n } else if (ensureWidgetContactCardDavType(widget)) {\n return <WidgetContactCardDavEditor />;\n } else if (ensureWidgetCalendarCalDavType(widget)) {\n return <WidgetCalendarCalDavEditor />;\n } else if (ensureWidgetDatasourceTableType(widget)) {\n return (\n <WidgetDatasourceTableEditor\n {...widget.content}\n uri={widget.content.uri}\n limit={widget.content.limit ?? 20}\n hook={{ isActive: handleHookIsActive }}\n handlers={{\n jamespot: {\n datasource: jamespot.datasource,\n network: jamespot.network,\n application: jamespot.application,\n filebank: jamespot.filebank,\n },\n handleStart: () => onStateChange({ busy: true }),\n handleCatch: (err) => dispatch(Toast.actions.error({ label: err.errorMsg })),\n handleFinally: () => onStateChange({ busy: false }),\n }}\n onSave={onSave}\n onChange={(content, override) =>\n dispatch(updateWidgetContent<WidgetDatasourceTableContent>(uniqid, content, override ?? false))\n }\n onStateChange={onStateChange}\n onError={(label) => {\n dispatch(Toast.actions.error({ label }));\n }}\n />\n );\n } else if (ensureWidgetUserProfileType(widget)) {\n return (\n <WidgetUserProfileEditor\n uniqid={widget.uniqid}\n content={widget.content}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent<WidgetUserProfileContent>(uniqid, content, false));\n }}\n />\n );\n } else if (ensureWidgetColorType(widget)) {\n return (\n <WidgetColorEditor\n uniqid={widget.uniqid}\n content={widget.content}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent<WidgetColorContent>(uniqid, content, false));\n }}\n />\n );\n } else if (ensureWidgetWelcomeType(widget)) {\n return (\n <WidgetWelcomeEditor\n uniqid={widget.uniqid}\n content={widget.content}\n onChangeContent={(uniqid, content) => {\n dispatch(updateWidgetContent<WidgetWelcomeContent>(uniqid, content, false));\n }}\n />\n );\n // hygen: inject:here elseif\n } else {\n return <>cannot display editor</>;\n }\n};\n","import { CSSEditorAction, CSSEditorMenuButton } from './style';\nimport { WidgetEditor } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppDispatch } from '../../redux/store';\n\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\n\nimport { useTheme } from 'styled-components';\n\nexport const EditorPosition = ({ uniqid, position }: { uniqid: string; position: 'left' | 'right' }) => {\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const onClick = () => {\n dispatch(\n WidgetEditor.slice.actions.setEditorPosition({ uniqid, position: position === 'left' ? 'right' : 'left' }),\n );\n };\n\n return (\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClick}>\n <Icon\n name={position === 'left' ? 'icon-angle-right' : 'icon-angle-left'}\n color={theme.color.lavender}\n size={26.75}\n />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n );\n};\n","import styled, { useTheme } from 'styled-components';\nimport { useIntl, FormattedMessage } from 'react-intl';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst InputColorRaw = commonComponentsRegistry.getLazyComponent('InputColorRaw');\n\nexport const Label = styled.label`\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 8px;\n font-size: 14px;\n width: 100%;\n min-height: 20px;\n`;\n\nexport const Fieldset = styled.fieldset`\n margin: 12px 0px !important;\n width: 100% !important;\n`;\n\nexport const EditorInputColor = ({\n label,\n initialValue,\n handleChange,\n}: {\n label: string;\n initialValue?: string;\n handleChange: (color: string) => void;\n}) => {\n const theme = useTheme();\n const intl = useIntl();\n\n const palettes = [\n {\n name: intl.formatMessage({ id: 'GLOBAL_Platform_Color' }),\n colors: [\n theme.color.primary,\n theme.color.secondary,\n theme.color.headerColor,\n theme.color.lavender,\n theme.color.orange,\n theme.color.green,\n theme.color.navy,\n theme.color.overseas,\n theme.color.transparentHexa,\n ],\n },\n ];\n\n return (\n <Fieldset>\n <Label>\n <FormattedMessage id={label} />\n </Label>\n <InputColorRaw\n palettes={palettes}\n label={label}\n initialValue={initialValue ?? theme.color.primary}\n name={`background-color`}\n onChange={handleChange}\n />\n </Fieldset>\n );\n};\n","import { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useEffect } from 'react';\n\nconst JRCInputNumber = commonComponentsRegistry.getLazyComponent('InputNumber');\n\nexport const EditorInputNumber = ({\n label,\n initialValue,\n handleChange,\n}: {\n label: string;\n initialValue?: string;\n handleChange: (value: string) => void;\n}) => {\n const intl = useIntl();\n\n const { control, watch } = useForm({\n defaultValues: { value: initialValue ?? '0' },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data) => {\n handleChange(data.value ?? '');\n });\n return () => subscription.unsubscribe();\n }, [watch, handleChange]);\n\n return (\n <JRCInputNumber\n label={label}\n name={'value'}\n width=\"100%\"\n control={control}\n placeholder={intl.formatMessage({ id: label })}\n />\n );\n};\n","import { useEffect, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\n\nexport type EditorSelectOption = { label: string; value: string };\nexport type EditorSelectOptions = EditorSelectOption[];\n\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\n\nconst InputSelectExtended = commonComponentsRegistry.getLazyComponent('InputSelectExtended');\n\nexport const EditorInputSelect = ({\n label,\n options = [],\n initialValue,\n required = false,\n handleChange,\n}: {\n label: string;\n options: { label: string; value: string }[];\n initialValue?: string;\n required: boolean;\n handleChange: (value: string) => void;\n}) => {\n const optionFromInitialValue = useMemo(() => {\n if (initialValue && options.find((el) => el.value === initialValue)) {\n return options.find((el) => el.value === initialValue);\n }\n\n return options[0];\n }, [initialValue, options]);\n\n const { control, watch } = useForm({\n defaultValues: { select: optionFromInitialValue },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data: any) => {\n handleChange(data.select.value);\n });\n return () => subscription.unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [watch, handleChange]);\n\n return (\n <InputSelectExtended\n options={options}\n label={label}\n getValue={(o) => o.value}\n getLabel=\"label\"\n getSearch=\"label\"\n rules={{ required }}\n hideDeleteIcon={true}\n required={required}\n control={control}\n name={'select'}\n />\n );\n};\n","import { Widget } from 'jamespot-front-business';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useIntl } from 'react-intl';\n\nimport { EditorInputColor } from './components/EditorInputColor';\nimport { EditorInputNumber } from './components/EditorInputNumber';\nimport { EditorInputSelect } from './components/EditorInputSelect';\n\nimport { shallowEqual } from 'react-redux';\nimport { useTheme } from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\n\nconst JRCInputText = commonComponentsRegistry.getLazyComponent('InputText');\n\n/*\n Editor tab wrapper (this is all the properties available on a widget wrapper)\n*/\nexport const EditorTabWrapper = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const wrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid));\n const widgetContext = useAppSelector((state) => Widget.selectors.selectWidgetContext(state, uniqid), shallowEqual);\n const theme = useTheme();\n\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetTitleStyle(state, uniqid), shallowEqual);\n\n const { control, watch } = useForm({\n defaultValues: { text: wrapper?.title.replace(/&amp;/g, '&') ?? '' },\n criteriaMode: 'all',\n });\n\n useEffect(() => {\n const subscription = watch((data: any) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, title: data.text }));\n });\n return () => subscription.unsubscribe();\n }, [watch, uniqid, dispatch]);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor: styles && styles['background-color'] ? String(styles['background-color']) : 'transparent',\n fontSize: styles && styles['font-size'] ? String(styles['font-size']) : '24',\n fontWeight: styles && styles['font-weight'] ? String(styles['font-weight']) : 'medium',\n textAlign: styles && styles['text-align'] ? String(styles['text-align']) : 'left',\n };\n }, [styles, theme]);\n\n const handleChange = useCallback(\n (name: string, value: string | number) => {\n dispatch(\n Widget.slice.actions.setWidgetTitleStyle({\n uniqid,\n styles: { [name]: value },\n }),\n );\n },\n [dispatch, uniqid],\n );\n\n return wrapper ? (\n <>\n <JRCInputText\n name={'text'}\n label={'WIDGET_Title'}\n width=\"100%\"\n control={control}\n placeholder={intl.formatMessage({ id: 'WIDGET_Title' })}\n />\n {widgetContext !== 'comment' && (\n <>\n <EditorInputColor\n label=\"STYLE_Text_Color\"\n initialValue={initialValues.color}\n handleChange={(colorValue) => handleChange('color', colorValue)}\n />\n <EditorInputColor\n label=\"STYLE_Background_Color\"\n initialValue={initialValues.backgroundColor}\n handleChange={(backgroundColorValue) => handleChange('background-color', backgroundColorValue)}\n />\n <EditorInputNumber\n label={'STYLE_Text_Size'}\n initialValue={initialValues.fontSize}\n handleChange={(fontSizeValue) => handleChange('font-size', fontSizeValue)}\n />\n <EditorInputSelect\n label={'STYLE_Font_Weight'}\n initialValue={initialValues.fontWeight}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Normal' }), value: 'normal' },\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Medium' }), value: 'medium' },\n { label: intl.formatMessage({ id: 'STYLE_Font_Weight_Bold' }), value: 'bold' },\n ]}\n required={false}\n handleChange={(fontWeightValue) => handleChange('font-weight', fontWeightValue)}\n />\n <EditorInputSelect\n label={'STYLE_Text_Align'}\n initialValue={initialValues.textAlign}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Left' }), value: 'left' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Center' }), value: 'center' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Justify' }), value: 'justify' },\n { label: intl.formatMessage({ id: 'STYLE_Text_Align_Right' }), value: 'right' },\n ]}\n required={false}\n handleChange={(textAlignValue) => handleChange('text-align', textAlignValue)}\n />\n </>\n )}\n </>\n ) : (\n <></>\n );\n};\n","import { shallowEqual } from 'react-redux';\nimport { CSSEditorIsBusy } from '../style';\nimport { Widget } from 'jamespot-front-business';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppSelector } from '../../../redux/store';\n\nconst Loader = commonComponentsRegistry.getLazyComponent('Loader');\n\nexport const EditorIsBusy = ({ uniqid }: { uniqid: string }) => {\n const isBusy = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid), shallowEqual)?.busy;\n return (\n <>\n {isBusy && (\n <CSSEditorIsBusy>\n <Loader size={'l'} />\n </CSSEditorIsBusy>\n )}\n </>\n );\n};\n","import { useIntl } from 'react-intl';\nimport { CSSEditorIsLocked } from '../style';\nimport { shallowEqual } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { useAppSelector } from '../../../redux/store';\n\nexport const EditorIsLocked = ({ uniqid }: { uniqid: string }) => {\n const intl = useIntl();\n const isLocked = useAppSelector((state) => Widget.selectors.selectWidgetState(state, uniqid), shallowEqual)?.locked;\n return isLocked ? (\n <CSSEditorIsLocked>{intl.formatMessage({ id: 'INTRANET_Panel_Change_Off' })}</CSSEditorIsLocked>\n ) : (\n <></>\n );\n};\n","import { shallowEqual } from 'react-redux';\nimport { Toast, Widget, WidgetEditor } from 'jamespot-front-business';\nimport jApi, { CombinedWidgetContent, WidgetDisplayMode } from 'jamespot-user-api';\nimport { useIntl } from 'react-intl';\nimport { commonComponentsRegistry } from '../../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../../redux/store';\n\nconst JRCButton = commonComponentsRegistry.getLazyComponent('Button');\n\nexport const EditorSave = ({ uniqid, mode }: { uniqid: string; mode: WidgetDisplayMode }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const wrapper = useAppSelector((state) => Widget.selectors.selectWidget(state, uniqid), shallowEqual);\n const uri = useAppSelector((state) => Widget.selectors.selectWidgetObjectUri(state, uniqid), shallowEqual);\n\n const handleClick = () => {\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n const content = wrapper && wrapper.widget && wrapper.widget.content;\n if (!uri || !wrapper || !content) return;\n if (mode == 'view') {\n jApi.widget\n .updateWidget<CombinedWidgetContent>({\n uri,\n uniqid: uniqid,\n title: wrapper.title,\n content: content as CombinedWidgetContent,\n v2: true,\n })\n .catch((e: any) => {\n dispatch(\n Toast.actions.error({\n label: e.errorMsg ?? intl.formatMessage({ id: 'GLOBAL_Error' }),\n }),\n );\n });\n }\n\n if (mode === 'edit') {\n dispatch(Widget.slice.actions.updateWidget({ uniqid, content: content as CombinedWidgetContent }));\n }\n };\n\n return (\n <JRCButton color=\"valid\" onClick={handleClick}>\n {intl.formatMessage({ id: 'GLOBAL_Save' })}\n </JRCButton>\n );\n};\n","import { useCallback, useMemo } from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { useTheme } from 'styled-components';\n\nimport { shallowEqual } from 'react-redux';\nimport { Widget } from 'jamespot-front-business';\nimport { EditorInputNumber } from './components/EditorInputNumber';\nimport { EditorInputSelect } from './components/EditorInputSelect';\nimport { EditorInputColor } from './components/EditorInputColor';\n\nimport { useAppSelector, useAppDispatch } from '../../redux/store';\n\nexport const EditorTabWidgetSelection = ({ uniqid }: { uniqid: string }) => {\n const theme = useTheme();\n const dispatch = useAppDispatch();\n const intl = useIntl();\n\n const styles = useAppSelector((state) => Widget.selectors.selectWidgetWrapperStyle(state, uniqid), shallowEqual);\n\n const initialValues = useMemo(() => {\n return {\n color: styles && styles['color'] ? String(styles['color']) : theme.color.black,\n backgroundColor:\n styles && styles['background-color'] ? String(styles['background-color']) : theme.color.white,\n padding: styles && styles['padding'] ? String(styles['padding']) : '0',\n borderRadius: styles && styles['border-radius'] ? String(styles['border-radius']) : '0',\n borderColor: styles['border-color'] ? String(styles['border-color']) : theme.color.black,\n borderWidth: styles['border-width'] ? String(styles['border-width']) : '0',\n borderStyle: styles['border-style'] ? String(styles['border-style']) : 'none',\n };\n }, [styles, theme]);\n\n const handleChange = useCallback(\n (name: string, value: string) => {\n dispatch(\n Widget.slice.actions.setWidgetWrapperStyle({\n uniqid,\n styles: { [name]: value },\n }),\n );\n },\n [uniqid, dispatch],\n );\n\n return (\n <>\n <EditorInputColor\n label={'STYLE_Background_Color'}\n initialValue={initialValues.backgroundColor}\n handleChange={(backgroundColorValue) => handleChange('background-color', backgroundColorValue)}\n />\n <EditorInputColor\n label={'STYLE_Text_Color'}\n initialValue={initialValues.color}\n handleChange={(color) => handleChange('color', color)}\n />\n <hr />\n <EditorInputNumber\n label={'STYLE_Padding'}\n initialValue={initialValues.padding}\n handleChange={(paddingValue) => handleChange('padding', String(paddingValue))}\n />\n <EditorInputNumber\n label={'STYLE_Radius'}\n initialValue={initialValues.borderRadius}\n handleChange={(borderRadiusValue) => handleChange('border-radius', String(borderRadiusValue))}\n />\n <EditorInputSelect\n label={'STYLE_Border_Style'}\n initialValue={initialValues.borderStyle}\n options={[\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_None' }), value: 'none' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Solid' }), value: 'solid' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Dashed' }), value: 'dashed' },\n { label: intl.formatMessage({ id: 'STYLE_Border_Style_Dotted' }), value: 'dotted' },\n ]}\n required={false}\n handleChange={(borderStyleValue) => {\n handleChange('border-style', borderStyleValue);\n borderStyleValue !== 'none' && handleChange('border-color', theme.color.black);\n borderStyleValue !== 'none' && handleChange('border-width', '1');\n }}\n />\n {typeof initialValues.borderStyle === 'string' && initialValues.borderStyle !== 'none' && (\n <EditorInputColor\n label={'STYLE_Border_Color'}\n initialValue={initialValues.borderColor}\n handleChange={(borderColorValue) => handleChange('border-color', borderColorValue)}\n />\n )}\n {typeof initialValues.borderStyle === 'string' && initialValues.borderStyle !== 'none' && (\n <EditorInputNumber\n label={'STYLE_Border_Width'}\n initialValue={initialValues.borderWidth}\n handleChange={(borderWidthValue) => handleChange('border-width', borderWidthValue)}\n />\n )}\n </>\n );\n};\n","import { useCallback } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { WidgetEditor, Widget } from 'jamespot-front-business';\nimport { useIntl } from 'react-intl';\n\nimport { EditorInputSelect } from './components/EditorInputSelect';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\n/**\n *\n * level 1 : Icon only (iOS like)\n * level 2 : Icon + Notification cell (iOS like)\n * level 3 : Default display\n * Level 4 : ???\n *\n */\nexport const EditorTabDisplayLevel = ({ uniqid }: { uniqid: string }) => {\n const dispatch = useAppDispatch();\n const intl = useIntl();\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid), shallowEqual);\n const def = Widget.definition(editor?.name);\n const level = useAppSelector((state) => Widget.selectors.selectWidgetLevel(state, uniqid), shallowEqual);\n\n const handleChange = useCallback(\n (level: string) => {\n dispatch(Widget.slice.actions.updateWidgetWrapper({ uniqid, level: Number(level) as 1 | 2 | 3 | 4 }));\n },\n [uniqid, dispatch],\n );\n\n return (\n <EditorInputSelect\n handleChange={handleChange}\n required={true}\n label={'WIDGET_Display_Level_Select'}\n initialValue={level ? String(level) : '3'}\n options={[\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_1' }), value: '1' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_2' }), value: '2' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_3' }), value: '3' },\n { label: intl.formatMessage({ id: 'WIDGET_Display_Level_4' }), value: '4' },\n ].filter((el) =>\n Array.isArray(def.displayLevel) ? def.displayLevel.includes(Number(el.value) as 1 | 2 | 3 | 4) : [],\n )}\n />\n );\n};\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { shallowEqual } from 'react-redux';\nimport { Editor } from './Editor';\nimport {\n CSSEditor,\n CSSEditorAction,\n CSSEditorContent,\n CSSEditorTab,\n CSSEditorHeader,\n CSSEditorLabel,\n CSSEditorMask,\n CSSEditorMenu,\n CSSEditorMenuButton,\n} from './style';\nimport { Widget, WidgetEditor } from 'jamespot-front-business';\nimport { useIntl } from 'react-intl';\nimport { EDITOR_CONTENT_WIDTH } from './const';\nimport { EditorPosition } from './EditorPosition';\nimport { EditorTabWrapper } from './EditorTabWrapper';\nimport { EditorIsBusy } from './states/EditorIsBusy';\nimport { EditorIsLocked } from './states/EditorIsLocked';\n\nimport { EditorSave } from './components/EditorSave';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\nimport { useTheme } from 'styled-components';\nimport { EditorTabWidgetSelection } from './EditorTabWidgetSelection';\nimport { EditorTabDisplayLevel } from './EditorTabDisplayLevel';\n\nconst OVERRIDE_SAVE = [\n 'widget-presence',\n 'widget-quick-survey',\n 'widget-check-list',\n 'widget-emails-imap',\n 'widget-contact-cardDav',\n 'widget-calendar-calDav',\n];\n\nconst Icon = commonComponentsRegistry.getLazyComponent('Icon');\nconst Tooltip = commonComponentsRegistry.getLazyComponent('Tooltip');\n\ntype EditorTabs = 'widget-settings' | 'widget-title' | 'widget-selection' | 'widget-level';\ntype EditorTab = {\n name: EditorTabs;\n label: string;\n icon: string;\n enable: boolean;\n};\n\n/*\n Editor wrapper (right part)\n*/\nexport const EditorWrapper = ({ uniqid, position }: { uniqid: string; position: 'left' | 'right' }) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const ref = useRef<HTMLDivElement>(null);\n const editor = useAppSelector((state) => WidgetEditor.selectors.selectEditor(state, uniqid), shallowEqual);\n\n const def = Widget.definition(editor?.name);\n\n const enableWidgetLevel = useMemo<boolean>(() => {\n return def.displayLevel !== undefined && Array.isArray(def.displayLevel) && def.displayLevel.length !== 0;\n }, [def]);\n const tabs: EditorTab[] = useMemo(() => {\n return [\n {\n name: 'widget-title',\n label: intl.formatMessage({ id: 'PANEL_Title' }),\n enable: def.panel.useWrapper,\n icon: 'icon-font',\n },\n {\n name: 'widget-selection',\n label: intl.formatMessage({ id: 'PANEL_Widget_Selection' }),\n enable: def.panel.useSelection,\n icon: 'icon-sliders',\n },\n {\n name: 'widget-settings',\n label: intl.formatMessage({ id: 'PANEL_Widget_Settings' }),\n enable: def.panel.useEditor,\n icon: 'icon-pen',\n },\n {\n name: 'widget-level',\n label: intl.formatMessage({ id: 'PANEL_Widget_Level' }),\n enable: enableWidgetLevel,\n icon: 'icon-edit',\n },\n ];\n }, [def, intl, enableWidgetLevel]);\n\n const defaultTab = useMemo<EditorTab | undefined>(() => {\n if (def.panel.useEditor) {\n return tabs.find((el) => el.name === 'widget-settings');\n }\n\n return tabs.filter((el) => el.enable)[0];\n }, [def, tabs]);\n\n const [currentTab, setCurrentTab] = useState<EditorTab | undefined>(defaultTab);\n\n const onClose = () => {\n dispatch(WidgetEditor.slice.actions.flushEditor({ uniqid }));\n };\n\n useEffect(() => {\n setTimeout(() => {\n if (ref && ref.current) {\n ref.current.className = ref.current.className + ' animate';\n }\n }, 0);\n }, []);\n\n return editor ? (\n <CSSEditorMask>\n <CSSEditor ref={ref} position={position}>\n <CSSEditorMenu>\n {tabs\n .filter((tab) => tab.enable)\n .map((tab) => {\n return (\n <CSSEditorMenuButton\n key={tab.name}\n isActive={currentTab && currentTab.name === tab.name}\n onClick={() => setCurrentTab(tab)}>\n <Tooltip position={'left'} description={tab.label}>\n <Icon\n name={tab.icon}\n color={\n currentTab && currentTab.name === tab.name\n ? theme.color.white\n : theme.color.lavender\n }\n />\n </Tooltip>\n </CSSEditorMenuButton>\n );\n })}\n </CSSEditorMenu>\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', width: `${EDITOR_CONTENT_WIDTH}px` }}>\n <CSSEditorHeader>\n <EditorPosition uniqid={uniqid} position={editor.position} />\n <CSSEditorLabel>\n <h3>{currentTab ? currentTab.label : intl.formatMessage({ id: def.label })}</h3>\n </CSSEditorLabel>\n <CSSEditorAction>\n <CSSEditorMenuButton onClick={onClose}>\n <Icon name=\"icon-times\" color={theme.color.lavender} size={26.75} />\n </CSSEditorMenuButton>\n </CSSEditorAction>\n </CSSEditorHeader>\n <CSSEditorContent>\n <CSSEditorTab>\n {currentTab && currentTab.name === 'widget-settings' && def.panel.useEditor && (\n <Editor uniqid={editor.uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-title' && def.panel.useWrapper && (\n <EditorTabWrapper uniqid={editor.uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-selection' && (\n <EditorTabWidgetSelection uniqid={uniqid} />\n )}\n {currentTab && currentTab.name === 'widget-level' && enableWidgetLevel && (\n <EditorTabDisplayLevel uniqid={uniqid} />\n )}\n </CSSEditorTab>\n <EditorIsBusy uniqid={uniqid} />\n <EditorIsLocked uniqid={uniqid} />\n {OVERRIDE_SAVE.includes(editor.name) && <EditorSave uniqid={uniqid} mode={editor.mode} />}\n </CSSEditorContent>\n </div>\n </CSSEditor>\n {editor?.popup ? (\n <div style={{ position: 'absolute', inset: 0, backgroundColor: '#000', opacity: '.7' }}></div>\n ) : (\n <></>\n )}\n </CSSEditorMask>\n ) : (\n <></>\n );\n};\n","import { useEffect } from 'react';\n\nimport { shallowEqual } from 'react-redux';\n\nimport { EDITOR_TOP, EDITOR_WIDTH } from './const';\nimport { EditorPopup } from './EditorPopup';\nimport { EditorWrapper } from './EditorWrapper';\nimport { CSSEditorPortal } from './style';\nimport { WidgetEditor } from 'jamespot-front-business';\n\nimport styled from 'styled-components';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nexport const CSSEditorPortalWrapper = styled.div`\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 1;\n`;\n\nexport const CSSEditorPortalPopupWrapper = styled.div<{ isActive: boolean }>`\n flex: 1;\n display: flex;\n margin-top: ${EDITOR_TOP}px;\n pointer-events: ${(props) => (props.isActive ? 'all' : 'none')};\n`;\n\nexport const CSSEditorPortalRow = styled.div`\n flex: 1;\n display: flex;\n flex-direction: row;\n pointer-events: none;\n`;\n\nexport const CSSEditorPortalFreeSpace = styled.div`\n width: ${EDITOR_WIDTH}px;\n pointer-events: none;\n`;\n\n/*\n Editors wrapper (template)\n*/\nexport const EditorsPortal = () => {\n const dispatch = useAppDispatch();\n useEffect(() => {\n const flush = () => {\n dispatch(WidgetEditor.slice.actions.flushAllEditor());\n };\n\n window.addEventListener('NGWidgetEditorFlushAll', flush);\n return () => {\n window.removeEventListener('NGWidgetEditorFlushAll', flush);\n };\n }, [dispatch]);\n\n const editors = useAppSelector(WidgetEditor.selectors.selectEditors, shallowEqual);\n\n return (\n <CSSEditorPortalWrapper className=\"editor-portal-wrapper\">\n {editors.map((editor) => {\n return (\n <CSSEditorPortal isActive={false} key={editor.uniqid}>\n <CSSEditorPortalRow>\n {editor.position === 'left' ? (\n <>\n <EditorWrapper uniqid={editor.uniqid} position={editor.position}></EditorWrapper>\n <CSSEditorPortalPopupWrapper isActive={editor.popup !== undefined}>\n <EditorPopup uniqid={editor.uniqid} />\n </CSSEditorPortalPopupWrapper>\n <CSSEditorPortalFreeSpace />\n </>\n ) : (\n <>\n <CSSEditorPortalFreeSpace />\n <CSSEditorPortalPopupWrapper isActive={editor.popup !== undefined}>\n <EditorPopup uniqid={editor.uniqid} />\n </CSSEditorPortalPopupWrapper>\n <EditorWrapper uniqid={editor.uniqid} position={editor.position}></EditorWrapper>\n </>\n )}\n </CSSEditorPortalRow>\n </CSSEditorPortal>\n );\n })}\n </CSSEditorPortalWrapper>\n );\n};\n","// FIXME move to j-react-components + display error if dev mode\nexport const Empty = () => <></>;\n","import { Suspense } from 'react';\nimport { Outlet } from 'react-router-dom';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\n\nconst Container = commonComponentsRegistry.getLazyComponent('Container');\n\n// TODO: when we use it more globally, we will wanted to add a common header to not repeat it.\n// an exemple is in the @TwoColLayout component.\n// Currently (2025-08-20), calendar and accessibility are the only components that use it.\nexport const FullPageLayout = () => {\n return (\n <Suspense fallback={<></>}>\n <Container backgroundColor={'white'} mode={'fluid'} flexDirection={'column'}>\n <Outlet />\n </Container>\n </Suspense>\n );\n};\n","import { Model, Toast } from 'jamespot-front-business';\nimport { useCallback, useMemo } from 'react';\nimport { useIntl } from 'react-intl';\nimport { useTheme } from 'styled-components';\nimport { JRCInputTinyMCERawProps } from 'jamespot-react-components';\nimport { AIModal } from './extension/AIModal';\nimport { MarkdownModal } from './extension/MarkdownModal';\nimport { useMarkdownModal } from '../../hooks/useMarkdownModal';\nimport { commonComponentsRegistry } from '../../registry/CommonRegistry';\nimport { tinymceCommonOptions } from '../../initTinymce';\nimport { getTinyMCEMentionsQueries } from '../../utils/tinymce';\nimport { useAI } from '../../hooks/useAI';\nimport { useAppDispatch, useAppSelector } from '../../redux/store';\n\nconst JRCInputTinyMCERaw = commonComponentsRegistry.getLazyComponent('InputTinyMCERaw');\n\nexport type JRCInputTinyMCEWithExtProps = Omit<\n JRCInputTinyMCERawProps,\n 'commonOptions' | 'mentionsQueries' | 'additionalExtensions'\n>;\n\nexport const JRCInputTinyMCEWithExtRaw = (props: JRCInputTinyMCEWithExtProps) => {\n const intl = useIntl();\n const dispatch = useAppDispatch();\n const theme = useTheme();\n const models = useAppSelector(Model.selectors.selectAll);\n const { query, ext: extAI, isActive: isAIActive } = useAI();\n const {\n open,\n onInsert,\n close: closeMarkdownModal,\n ext: extMarkdown,\n isActive: isMarkdownActive,\n } = useMarkdownModal();\n\n const extArray = useMemo(() => {\n return [...(isMarkdownActive ? [extMarkdown] : []), ...(isAIActive ? [extAI] : [])];\n }, [extAI, extMarkdown, isAIActive, isMarkdownActive]);\n\n const onMentionsQueryError = useCallback(\n (message?: string) => {\n dispatch(Toast.actions.error({ label: message ?? intl.formatMessage({ id: 'GLOBAL_Error' }) }));\n },\n [dispatch, intl],\n );\n\n const tinyMentionsQueries = useMemo(() => {\n return getTinyMCEMentionsQueries(models, theme, onMentionsQueryError);\n }, [models, onMentionsQueryError, theme]);\n\n const commonOptions = useMemo(() => tinymceCommonOptions, []);\n\n return (\n <>\n {commonOptions && (\n <JRCInputTinyMCERaw\n commonOptions={commonOptions}\n additionalExtensions={extArray}\n mentionsQueries={tinyMentionsQueries}\n {...props}\n />\n )}\n {isAIActive && <AIModal query={query} />}\n {isMarkdownActive && <MarkdownModal onInsert={onInsert} open={open} close={closeMarkdownModal} />}\n </>\n );\n};\n","import { Suspense, useEffect, useMemo, useState } from 'react';\nimport { Outlet, matchPath, useLocation } from 'react-router-dom';\nimport { useIntl } from 'react-intl';\nimport { commonComponentsRegistry } from '../registry/CommonRegistry';\nimport { TwoColLayoutProps } from './types';\n\nconst Container = commonComponentsRegistry.getLazyComponent('Container');\nconst AppColumn = commonComponentsRegistry.getLazyComponent('AppColumn');\nconst MainColumn = commonComponentsRegistry.getLazyComponent('MainColumn');\n\nexport function TwoColLayout({\n extensionRoute,\n routes,\n description,\n mode = 'center',\n mainColumnProps,\n}: TwoColLayoutProps) {\n const intl = useIntl();\n const { pathname } = useLocation();\n\n const ROUTES_ARRAY = useMemo(() => Object.values(routes), [routes]);\n const [activeTab, setActiveTab] = useState(ROUTES_ARRAY?.[0]?.key);\n\n const tabs = ROUTES_ARRAY.map((tab) => ({\n ...tab,\n label: intl.formatMessage({ id: tab.label }),\n href: tab.absolutePath ? tab.path : `/ng/rr/${extensionRoute}/${tab.path}`,\n group: tab.group ? intl.formatMessage({ id: tab.group }) : undefined,\n }));\n\n useEffect(() => {\n const activeRoute = ROUTES_ARRAY.find((route) => {\n if (`/ng/rr/${extensionRoute}/${route.path}` === pathname) {\n return true;\n }\n\n return route.paths?.reduce<boolean>((previousValue: boolean, currentValue: string) => {\n const pattern = `/ng/rr/${extensionRoute}/${currentValue}`;\n const isMatch = matchPath(pattern, pathname) !== null;\n return previousValue || isMatch;\n }, false);\n });\n if (activeRoute) setActiveTab(activeRoute.key);\n }, [pathname, ROUTES_ARRAY, extensionRoute]);\n\n return (\n <Suspense fallback={<></>}>\n <Container mode={mode}>\n <AppColumn mode={mode} description={description} tabs={tabs} activeTab={activeTab || ''} />\n <MainColumn mode={mode} flex={true} {...mainColumnProps}>\n <Outlet />\n </MainColumn>\n </Container>\n </Suspense>\n );\n}\n"],"names":["JRCIcon","getLazyComponent","JRCAvatar","SR","span","SROnly","Avatar","props","theme","useTheme","intl","useIntl","networkPublic","Network","selectors","selectNetworkPublic","uri","name","size","color","primary","variant","formatMessage","id","JRCFlexBox","JRCModalContent","JRCModalLayout","JRCStyledHref","JRCTooltip","JRCTypography","AudienceWrapper","div","AvatarLink","a","white","lavender","overlap","Audience","audience","limit","isModalOpen","setModalOpen","useState","splice","map","item","index","href","_url","target","description","undefined","title","position","alt","timestamp","dateModified","Utils","date","strToTimestamp","focusable","length","onClick","closeHandler","enableClickAwayCloseModal","open","maxHeight","overflow","onClickIconClose","i","y","gap","space","l","type","JRCLoader","TextWrapper","md","loadingResponse","response","loading","error","AIModal","query","setResponse","sendAIRequest","useCallback","jia","textEnhancement","text","capacity","capability","then","errorMsg","textResponse","result","catch","_err","useEffect","trim","zIndex","tinyMCEModal","reject","buttons","children","clickHandler","resolve","isFull","align","StretchContainer","css","Container","stretch","Form","form","FormElm","forwardRef","ref","onSubmit","dataCy","FieldsetWrapper","DisplayForm","onInit","formRef","useRef","configuration","defaultValues","useDisplay","fields","forceMandatory","isInit","setIsInit","handleSubmit","control","reset","formFn","useForm","criteriaMode","formatValuesForSubmit","values","toRet","Object","keys","forEach","k","widget","find","c","v","join","useImperativeHandle","current","scrollTo","getFormattedValues","getValues","Input","conf","readOnly","extraInputs","ModalForm","Loader","Icon","Typography","Ellipsis","StyledHref","ContentPreview","grey2","grey0","sm","ContentWrapper","AddReportModal","onClose","articleId","articleUri","commentUri","dispatch","setOpen","article","setArticle","comment","setComment","contentLoading","setContentLoading","submitLoading","setSubmitLoading","abortController","Promise","all","res","get","idArticle","signal","format","getComments","closeModal","submit","contentReport","createReport","Toast","actions","success","label","e","submitForm","async","_user","CSSSquareWidgetWrapper","CSSSquareWidget","available","CSSWidgetButton","height","CSSWrapWidgetWrapper","column","CSSWrapTitle","CSSWrapWidget","button","parentIsColumn","grey1","full","DashedFocusBorder","Flex","direction","JRCButton","JRCIconButton","WidgetList","mode","view","namespace","onChange","isOpen","widgets","Widget","definition","WidgetsName","ArticleTitle","ArticleButton","CheckList","Presence","QuickSurvey","ArticleText","ArticleImage","ArticleSlider","ArticleAttachment","getBuilderWidgets","args","portalId","factory","src","img","className","minWidth","WidgetModeArticle","WidgetModeComment","calcHeight","useMemo","Math","ceil","bg","bgHover","iconSize","icon","useMarkdownModal","editor","setEditor","onInsert","execCommand","close","ext","JTinyMCEExtensionsBuilders","markdown","ed","isActive","JRCInputText","WidgetTitleEdit","uniqid","widgetWrapperTitle","state","selectWidget","shallowEqual","watch","widgetTitle","subscription","data","slice","updateWidgetWrapper","unsubscribe","placeholder","width","margin","CSSModalFooter","CSSWidgetHeaderEdit","CSSWidgetHeaderEditTitle","CSSWidgetHeaderEditActions","WidgetHeaderEdit","handleOpenEditor","setIsOpen","handleOnClick","WidgetEditor","registerEditor","handleRemoveWidget","flushWidget","JRCHtml","CSSWidgetTitle","WidgetTitle","widgetWrapper","styles","selectWidgetTitleStyle","initialValues","String","black","backgroundColor","fontSize","fontWeight","textAlign","style","as","__html","JRCInputFileAdvancedRaw","CSSHidden","WidgetUploader","initialFiles","initialClick","multiple","accept","onUploadStart","onUploadEnd","onUploadSuccess","uploadRef","token","selectToken","total","setTotal","files","setFiles","click","content","totalFile","prevTotal","fileResponse","prevFiles","WidgetAttachment","JRCWidgetEmptyInplace","FileViewer","CSSWrapper","JRCWidgetArticleAttachmentWrapper","inplace","onError","message","setWidgetState","mounted","empty","weDoc","Application","selectById","option","file","object","getAccessHash","Error","hash","idFile","window","getWedocFilePath","wedocWindowOpen","openWithOptions","condition","f","includes","mimetype","options","resolveFilePath","Array","isArray","updateWidgetContent","url","JRCWidgetButton","CSSButtonWrapper","CSSPointer","clickable","JRCWidgetArticleButtonWrapper","buttonSize","borderRadius","JRCWidgetArticleGallery","CSSImagePointer","JRCWidgetArticleGalleryWrapper","maxWidth","WidgetImage","CSSImageWrapperHover","mockFileLittle","mainType","dateCreation","str","Date","parse","isNaN","getTime","JRCWidgetArticleImageWrapper","useFilter","setUri","formatImgUrl","now","from","path","JRCWidgetSlider","Wrapper","JRCWidgetArticleSliderWrapper","dynamicWidth","setDynamicWidth","fileViewerFiles","slides","slide","handleResize","offsetWidth","addEventListener","removeEventListener","isEditable","handleEditor","useDots","loop","startAt","onClickSlide","InputTextareaRaw","Modal","MarkdownModal","setMarkdown","doClose","disabled","replace","value","WidgetArticleText","CSSTextWrapper","JRCWidgetArticleTextWrapper","isBusy","selectWidgetState","busy","tinyMCECommonOptions","TinyMCE","selectTinyMCECommonOptions","models","Model","selectAll","closeMarkdownModal","extMarkdown","isMarkdownActive","tinyMentionsQueries","autoFocus","commonOptions","mentionsQueries","additionalExtensions","handlers","WidgetArticleTitle","ToolWrapper","Tool","JRCWidgetArticleTitleWrapper","heading","Toolbar","sizeValue","ModalLayout","ModalContent","Button","InputText","InputNumber","InputSelectExtended","InputPassword","UIForm","isLocked","UIWrapper","UIProviderError","orange","UISection","officeConfigurationInitialState","username","password","hostname","imapPort","imapConnectionSecurity","ImapConnection","NONE","imapMailbox","cardDavAddressBook","calDavCalendar","provider","OfficeConfigurationPrompt","useAbortController","isPending","setIsPending","setValue","formState","isValid","providerList","setProviderList","imapConnectionSecurityOptions","SSL","STARTTLS","fetchConfiguration","providers","office","getConfiguration","getProviders","aborted","err","finally","handleClose","hasProvider","radius","SelectProvider","initialValue","el","handleChange","rules","required","loader","setConfiguration","location","reload","getValue","o","getLabel","getSearch","UIFlex","UIScrollWrapper","UIScroll","WidgetScroll","header","scrollable","footer","WidgetStylePadding","selectWidgetWrapperStyle","padding","UITitle","WidgetIntranetTitle","UIHeaderWrapper","backroundColor","UIHeader","UIHeaderFlex","grey4","xs","WidgetHeader","dropdown","subHeader","styleValues","ButtonDropdown","Tooltip","UIDropdown","WidgetCalendarCalDavHeader","isConfigurationValid","handleLogout","useDispatch","small","smallOpenDirection","WidgetCalendarCalDav","JRCWidgetCalendarCalDavWrapper","levelFallback","setIsConfigurationValid","doInterval","setDoInterval","level","selectWidgetLevel","setUrl","list","setList","initialized","handleLogin","handleLoading","fetchProviderUrls","getProviderBaseUrls","dav_calendar_url","fetchData","nextMonth","addMonth","davCalendarGetEvents","dateStart","formatDateTime","dateEnd","WIDGET_LEVEL_3","interval","setInterval","clearInterval","WIDGET_LEVEL_1","calendarListEvent","Footer","WidgetRemove","removeWidget","WidgetFooterView","collaborationRights","widgetObject","selectWidgetObject","widgetObjectRights","selectWidgetObjectRights","canUpdate","update","canDelete","delete","ensureWidgetObjectHasMinimumProperties","WidgetInlineInputText","handleClick","setLabel","WidgetIsPending","WidgetCheckList","WidgetCheckListEditor","JRCFileViewer","CommentContainer","border","CSSWidgetCheckListWrapper","JRCWidgetCheckListWrapper","onWidgetUpdate","widgetContent","setToken","tokenLoading","setTokenLoading","entries","setEntries","tokenFromStore","selectWidgetObjectUri","allRt","selectAllWidgetRTObject","canEditCollaboration","canAdministrate","administrate","fetchToken","handleReloadWidget","getWidget","ensureWidgetCheckListType","openEditorPanel","flushAllEditor","finalEntries","arr","checked","links","user","lastRt","at","fn","handleCollabAddEntry","contentToUpdate","updateWidget","v2","fs","push","w","html","htmlDecodeSpecialChars","onChangeContent","onChangeWrapper","useRT","initialEntries","onFileClick","entry","onItemCheckListChange","checkListRespond","handleCheckItem","edit","WidgetContactCardDavHeader","WidgetContactCardDav","JRCWidgetContactCardDavWrapper","dav_address_book_url","davAddressBookGetContacts","contactCardList","WidgetEmailsImapHeader","count","selectWidgetChipCount","WidgetEmailsImap","JRCWidgetEmailsImapWrapper","fetchUnreadEmailsCount","imapInboxGetUnreadEmailsCount","setWidgetChipCount","imap_inbox_url","imapInboxGetEmails","WIDGET_LEVEL_2","emailList","UIOverlay","WidgetLuccaAbsence","JRCWidgetLuccaAbsenceWrapper","setError","isLoading","setIsLoading","today","getFullYear","getMonth","toString","padStart","getDate","lucca","getAbsence","CSSPaddingMd","CSSHref","secondary","CSSHorizontalAlign","WidgetPresenceWrapperClosing","handleClosing","isClosed","JRCWidgetPresence","ModalUserList","CSSWidgetPresenceWrapper","CSSWidgetPresenceIsClosed","JRCWidgetPresenceWrapper","limitValue","closing","userValue","userAvailableList","userUnavailableList","userAvailableTotal","userUnavailableTotal","isPendingResponse","setIsPendingResponse","AbortController","openUsersModal","setOpenUsersModal","usersListIndex","setUsersListIndex","usersList","setUsersList","handleError","canRespond","lockedRespondHandler","handleCancelRespond","presenceCancel","handleRespond","presenceRespond","handleResponse","presenceGetResponse","handleLoadUsersList","page","presenceGetResponseUserList","cnt","elm","abort","handleClickAvailable","handleClickUnavailable","handleOpenUsersModal","WidgetQuickSurvey","WidgetQuickSurveyEditor","WrapperContainer","withPadding","JRCWidgetQuickSurveyWrapper","userResponses","totalRespondent","totalResponse","userLoggedResponses","quickSurveyGetResponse","handleWidgetGet","handleCloseSurvey","finalContent","handleProgressBarClick","quickSurveyRespond","multi","quickSurveyGetResponseUserList","userHasAlreadyVoted","canCloseSurvey","anonymize","seeResponseAfter","handleClickFile","newContent","quickSurveyAddEnty","WidgetUserProfile","JRCWidgetUserProfileWrapper","currentUser","UserCurrent","pictureSize","displayMode","buttonName","WidgetWelcome","JRCWidgetWelcomeWrapper","lineBreak","WidgetColor","JRCWidgetColorWrapper","JRCWidgetExtensionWrapper","extensionName","uuid","J","react","require","anchorId","getVisibleColumns","tableColumnsData","columns","filter","isVisible","WidgetTable","AbsoluteWrapper","WidgetExcelDatasourceTableWrapper","tableHeadColor","tableHeadTextColor","tableHeadIconColor","tableRowColor","tableRowTextColor","tableBorderRadius","tableSizedColumns","tableSizedColumnsWidth","datasourceData","setDatasourceData","datasourceModel","setDatasourceModel","ExcelDatasourceTable","datasource","Format","VIEW","model","rows","WidgetDatasourceTableWrapper","datasourceSort","setDatasourceSort","order","datasourceType","setDatasourceType","datasourceIdentifier","setDatasourceIdentifier","DatasourceTable","rtConditions","rtAudience","rtLastObject","fetchDatasource","sort","tableDefaultSortOrder","tableDefaultSortName","UILicenseRequired","WidgetLicenseWrapper","hook","Hook","selectHook","hasLicense","CSSWidgetWithTitle","DisplayWidget","cannotDisplayComponent","ensureWidgetArticleButtonType","ensureWidgetArticleGalleryType","ensureWidgetLuccaAbsenceType","ensureWidgetArticleAttachmentType","ensureWidgetArticleImageType","ensureWidgetArticleSliderType","ensureWidgetArticleTitleType","ensureWidgetArticleTextType","ensureWidgetExcelDatasourceTableType","ensureWidgetDatasourceTableType","ensureWidgetPresenceType","ensureWidgetQuickSurveyType","ensureWidgetCalendarCalDavType","ensureWidgetContactCardDavType","ensureWidgetEmailsImapType","ensureWidgetUserProfileType","ensureWidgetColorType","ensureWidgetWelcomeType","ensureWidgetExtensionType","CSSWidgetLayer","opacity","pointerEvents","BETA_JRCDoubleClick","WidgetLayer","layers","ids","layer","Layer","LayerWidget","layerId","visible","locked","top","left","x","context","DraggableHandler","onMouseUp","updateLayer","onDoubleTap","mouseIsDown","setMouseDown","mouse","setMouse","start","setStart","child","setChild","handleMouseDown","event","nativeEvent","clientX","clientY","handleMouseMove","dx","dy","handleMouseUp","document","onMouseDown","WidgetState","inset","display","flex","justifyContent","alignItems","hover","WrapperEditMode","WidgetWrapperCoreEditHover","def","WidgetStyleWrapper","borderColor","borderWidth","borderStyle","Number","WidgetIcon","CSSIconAbsoluteA","JRCWidgetIconWrapper","rel","maxValue","WidgetWrapperCore","indexOrder","editableMap","currentEditableWidgetId","isComponentVisible","setIsComponentVisible","registerWidgetObject","registerWidget","setEditableWidgetId","setEditableIndex","CSSCommentsBlocWidgetWrapper","JRCMessage","CommentsBlocAddCommentWidgetsWrapper","flushedWidgets","selectFlushedWidgets","CommentsBlocCommentWidgetsWrapper","handleWidgetUpdate","useGifsModal","onSelect","gifs","GifsSelector","GifsModal","setLoading","setGifs","setQuery","q","offset","jamespot","getGifs","prev","onSelectGif","onSearch","onReachEnd","JRCCommentsBloc","CommentsBlocWrapper","CommentsBloc","canComment","commentType","socialQuestion","setWidgets","widgetIds","selectWidgets","tinyMCEExtendedOptions","selectTinyMCEExtendedOptions","platformConfig","Platform","selectPlatformConfig","commentsList","Comment","commentList","driveHook","fileBank","widgetHook","socialQuestionOptions","setSocialQuestionOptions","reportProps","setReportProps","gifsModalOpen","closeGifsModal","extGifs","isGifsActive","useCommentRT","idComments","reactSocket","socket","rtHandlers","getCommentsLikeRTHandlers","handler","onMessage","function","offMessage","fetchComments","onComment","params","finalWidget","some","addComment","_widgets","registerWidgetObjectRights","rights","_right","comments","onCommentUpdate","commentToUpdate","idComment","updateComment","onCommentDelete","deleteComment","isWidgetActive","autorize","canCreateWidget","create","widgetListComponent","newWidgetsWrapperComponent","existingWidgetsWrapperComponent","handleWidgetRemove","tinyMCEConfig","toolbar","commentsToolbar","highlightFields","userHighlightFields","userAccountStatus","userModel","m","onGetHashError","activeDrives","utils","buildDrivesArrayFromObject","drives","drive","filebank","fileIntegrity","global","questionAnswer","onSelectResponse","responseId","isResolved","onUnselectResponse","onReport","AppsDropdownItem","li","AppsDropdownItemLink","font","FlexBox","DropDown","CalendarHeader","animatedMeeting","calendarApp","surveyDate","weight","withBorder","trigger","Dropdown","IconButton","InputSelectRaw","InputCheckboxRaw","Label","InputWrapper","DropdownContainer","CalendarToolbar","viewsOptions","calendarApi","navigateWithQuery","setView","setCreationType","setExportModalOpen","types","Calendar","selectCalendarEvents","animatedMeetingHook","meeting","boardCard","createCalendarEventOptions","viewOptionEntries","next","tooltip","noMargin","colorVariant","badgeNumber","Suspense","fallback","labelPosition","checkboxMode","setTypes","recurrencePresets","freq","byDay","isPreset","b","d","hasPreset","recurrence","useAI","hooks","MagicWandHook","menuItems","PrepareAndSetQuery","fetch","AICapabilities","develop","summarize","tldr","en","es","formal","funny","JRCInputTinyMCE","JRCInputTinyMCEWithExt","extAI","isAIActive","gifsExt","extArray","onMentionsQueryError","InputImage","InputCheckbox","InputAudience","InputFileAdvancedRaw","InputColor","InputDateTime","InputDateTimeRaw","InputAutocomplete","InputSelect","Message","DisplayFormWrapper","ShowHide","$show","SocialEventOrRecurringEventForm","setUploadLoading","extraInitialValues","displayFormRef","eventModeHasChanged","setEventModeHasChanged","eventMode","setEventMode","customColors","setCustomColors","prevPlace","setPrevPlace","prevAddress","setPrevAddress","calendarHook","fileBankHook","spotHook","businessContactHook","visioConnectHook","bbbHook","sharedContentHook","until","setUntil","key","sendAlert","useWatch","isDateStartAfterDateEnd","isAfter","eventModeOptions","audienceViews","deleteFile","visioOptions","visioOption","setVisioOption","updateVisioOption","urlBase","place","address","updateEventMode","hasRecurrence","allDay","textColor","bgColor","socialEventUseCeiling","dzDimensions","aspectRatio","allowCustomRatio","defaultImages","imgs","columnCount","openDirection","valueTypeIsBoolean","recurringEventsEnabled","isCurrentOption","externalGestion","tags","searchable","asyncPromise","input","filters","operator","grey5","views","activeViews","group","dispatchOnError","existingFiles","attachments","inverted","UpdateCalendarEventModal","uploadLoading","isSubmit","extraTopButtons","mapFormValuesToApi","publishTo","uiObjectLink","alertAuthor","extractTaxonomiesFromObjectAndMapProperty","UpdateSocialEventModal","onUpdate","isUpdateModalOpen","setUpdateModalOpen","initialLoading","setInitialLoading","lastModifiedTimestamp","socialEventCeiling","noGestion","image","hideFromCalendar","useQrcode","urlGestion","_audience","_attachedFiles","extractTaxonomiesFromObject","LITTLE","link","socialEventUpdateSchema","safeParse","Collapse","ReportSection","MeetingForm","openByDefault","reportFile","UpdateMeetingModal","meetingUpdateSchema","agenda","report","UpdateRecurringEventModal","recurringEventOccurrence","_extend","recurringEventRecord","recurrenceRule","recurringEventUpdateSchema","SidePanelModal","LastDraftDate","CreateCalendarEventModal","onSchedule","scheduleLoading","publishLoading","idDraft","lastDraftDate","setLastDraftDate","closeCreationModal","timeout","dirtyFields","setTimeout","saveAsDraft","contentType","clearTimeout","offsetTop","showIconClose","srOnly","sticky","isSameDay","time","formatDate","day","month","year","JRCInputAudience","JRCModal","ModalAudience","warningMessage","inputValue","autocomplete","InputTextRaw","IconButtonWrapper","ModalSchedule","selectUrlBase","scheduleDate","padStartTwoDigits","getHours","getMinutes","permalinkId","onSubmitHandler","permalink","navigator","clipboard","writeText","CreateMeetingModal","onCreate","noAudienceModalMode","setNoAudienceModalMode","isScheduleModalOpen","setScheduleModalOpen","setScheduleDate","setPermalinkId","platform","useSelector","defaultDateStart","setMinutes","addHours","defaultDateEnd","setPublishLoading","setScheduleLoading","meetingCreationSchema","forceUpdate","payload","ExportCalendarModal","iCalendarUrls","accepted","CreateSocialEventOrRecurringEventModal","defaultDateSelection","end","zPassThrough","socialEventCreationSchema","or","recurringEventCreationSchema","CommentsContainer","Header","CalendarWrapper","withHeader","withToolbar","fluid","navigate","getCalendarRTHandlers","pendingStatusChanges","setCalendarApi","eventToUpdate","setEventToUpdate","isExportModalOpen","dateSelection","setDateSelection","globalDefaultView","defaultView","urlQuery","URLSearchParams","search","queries","set","onSuccess","handleChangeView","handleChangeDates","dates","setDates","creationType","split","fullScreen","events","calendar","eventModalExtraComponent","deportedToolbar","onChangeLabel","onCalendarApiInit","onChangeDates","onChangeView","onDeleteEvent","onClickUpdateEvent","onUpdateStatus","changeResponse","isUpdateStatusLoading","psc","eventId","disableSelect","isRecurringEventOccurrence","CSSEditorPortal","CSSEditorHeader","CSSEditorAction","CSSEditorLabel","CSSEditorMask","EDITOR_WIDTH","CSSEditor","CSSEditorContent","CSSEditorTab","CSSEditorIsBusy","CSSEditorIsLocked","CSSEditorMenu","CSSEditorMenuButton","EditorPopup","selectEditor","popup","flexDirection","marginTop","flushEditorPopup","WidgetArticleTitleEditor","WidgetArticleTextEditor","WidgetArticleGalleryEditor","WidgetArticleAttachmentEditor","WidgetArticleSliderEditor","WidgetArticleImageEditor","WidgetButtonEditor","WidgetDatasourceTableEditor","WidgetExcelDatasourceTableEditor","WidgetPresenceEditor","WidgetLuccaAbsenceEditor","WidgetEmailsImapEditor","WidgetContactCardDavEditor","WidgetCalendarCalDavEditor","WidgetUserProfileEditor","WidgetColorEditor","WidgetWelcomeEditor","WidgetExtensionEditor","Editor","onSaveCallback","onSave","handleHookIsActive","getState","flushEditor","onStateChange","states","onOpen","registerEditorPopup","network","wedoc","handleStart","handleCatch","handleFinally","override","application","EditorPosition","setEditorPosition","InputColorRaw","Fieldset","fieldset","EditorInputColor","palettes","colors","headerColor","green","navy","overseas","transparentHexa","JRCInputNumber","EditorInputNumber","EditorInputSelect","optionFromInitialValue","select","hideDeleteIcon","EditorTabWrapper","wrapper","widgetContext","selectWidgetContext","setWidgetTitleStyle","colorValue","backgroundColorValue","fontSizeValue","fontWeightValue","textAlignValue","EditorIsBusy","EditorIsLocked","EditorSave","EditorTabWidgetSelection","setWidgetWrapperStyle","paddingValue","borderRadiusValue","borderStyleValue","borderColorValue","borderWidthValue","EditorTabDisplayLevel","displayLevel","OVERRIDE_SAVE","EditorWrapper","enableWidgetLevel","tabs","enable","panel","useWrapper","useSelection","useEditor","defaultTab","currentTab","setCurrentTab","tab","CSSEditorPortalWrapper","CSSEditorPortalPopupWrapper","CSSEditorPortalRow","CSSEditorPortalFreeSpace","EditorsPortal","flush","editors","selectEditors","Empty","FullPageLayout","JRCInputTinyMCERaw","JRCInputTinyMCEWithExtRaw","AppColumn","MainColumn","TwoColLayout","extensionRoute","routes","mainColumnProps","pathname","ROUTES_ARRAY","activeTab","setActiveTab","absolutePath","activeRoute","route","paths","reduce","previousValue","currentValue","pattern","isMatch"],"sourceRoot":""}