telegram-tt/dist/main.1506acf7f7cfa5302ad7.js.map
Alexander Zinchuk c5bebc8a3d [Build]
2022-02-14 00:54:56 +03:00

1 line
841 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"main.1506acf7f7cfa5302ad7.js","mappings":"uBACIA,EADAC,ECAAC,EACAC,ECwCAC,EASAC,E,wFC/BJ,IAAIC,EACJ,MAAMC,EAAgB,IAAIC,IACpBC,EAA0B,IAAID,IAI7B,SAASE,EAAQC,EAAuBC,GAe7C,OAdKN,IACCO,EAAAA,IAEFC,QAAQC,IAAI,yBAGdT,EAAS,IAAIU,OAAO,IAAIC,IAAI,mBAsEhC,SAA2BN,GACzBL,EAAOY,iBAAiB,WAAW,IAAkC,IAAjC,KAAEC,GAA+B,EACnE,GAAkB,WAAdA,EAAKC,KACPT,EAASQ,EAAKE,aACT,GAAkB,mBAAdF,EAAKC,KAA2B,CACzC,MAAME,EAAef,EAAcgB,IAAIJ,EAAKK,WACxCF,IACEH,EAAKM,MACPH,EAAaI,OAAOP,EAAKM,OAEzBH,EAAaK,QAAQR,EAAKS,gBAGzB,GAAkB,mBAAdT,EAAKC,KAA2B,SACzC,UAAAb,EAAcgB,IAAIJ,EAAKK,kBAAvB,mBAAmCK,gBAAnC,mBAAiDV,EAAKW,mBACjD,GAAkB,mBAAdX,EAAKC,KAA2B,OACzC,MAAM,IAAIW,MAAJ,UAAUZ,EAAKM,aAAf,aAAU,EAAYO,aArF9BC,CAAkBtB,GAEW,QAAzBC,EAAYsB,UAiIlBC,OAAOjB,iBAAiB,SAAS,KAC1BkB,IAELC,YAAW,IAAMD,KAAoB,SA/HhCE,EAAY,CACjBlB,KAAM,UACNmB,KAAM,CAAC3B,KAIJ,SAAS4B,EAAiCC,GAC/C,IAAKnC,EAMH,YALIO,EAAAA,IAEFC,QAAQ4B,KAAK,2BAJiE,2BAArBH,EAAqB,iCAArBA,EAAqB,kBAUlF,MAAMI,EAAUL,EAAY,CAC1BlB,KAAM,aACNwB,KAAMH,EACNF,KAAAA,IA0BF,OAtBI1B,EAAAA,IACF,WACE,UASyB8B,EAKvB,MAAOE,MAfX,GAqBKF,EAGF,SAASG,EAAkBC,GAChCA,EAAiBC,YAAa,EAE9B,MAAM,UAAExB,GAAcf,EAAwBc,IAAIwB,IAAqB,GAClEvB,GAILlB,EAAO2C,YAAY,CACjB7B,KAAM,iBACNI,UAAAA,IAyBJ,SAASc,EAAYN,GACnB,MAAMR,GAAY0B,EAAAA,EAAAA,GAAc3C,GAC1B4C,EAAyB,CAC7B3B,UAAAA,KACGQ,GAGCV,EAAe,CAAEE,UAAAA,GAGjBmB,EAAkD,IAAIS,SAAQ,CAACzB,EAASD,KAC5E2B,OAAOC,OAAOhC,EAAc,CAAEK,QAAAA,EAASD,OAAAA,OAGzC,GAAK,SAAUyB,GAAuC,mBAApBA,EAAQZ,KAAK,GAAmB,CAChE,MAAMV,EAAWsB,EAAQZ,KAAKgB,MAC9BjC,EAAaO,SAAWA,EACxBpB,EAAwB+C,IAAI3B,EAAUP,GAiBxC,OAdAf,EAAciD,IAAIhC,EAAWF,GAE7BqB,EACGc,OAAM,SACNC,SAAQ,KACPnD,EAAcoD,OAAOnC,GAEjBF,EAAaO,UACfpB,EAAwBkD,OAAOrC,EAAaO,aAIlDvB,EAAO2C,YAAYE,GAEZR,EAGT,MAAMiB,EAAYC,KAAKC,MAWvBC,eAAe3B,IACb,UACQgB,QAAQY,KAAK,CACjB1B,EAAY,CAAElB,KAAM,UACpB6C,EAAAA,EAAAA,IA/JuB,KA+JKC,MAAK,IAAMd,QAAQ1B,OAAO,IAAIK,MAAM,6BAElE,MAAOc,GAEP/B,QAAQW,MAAMoB,GAEVgB,KAAKC,MAAQF,GApKU,KAqKzBzB,OAAOgC,SAASC,Y,+GCnLf,IAAKC,E,0BAAAA,GAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,OAAAA,GAAAA,S,CAAAA,IAAAA,EAAAA,M,eCqML,IAAKC,E,6CAAAA,GAAAA,EAAAA,KAAAA,oBAAAA,EAAAA,WAAAA,0BAAAA,EAAAA,WAAAA,0BAAAA,EAAAA,QAAAA,uBAAAA,EAAAA,KAAAA,oBAAAA,EAAAA,MAAAA,qBAAAA,EAAAA,QAAAA,uBAAAA,EAAAA,OAAAA,sBAAAA,EAAAA,YAAAA,2BAAAA,EAAAA,QAAAA,uBAAAA,EAAAA,MAAAA,qBAAAA,EAAAA,IAAAA,mBAAAA,EAAAA,OAAAA,sBAAAA,EAAAA,QAAAA,uBAAAA,EAAAA,IAAAA,mBAAAA,EAAAA,UAAAA,yBAAAA,EAAAA,QAAAA,uBAAAA,EAAAA,QAAAA,uB,CAAAA,IAAAA,EAAAA,KA8JL,MAAMC,GAAkB,EAGlBC,EAAkB,mB,sDCtW/B,MAgDMC,EAAO,GAKPC,EAAS,WAWf,SAASC,EAAMC,EAAOC,EAAWC,GAC/B,IAAIC,EAIJ,IAHAH,EAAQE,EAAYE,KAAKC,MAAML,EAjBpB,KAiBoCA,GAAS,EACxDA,GAASI,KAAKC,MAAML,EAAQC,GAEvBE,EAAI,EAAGH,EAAS,IAA4BG,GAAKN,EACpDG,EAAQI,KAAKC,MAAML,EAAQ,IAE7B,OAAOI,KAAKC,MAAMF,EAAK,GAAoBH,GAAUA,EApB1C,KAwBb,SAASM,EAAOC,EAAOC,GAErB,MAAMC,EAAS,GACTC,EAAa,GACbC,EAAeJ,EAAMK,OAE3B,IAAIC,EAAOC,EAASC,EAAOC,EAAUC,EAAWC,EAAOC,EAAQC,EAAUC,EAAOlB,EAAOmB,EAAWC,EAAOC,EAezG,IAXAX,EAzCgB,IA0ChBE,EAAI,EACJC,EA1CmB,GAgDnBC,EAAQV,EAAMkB,YA/CE,KAgDZR,EAAQ,IAAGA,EAAQ,GAElBC,EAAI,EAAGA,EAAID,IAASC,EAAG,CAE1B,GADIV,IAAcE,EAAWD,EAAOG,QAAUL,EAAMmB,WAAWR,GAAK,GAAK,IACrEX,EAAMmB,WAAWR,IAAM,IACzB,MAAM,IAAIS,WAAW,yBAEvBlB,EAAOmB,KAAKrB,EAAMmB,WAAWR,IAM/B,IAAKC,EAAKF,EAAQ,EAAIA,EAAQ,EAAI,EAAGE,EAAKR,GAAe,CAOvD,IAAKS,EAAOL,EAAGM,EAAI,EAAGlB,EAAIN,GAAQM,GAAKN,EAAM,CAC3C,GAAIsB,GAAMR,EACR,MAAMgB,WAAW,yBAInB,GAFAL,GA5DgBO,EA4DKtB,EAAMmB,WAAWP,MA3D9B,GAAK,GAAKU,EAAK,GAAKA,EAAK,GAAK,GAAKA,EAAK,GAAKA,EAAK,GAAK,GAAKA,EAAK,GAAKhC,EA6D1EyB,GAASzB,EACX,MAAM8B,WAAW,yBAEnB,GAAIL,EAAQlB,KAAKC,OAAOP,EAASiB,GAAKM,GACpC,MAAMM,WAAW,wBAInB,GAFAZ,GAAKO,EAAQD,EACbE,EAAIpB,GAAKa,EA9EF,EA8EgBb,GAAKa,EA7ErB,MA6E0Cb,EAAIa,EACjDM,EAAQC,EACV,MAEF,GAAIF,EAAIjB,KAAKC,MAAMP,GAAUD,EAAO0B,IAClC,MAAMI,WAAW,wBAEnBN,GAAKxB,EAAO0B,EAQd,GALAT,EAAML,EAAOG,OAAS,EACtBI,EAAOjB,EAAMgB,EAAIK,EAAMN,EAAc,IAATM,GAIxBhB,KAAKC,MAAMU,EAAID,GAAOhB,EAASe,EACjC,MAAMc,WAAW,wBAEnBd,GAAKT,KAAKC,MAAMU,EAAID,GACpBC,GAAKD,EAIDN,GACFE,EAAWoB,OAAOf,EAAG,EAAGR,EAAMmB,WAAWP,EAAK,GAAK,GAAK,IAG1DV,EAAOqB,OAAOf,EAAG,EAAGF,GACpBE,IAjGJ,IAAsBc,EAmGpB,GAAIrB,EACF,IAAKO,EAAI,EAAGS,EAAMf,EAAOG,OAAQG,EAAIS,EAAKT,IACpCL,EAAWK,KACbN,EAAOM,GAAKgB,OAAOC,aAAavB,EAAOM,IACpCkB,cACAP,WAAW,IAIpB,MAjJSnB,CAAAA,IACP,MAAME,EAAS,GACf,IAAIM,EAAI,EACR,MAAMS,EAAMjB,EAAMK,OAClB,IAAIsB,EAEJ,KAAOnB,EAAIS,GAAK,CAEd,GADAU,EAAQ3B,EAAMQ,KACW,QAAZ,MAARmB,GACH,MAAM,IAAIP,WAAW,wCAEnBO,EAAQ,QACVA,GAAS,MACTzB,EAAOmB,KAAKG,OAAOC,aAAeE,IAAU,GAAM,KAAS,QAC3DA,EAAQ,MAAkB,KAARA,GAEpBzB,EAAOmB,KAAKG,OAAOC,aAAaE,IAElC,OAAOzB,EAAO0B,KAAK,KA+HdC,CAAa3B,G,kCC/FtB,SAAS4B,EAAUC,GACjB,IAAKA,EACH,OAGF,MAAMC,GAAOC,EAAAA,EAAAA,GAAeF,GAC5B,GAAKC,EAIL,IACE,IAAIE,EAAcC,UAAUH,GAE5B,MAAMI,EAAQF,EAAYE,MAAM,uCAChC,IAAKA,EACH,OAEF,MAAMC,EAASD,EAAM,GAGrB,OAFAF,EAAcA,EAAYI,QAAQD,EDgFtC,SAAmBA,GACjB,MAAME,EAAeF,EAAOG,MAAM,KAC5BjC,EAAM,GACZ,IAAK,IAAIC,EAAI,EAAGA,EAAI+B,EAAalC,SAAUG,EAAG,CAC5C,MAAMiC,EAAIF,EAAa/B,GACvBD,EAAIc,KAAKoB,EAAEL,MAAM,SAAWrC,EAAO0C,EAAEC,MAAM,IAAMD,GAEnD,OAAOlC,EAAIqB,KAAK,KCvF4Be,CAAgBN,IAEnDH,EACP,MAAO5F,GACHZ,EAAAA,IAEFC,QAAQW,MAAM,gCAAiCyF,EAAKzF,IAO1D,SAAesG,EAAAA,EAAAA,KAxFgB,IAMzB,IAN0B,IAC9Bb,EAD8B,KAE9Bc,EAF8B,UAG9BC,EAH8B,SAI9BC,EAJ8B,MAK9BC,GACI,EACJ,MAAM,oBAAEC,EAAF,iBAAuBC,IAAqBC,EAAAA,EAAAA,MAE5CC,EAAUL,GAAYF,EACtBQ,EAAYtB,IAAQqB,EAEpBE,GAAcC,EAAAA,EAAAA,KAAaC,GAE7BA,EAAEC,SAAWD,EAAEE,QAAUF,EAAEG,UAAYH,EAAEI,UACrC7B,IAASA,EAAIK,MAAMyB,EAAAA,MAAiB9B,EAAIK,MAAM0B,EAAAA,KAE9CT,IACFJ,EAAoB,CAAElB,IAAAA,IAEtByB,EAAEO,kBACK,IAMXP,EAAEO,iBACFb,EAAiB,CAAEnB,IAAAA,KAEZ,IACN,CAACsB,EAAWH,EAAkBD,EAAqBlB,IAEtD,IAAKA,EACH,OAGF,MAAMiC,GAAaC,EAAAA,EAAAA,GACjBnB,GAAa,mBACbD,EAAKxC,OAAS,IAAM,uBAGtB,OACE,wBACE2B,MAAMC,EAAAA,EAAAA,GAAeF,GACrBmC,MAAOpC,EAAUC,GACjBoC,OAAO,SACPC,IAAI,sBACJtB,UAAWkB,EACXK,QAASf,EACTgB,IAAKtB,EAAQ,MAAQ,QAEpBI,O,qECjEA,SAASmB,EAAkBC,GAChC,OAAIA,EAASC,UACH,IAAGD,EALM,YAKgBE,QAAQ,QAEvCF,EAASG,OACH,IAAGH,EAPM,SAOgBE,QAAQ,QAEnC,IAAGF,EAAS,MAAOE,QAAQ,QAG9B,SAASE,EAAqBC,GACnC,MAAM,SAAEC,EAAF,SAAYC,GAAaF,EAE/B,OAAOG,EAAiBF,EAAUC,GAG7B,SAASC,EAAiBF,EAAkBC,GACjD,OAAID,IAAuC,IAA3BA,EAASG,QAAQ,KACxBH,EAAStC,MAAM,KAAKpE,MAEpB2G,EAASvC,MAAM,KAAKpE,MAIxB,SAAS8G,EAAsBC,GACpC,OAAQA,GACN,IAAK,MACL,IAAK,MACL,IAAK,OACH,MAAO,QACT,IAAK,MACL,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,OACH,MAAO,SACT,IAAK,MACL,IAAK,MACH,MAAO,MACT,QACE,MAAO,WAIN,SAASC,EAAsBP,GACpC,OAAOQ,QAAQR,EAASS,gBAAkBT,EAASU,a,8CClDrD,MAEMC,EAAgB,IAAIC,OAAQ,OAAMC,EAAAA,EAAAA,YAA0B,IAyBlE,EAvB8B7C,IAC5B,GAAIA,EAAKxC,OAJQsF,GAKf,OAAO,EAIT,IADoBN,QAAQxC,EAAKT,MAAMoD,IAErC,OAAO,EAGT,IAAII,EAAa,EACjB,KAAOF,EAAAA,EAAAA,KAAkB7C,IAGvB,GAFA+C,IAEIA,EAlBa,EAoBf,OADAF,EAAAA,EAAAA,UAAyB,GAClB,EAIX,OAAOE,I,6HCXT,MAoBA,EApB+B,IAEzB,IAF0B,UAC9B9C,EAD8B,OACnB+C,EADmB,SACX9C,GACf,EACJ,MAAM,SAAE+C,IAAa3C,EAAAA,EAAAA,MAEfG,GAAcC,EAAAA,EAAAA,KAAY,KAC1BsC,GACFC,EAAS,CAAEC,GAAIF,EAAOE,OAEvB,CAACF,EAAQC,IAEZ,OAAKD,EAKH,mBAACG,EAAA,EAAD,CAAMlD,WAAWmB,EAAAA,EAAAA,GAAe,WAAYnB,GAAYuB,QAASf,GAAcP,GAJxEA,GCQX,EApBkC,IAE5B,IAF6B,UACjCD,EADiC,QACtBjG,EADsB,SACbkG,GAChB,EACJ,MAAM,aAAEkD,IAAiB9C,EAAAA,EAAAA,MAEnB+C,GAAqB3C,EAAAA,EAAAA,KAAY,KACjC1G,GACFoJ,EAAa,CAAEE,OAAQtJ,EAAQsJ,OAAQ9J,UAAWQ,EAAQkJ,OAE3D,CAACE,EAAcpJ,IAElB,OAAKA,EAKH,mBAACmJ,EAAA,EAAD,CAAMlD,WAAWmB,EAAAA,EAAAA,GAAe,cAAenB,GAAYuB,QAAS6B,GAAqBnD,GAJlFA,GCMX,EApB+B,IAEzB,IAF0B,UAC9BD,EAD8B,OACnBqD,EADmB,SACXpD,GACf,EACJ,MAAM,SAAE+C,IAAa3C,EAAAA,EAAAA,MAEfG,GAAcC,EAAAA,EAAAA,KAAY,KAC1B4C,GACFL,EAAS,CAAEC,GAAII,MAEhB,CAACA,EAAQL,IAEZ,OAAKK,EAKH,mBAACH,EAAA,EAAD,CAAMlD,WAAWmB,EAAAA,EAAAA,GAAe,WAAYnB,GAAYuB,QAASf,GAAcP,GAJxEA,GCUX,EApBoC,IAE9B,IAF+B,UACnCD,EADmC,UACxBsD,EADwB,SACbrD,GAClB,EACJ,MAAM,cAAEsD,IAAkBlD,EAAAA,EAAAA,MAEpBG,GAAcC,EAAAA,EAAAA,KAAY,KAC1B6C,GACFC,EAAc,CAAEN,GAAIK,EAAUL,GAAIO,WAAYF,EAAUE,eAEzD,CAACF,EAAWC,IAEf,OAAKD,EAKH,mBAACJ,EAAA,EAAD,CAAMlD,WAAWmB,EAAAA,EAAAA,GAAe,gBAAiBnB,GAAYuB,QAASf,GAAcP,GAJ7EA,GCDLwD,EAAa,GACbC,EAAO,IAEN,SAASC,EACdC,EACA7J,EACA8J,EACAC,EACAC,EACAC,EACAC,GAEA,IADAC,EACA,uDADyB,GAEzB,IAAKnK,EAAQuG,QAAQ6D,OACnB,MAAO,GAGT,MAAM,KACJpE,EADI,kBACEqE,EADF,OACqBC,EADrB,SAC6BC,EAD7B,KACuCC,GACzCxK,EAAQuG,QAAQ6D,OACd7D,EAAsB,GACtBkE,EAAUN,EAAQO,aAAeP,EAAQQ,mBACzCC,EAA0B,6CAAT5E,GAAwDiE,EAE3EjE,EADA,+BAGJ,IACI6E,EADAC,EAAcjB,EAAKe,EAAgBP,MAAAA,GAAAA,EAAmB7G,OAAS6G,OAAoBU,GAkEvF,OA/DID,EAAYE,SAAS,sBACvBH,EAAYI,EACVH,EACA,oBACAI,EAAAA,EAAAA,GAAeZ,EAASC,EAAUV,EAAKsB,OAEzCL,EAAcD,EAAUtJ,MACxBgF,EAAQ/B,QAAQqG,IAGlBA,EAAYI,EACVH,EACA,kBACAhB,EACEsB,EAAkBtB,EAAkBW,IAAYd,EAC9CI,EACFsB,EAAkBxB,EAAME,EAAkBU,IAAYd,EACpD,QAGNmB,EAAcD,EAAUtJ,MACxBgF,EAAQ/B,QAAQqG,GAEhBA,EAAYI,EACVH,EACA,gBACAd,EACIA,EAAYsB,KAAKC,GAASH,EAAkBG,EAAMd,KAAUe,OAAiBhD,SAC7E,QAGNsC,EAAcD,EAAUtJ,MACxBgF,EAAQ/B,QAAQqG,GAEhBA,EAAYI,EACVH,EACA,YACAb,EACIwB,EAAqB5B,EAAMI,EAAeE,GAC1C,aAENW,EAAcD,EAAUtJ,MACxBgF,EAAQ/B,QAAQqG,GAEhBA,EAAYI,EACVH,EACA,YACAb,EACIyB,EAAqBzB,GACrB,aAENa,EAAcD,EAAUtJ,MACxBgF,EAAQ/B,QAAQqG,GAEhBA,EAAYI,EACVH,EACA,gBACAZ,EACIyB,EAAsBzB,EAAcO,GACpC,gBAENlE,EAAQ/B,QAAQqG,GAEZV,EAAQO,YACHnE,EAAQxB,KAAK,IAAI6G,OAGtBpB,EACKqB,EAAuBrB,EAAMjE,GAG/BA,EAGT,SAASmF,EAAqB1L,GAC5B,OAAOA,EAAQuG,SAAWvG,EAAQuG,QAAQuF,QACtC9L,EAAQuG,QAAQuF,QAAQzE,MACxB,YAGN,SAASoE,EAAqB5B,EAAc7J,GAAkD,IAA7BmK,EAA6B,uDAAJ,GACxF,MAAM,YAAEO,EAAF,mBAAeC,GAAuBR,EAE5C,GAAIO,EACF,OAAOqB,EAAAA,EAAAA,IAAsBlC,EAAM7J,OAAS+K,EAAWrB,GAGzD,MAAMsC,GAAiBC,EAAAA,EAAAA,GAAqBpC,EAAM7J,OAAS+K,OAAWA,EAAWrB,GAEjF,OAAIiB,EAEA,+BAAOqB,GAKT,mBAAC,EAAD,CAAa/F,UAAU,cAAcjG,QAASA,GAAUgM,GAI5D,SAASH,EAAuBtC,EAAkCvD,GAChE,OACE,mBAAC,EAAD,CAAeuD,UAAWA,GACvBvD,GAKP,SAASoF,EAAkBpC,EAAiByB,GAC1C,MAAMzE,GAAOkG,EAAAA,EAAAA,IAASC,EAAAA,EAAAA,IAAgBnD,GAASU,GAE/C,OAAIe,EACKzE,EAGF,mBAAC,EAAD,CAAUC,UAAU,cAAc+C,OAAQA,GAASA,IAAUoD,EAAAA,EAAAA,GAAWpG,IAGjF,SAASqF,EAAkBxB,EAAcwC,EAAe5B,GACtD,MAAMzE,GAAOkG,EAAAA,EAAAA,IAASI,EAAAA,EAAAA,GAAazC,EAAMwC,GAAO3C,GAEhD,OAAIe,EACKzE,EAGF,mBAAC,EAAD,CAAUC,UAAU,cAAcqD,OAAQ+C,EAAKnD,IAAKmD,IAAQD,EAAAA,EAAAA,GAAWpG,IAGhF,SAAS2F,EAAsBrC,EAAgBmB,GAC7C,MAAMzE,EAAO,eAEb,OAAIyE,EACKzE,EAGF,mBAAC,EAAD,CAAUC,UAAU,cAAcqD,OAAQA,GAAStD,GAG5D,SAASiF,EAAmBjF,EAAcuG,EAAqBC,GAC7D,MAAMC,EAAsBzG,EAAKoC,QAAQmE,GACzC,GAAIE,EAAsB,IAAMD,EAC9B,MAAO,CAACxG,GAGV,MAAMO,EAAsB,GAc5B,OAbAA,EAAQ/B,KAAKwB,EAAK0G,UAAU,EAAGD,IAC3BE,MAAMC,QAAQJ,GAChBA,EAAaK,SAAQ,CAAC/H,EAAOgI,KAC3BvG,EAAQ/B,KAAKM,GACTgI,EAAQ,EAAIN,EAAahJ,QAC3B+C,EAAQ/B,KAAK,SAIjB+B,EAAQ/B,KAAKgI,GAEfjG,EAAQ/B,KAAKwB,EAAK0G,UAAUD,EAAsBF,EAAY/I,SAEvD+C,I,6FCtMF,SAASwG,EACd/M,EACAgN,EACAC,EACAC,EACAC,GAEA,MAAM,KAAEnH,EAAF,SAAQoH,GAAapN,EAAQuG,QAAQP,MAAQ,GAEnD,IAAKA,EAAM,CACT,MAAMqH,GAA0BC,EAAAA,EAAAA,IAAetN,GAC/C,OAAOqN,EAA0B,EAACnB,EAAAA,EAAAA,GAASmB,EAAyBF,SAAmBpC,EAGzF,OAAOwC,EAAAA,EAAAA,IACLrB,EAAAA,EAAAA,GAASlG,EAAMmH,GACfC,EACAJ,EACAC,OACAlC,EACA/K,EAAQkJ,GACRgE,GAIG,SAASjB,EACdpC,EACA7J,GAIY,IAHZwN,EAGY,wDAFZR,EAEY,uCADZG,EACY,uDADKM,EAAAA,IAEb,SAAEL,GAAapN,EAAQuG,QAAQP,MAAQ,GAE3C,MAAM0H,EAAcN,MAAAA,OAAH,EAAGA,EAAUO,MAAMhH,GAAMA,EAAEvH,OAASkD,EAAAA,GAAAA,UACrD,IAAKoL,EAAa,CAChB,MAAM1H,GAAOkG,EAAAA,EAAAA,IAASH,EAAAA,EAAAA,IAAsBlC,EAAM7J,EAASwN,GAAUL,GAErE,OAAIH,GACKZ,EAAAA,EAAAA,GAAWpG,EAAM,CAAC,QAAS,aAAc,CAAEgH,UAAAA,KAE3CZ,EAAAA,EAAAA,GAAWpG,GAItB,MAAM4H,GAASJ,IAAWK,EAAAA,EAAAA,IAAuB7N,GAC3C8N,EAAiBF,EAAS,GAAEA,KAAW,GAEvC5H,EAAO+G,EAAkB/M,EAASgN,OAAWjC,GAAW,EAAMoC,GAC9DY,GAAcC,EAAAA,EAAAA,IAA6BnE,EAAM7J,EAASgG,GAEhE,MAAO,CACL8H,KACInB,MAAMC,QAAQmB,GAAeA,EAAc,CAACA,IAChDvC,OAAiBhD,W,2HCnDrB,MAAMyF,EAAqB,gBACrBC,EAAwB,kBAEf,SAAS9B,EACtB+B,GAGY,IAFZC,EAEY,uDAFiB,CAAC,SAC9BC,EACY,uCACZ,MAAoB,iBAATF,EACF,CAACA,IAGHG,EAAAA,EAAAA,IAAQF,EAAQG,QAAO,CAACvI,EAAMwF,KACnC,OAAQA,GACN,IAAK,cACH,OAAOgD,EAAWxI,GAEpB,IAAK,WAEH,OADAyI,EAAAA,EAAAA,UAAwB,EACjBC,EAAc1I,EAAM,MAAO,OAEpC,IAAK,QAEH,OADAyI,EAAAA,EAAAA,UAAwB,EACjBC,EAAc1I,EAAM,QAAS,OAEtC,IAAK,aAEH,OADAyI,EAAAA,EAAAA,UAAwB,EACjBC,EAAc1I,EAAM,QAAS,QAEtC,IAAK,KACH,OAAO2I,EAAc3I,EAAM,OAE7B,IAAK,UACH,OAAO2I,EAAc3I,EAAM,QAE7B,IAAK,YACH,OAAO4I,EAAa5I,EAAMqI,EAAQrB,WAEpC,IAAK,QACH,OAAO6B,EAAS7I,GAElB,IAAK,kBACH,OAAO8I,EAAsB9I,EAAM,OAErC,IAAK,uBACH,OAAO8I,EAAsB9I,EAAM,QAGvC,OAAOA,IACN,CAACmI,KAGN,SAASK,EAAWO,GAClB,MAAMC,EAAQhH,SAASiH,cAAc,OACrC,OAAOF,EAAUR,QAAO,CAACW,EAAQf,IACX,iBAATA,GACTe,EAAO1K,KAAK2J,GACLe,IAGTF,EAAMG,UAAYhB,EAClBe,EAAO1K,KAAKwK,EAAMI,WAEXF,IACN,IAGL,SAASR,EAAcK,EAAuBM,EAAuBjQ,GACnE,OAAIkQ,EAAAA,GACKP,EAGFA,EAAUR,QAAO,CAACW,EAAQf,KAC/B,GAAoB,iBAATA,EAET,OADAe,EAAO1K,KAAK2J,GACLe,EAIT,MAAMK,GADNpB,GAAOqB,EAAAA,EAAAA,IAAoBrB,IACRxI,MAAM8I,EAAAA,GACnBgB,EAAStB,EAAK5I,MAAMkJ,EAAAA,IAAgB,GAG1C,OAFAS,EAAO1K,KAAK+K,EAAM,IAEXE,EAAOlB,QAAO,CAACmB,EAAyB9B,EAAOjK,KACpD,MAAMwH,GAAOwE,EAAAA,EAAAA,KAAgBC,EAAAA,EAAAA,GAAYhC,IACzC,IAAKzC,EAAM,OAAOuE,EAClB,MAAMzJ,GAAYmB,EAAAA,EAAAA,GAChB,QACS,UAATiI,GAAoB,eAET,QAATjQ,GACFsQ,EAAYlL,KACV,0BACEyB,UAAWA,EACX4J,IAAM,eAAuB,QAATR,EAAiB,MAAQ,QAAQlE,QACrD2E,IAAKlC,KAIE,SAATxO,GACFsQ,EAAYlL,KAGT,iCAAgCyB,uBAAwC,QAAToJ,EAAiB,MAAQ,QAAQlE,eAAkByC,SAIvH,MAAMd,EAAY,EAAJnJ,EAAQ,EAKtB,OAJI4L,EAAMzC,IACR4C,EAAYlL,KAAK+K,EAAMzC,IAGlB4C,IACNR,KACF,IAGL,SAASP,EAAcI,EAAuB3P,GAC5C,OAAO2P,EAAUR,QAAO,CAACW,EAAoBf,KAC3C,GAAoB,iBAATA,EAET,OADAe,EAAO1K,KAAK2J,GACLe,EAGT,MAAMa,EAAgB5B,EACnBxI,MAAM,eACN4I,QAAO,CAACgB,EAAmBS,EAAcrM,EAAGsM,KAE3C,MAAMC,EAAcF,EAAKG,WACnBC,EAAeJ,EAAKxM,OAAS0M,EAAY1M,OAS/C,OARA+L,EAAM/K,KAAKG,OAAOC,aAAa,KAAKyL,OAAOD,GAAgBF,GAEvDvM,IAAMsM,EAAOzM,OAAS,GACxB+L,EAAM/K,KACK,QAATpF,EAAiB,8BAAS,UAIvBmQ,IACN,IAEL,MAAO,IAAIL,KAAWa,KACrB,IAGL,SAASnB,EAAaG,EAAuB/B,GAC3C,OAAO+B,EAAUR,QAAO,CAACW,EAAQf,KAC/B,GAAoB,iBAATA,IAAsBnB,EAE/B,OADAkC,EAAO1K,KAAK2J,GACLe,EAGT,MAAMoB,EAAgBnC,EAAKoC,cACrBC,EAAgBF,EAAclI,QAAQ4E,EAAUuD,eAChDE,EAAaH,EAAcE,EAAgBxD,EAAUxJ,QAC3D,GAAIgN,EAAgB,GAAMC,GAAcA,EAAWlL,MAAM0I,GAEvD,OADAiB,EAAO1K,KAAK2J,GACLe,EAGT,MAAMwB,EAAuB,GAS7B,OARAA,EAASlM,KAAK2J,EAAKzB,UAAU,EAAG8D,IAChCE,EAASlM,KACP,2BAAMyB,UAAU,2BACbkI,EAAKzB,UAAU8D,EAAeA,EAAgBxD,EAAUxJ,UAG7DkN,EAASlM,KAAK2J,EAAKzB,UAAU8D,EAAgBxD,EAAUxJ,SAEhD,IAAI0L,KAAWwB,KACrB,IAGL,MAAMC,EAAU,IAAI/H,OAAQ,GAAEgI,EAAAA,MAAoBC,EAAAA,KAAuB,MAEzE,SAAShC,EAASE,GAChB,OAAOA,EAAUR,QAAO,CAACW,EAAQf,KAC/B,GAAoB,iBAATA,EAET,OADAe,EAAO1K,KAAK2J,GACLe,EAGT,MAAM4B,EAAQ3C,EAAK5I,MAAMoL,GACzB,IAAKG,IAAUA,EAAMtN,OAEnB,OADA0L,EAAO1K,KAAK2J,GACLe,EAGT,MAAM3I,EAAsB,GAE5B,IAAIwK,EAAWD,EAAME,QACjBC,EAAY,EAChB,KAAOF,GAAU,CACf,MAAMjE,EAAQqB,EAAK/F,QAAQ2I,EAAUE,GACrC1K,EAAQ/B,KAAK2J,EAAKzB,UAAUuE,EAAWnE,IACnCiE,EAASG,WAAW,KACtB3K,EAAQ/B,KACN,mBAAC,IAAD,CAAa2M,SAAUJ,GACpBA,KAIDA,EAASK,SAAS,OACpBL,EAAWA,EAASlL,MAAM,EAAGkL,EAASvN,OAAS,IAGjD+C,EAAQ/B,KACN,mBAAC,IAAD,CAAUwB,KAAM+K,EAAU7L,IAAK6L,MAGnCE,EAAYnE,EAAQiE,EAASvN,OAC7BuN,EAAWD,EAAME,QAInB,OAFAzK,EAAQ/B,KAAK2J,EAAKzB,UAAUuE,IAErB,IAAI/B,KAAW3I,KACrB,IAGL,SAASuI,EAAsBC,EAAuB3P,GACpD,OAAO2P,EAAUR,QAAO,CAACW,EAAQf,KAC/B,GAAoB,iBAATA,EAET,OADAe,EAAO1K,KAAK2J,GACLe,EAGT,MAAMK,EAAQpB,EAAKxI,MAAMuI,GACnBd,EAAWe,EAAK5I,MAAM2I,IAA0B,GAGtD,OAFAgB,EAAO1K,KAAK+K,EAAM,IAEXnC,EAASmB,QAAO,CAAC8C,EAA0BC,EAAQ3N,KAC3C,QAATvE,EACFiS,EAAa7M,KACX8M,EAAOJ,WAAW,MACd,4BAAII,EAAO7L,QAAQ,QAAS,KAC5B,4BAAI6L,EAAO7L,QAAQ,MAAO,MAGhC4L,EAAa7M,KACX8M,EAAOJ,WAAW,MACb,MAAKI,EAAO7L,QAAQ,QAAS,UAC7B,MAAK6L,EAAO7L,QAAQ,MAAO,WAIpC,MAAMqH,EAAY,EAAJnJ,EAAQ,EAKtB,OAJI4L,EAAMzC,IACRuE,EAAa7M,KAAK+K,EAAMzC,IAGnBuE,IACNnC,KACF,M,yHC/PL,MAIMqC,EAGC,IAAI/S,IAEL4I,GAAiBoK,EAAAA,EAAAA,GAAuB,WA2D9C,GAAezL,EAAAA,EAAAA,KAzDe,IAGxB,IAHyB,SAC7BG,EAD6B,UAE7B1G,GACI,EAEJ,MAAMiS,GAAaC,EAAAA,EAAAA,IAAuB,OAEnCC,EAAYC,EAAQC,IAAWC,EAAAA,EAAAA,KAEhCrL,GAAcC,EAAAA,EAAAA,KAAaC,IAAmD,MAClFA,EAAEO,iBACFP,EAAEoL,kBAEF,UAAAR,EAAmBhS,IAAIC,UAAvB,SAAoCqN,SAASmF,GAAYA,EAAQJ,WAEjE,MAAMK,EAAgBR,EAAWS,QAAS/C,UAAU3L,OAC9C2O,EAAqE,IAAzDnP,KAAKoP,MAAMH,EA3BE,IA4BzBI,EAAYrP,KAAKsP,IA3BF,IA2BwBtP,KAAKuP,IAAIJ,EA1BjC,MA4BrB9R,YAAW,KAAM,MACf,UAAAkR,EAAmBhS,IAAIC,UAAvB,SAAoCqN,SAASmF,GAAYA,EAAQH,YACjEA,MACCQ,KACF,CAACR,EAASrS,IAkBb,OAhBAgT,EAAAA,EAAAA,KAAU,KACR,GAAKhT,EAUL,OANI+R,EAAmBkB,IAAIjT,GACzB+R,EAAmBhS,IAAIC,GAAYgF,KAAK,CAAEoN,OAAAA,EAAQC,QAAAA,IAElDN,EAAmB/P,IAAIhC,EAAW,CAAC,CAAEoS,OAAAA,EAAQC,QAAAA,KAGxC,KACLN,EAAmB5P,OAAOnC,MAE3B,CAACqS,EAASpL,EAAakL,EAAYnS,EAAWoS,IAG/C,2BACE3L,UAAWmB,EACT,KACCuK,GAAc,aACdA,GAAcnJ,QAAQhJ,IAAc,YAEvCgI,QAAShI,IAAcmS,EAAalL,OAAcsE,GAElD,2BAAM9E,UAAWmB,EAAe,WAAYsL,IAAKjB,GAC9CvL,OCxDF,SAASqH,EACdvH,EACAoH,EACAJ,EACAC,EACA0F,EACAnT,EACA0N,GAEA,IAAKE,IAAaA,EAAS5J,OACzB,OAAOoP,EAAkB5M,EAAMgH,EAAWC,EAAqB0F,EAAoBzF,GAGrF,MAAMgC,EAAqB,GAC3B,IAAI2D,GAA0B,EAE9B,MAAMC,EAyKR,SAA0B1F,GACxB,MAAM2F,EAAsC,IAAIC,IAC1CF,EAAwC,GAiB9C,OAfA1F,EAASP,SAAQ,CAACyE,EAAQxE,KACxB,GAAIiG,EAAuBN,IAAI3F,GAC7B,OAGF,MAAMmG,EAAkBC,EAAe5B,EAAQxE,EAAOM,EAAU2F,GAC5DE,IACFA,EAAgBE,iBAAiBtG,SAASuG,IACxCL,EAAuBM,IAAID,MAG7BN,EAAkBtO,KAAKyO,OAIpBH,EA5LmBQ,CAAiBlG,GAG3C,SAASmG,EACPC,EACAC,EACAR,EACAS,GAEA,MAAMC,EAA2B,IAC3B,OAAErC,EAAF,eAAUsC,GAAmBX,GAC7B,OAAEY,EAAF,OAAUrQ,EAAV,KAAkBpE,GAASkS,EAGjC,IAAIwC,EAAa9N,EAAK0G,UAAU8G,EAAeK,GAC/C,MAAME,EAAmBD,EAAWtQ,OAChCsQ,IACEjB,GAA2BiB,EAAWtQ,OAAS,GAAuB,OAAlBsQ,EAAW,KACjEA,EAAaA,EAAWE,OAAO,GAC/BnB,GAA0B,GAExBiB,GACFH,EAAanP,QAAQoO,EACnBkB,EAAY9G,EAAWC,EAAqB0F,EAAoBzF,KAKtE,MAAM+G,EAAmBT,EAAgBO,EACnCG,EAAiBD,EAAmBzQ,EAE1C,IAAI2Q,EAA0BnO,EAAK0G,UAAUmH,EAAQA,EAASrQ,GAC9D,MAAM4Q,EAAkC,GAYxC,GAVIvB,GAA2BsB,EAAc3Q,OAAS,GAA0B,OAArB2Q,EAAc,KACvEA,EAAgBA,EAAcH,OAAO,GACrCnB,GAA0B,GAGxBzT,IAASkD,EAAAA,GAAAA,MACXuQ,GAA0B,GAIxBe,EAAepQ,OAAQ,CACzB,IAAI6Q,EAAcJ,EAElBL,EAAe/G,SAAQ,CAACyH,EAAcC,KACpC,MACEZ,aAAca,EACdN,eAAgBO,GACdlB,EACFc,EACAH,EACAI,EACAC,IAAsBX,EAAepQ,OAAS,GAGhD4Q,EAAoB5P,QAAQgQ,GAC5BH,EAAcI,KAKlB,MAAMC,EAAY/B,EAuStB,SACErB,EACA6C,EACAC,GAEA,MAAMO,EAAyC,iBAAlBR,GAA8BA,EAErDS,EAAkBR,EAAoB5Q,OACxC4Q,EAAoBrP,KAAK,KACzBqH,EAAAA,EAAAA,GAAW+H,EAAe,CAAC,cAAe,aAAc,YAAYpP,KAAK,IAE7E,IAAK4P,EACH,OAAOC,EAGT,OAAQtD,EAAOlS,MACb,KAAKkD,EAAAA,GAAAA,KACH,MAAQ,MAAKsS,QACf,KAAKtS,EAAAA,GAAAA,OACH,MAAQ,MAAKsS,QACf,KAAKtS,EAAAA,GAAAA,UACH,MAAQ,MAAKsS,QACf,KAAKtS,EAAAA,GAAAA,KACH,MAAQ,kCAAiCsS,WAC3C,KAAKtS,EAAAA,GAAAA,IACH,MAAQ,cAAasS,eACvB,KAAKtS,EAAAA,GAAAA,OACH,MAAQ,QAAOsS,UACjB,KAAKtS,EAAAA,GAAAA,YACH,MAAQ,mEAEcA,EAAAA,GAAAA,uCACJgP,EAAOuD,wEAGtBD,QACL,KAAKtS,EAAAA,GAAAA,IACL,KAAKA,EAAAA,GAAAA,QACH,MAAQ,sDAECwS,EAAWH,EAAerD,iCACbA,EAAOlS,qCAE1BwV,QACL,KAAKtS,EAAAA,GAAAA,QACH,MAAQ,6DAEcA,EAAAA,GAAAA,sBACjBsS,WACP,QACE,OAAOA,GAxVLG,CAAoBzD,EAAQ6C,EAAeC,GAyKnD,SACE9C,EACA6C,EACAC,EACApH,EACAxN,EACA0N,GAEA,MAAM8H,EAAsC,iBAAlBb,GAA8BA,EAClDS,EAAkBR,EAAoB5Q,OAAS4Q,EAAsBD,EAE3E,SAASc,IACP,OAAOrC,EACLgC,EAAiB5H,OAAWjC,OAAWA,EAAWmC,GAItD,IAAK8H,EACH,OAAOC,IAGT,GAAI/H,EAAU,CACZ,MAAMlH,EAAOiP,IACb,OAAI3D,EAAOlS,OAASkD,EAAAA,GAAAA,QACX,mBAAC,EAAD,KAAU0D,GAEZA,EAGT,OAAQsL,EAAOlS,MACb,KAAKkD,EAAAA,GAAAA,KACH,OAAO,iCAAS2S,KAClB,KAAK3S,EAAAA,GAAAA,WACH,OAAO,qCAAa2S,KACtB,KAAK3S,EAAAA,GAAAA,WACH,OACE,wBACEkF,QAAS0N,EACTjP,UAAU,mBACVwB,IAAI,QAEHwN,KAGP,KAAK3S,EAAAA,GAAAA,QAUL,KAAKA,EAAAA,GAAAA,QACH,OACE,wBACEkF,QAAS2N,EACTlP,UAAU,mBACVwB,IAAI,QAEHwN,KAGP,KAAK3S,EAAAA,GAAAA,KACH,OAAO,2BAAM2D,UAAU,oBAAoBgP,KAC7C,KAAK3S,EAAAA,GAAAA,MACH,OACE,wBACE6C,KAAO,UAAS6P,IAChB1N,OAAO,SACPC,IAAI,sBACJtB,UAAU,mBACVwB,IAAI,QAEHwN,KAGP,KAAK3S,EAAAA,GAAAA,OACH,OAAO,6BAAK2S,KACd,KAAK3S,EAAAA,GAAAA,YACH,OACE,mBAAC8S,EAAA,EAAD,CAAaP,OAAQvD,EAAOuD,QACzBI,KAGP,KAAK3S,EAAAA,GAAAA,QACH,OACE,mBAAC8S,EAAA,EAAD,CAAajE,SAAU6D,GACpBC,KAGP,KAAK3S,EAAAA,GAAAA,MACH,OACE,wBACE6C,KAAO,OAAM6P,IACb/O,UAAU,mBACVwB,IAAI,QAEHwN,KAGP,KAAK3S,EAAAA,GAAAA,IACH,OAAO,0BAAK2D,UAAU,mBAAmBgP,KAC3C,KAAK3S,EAAAA,GAAAA,OACH,OAAO,8BAAM2S,KACf,KAAK3S,EAAAA,GAAAA,QACL,KAAKA,EAAAA,GAAAA,IACH,OACE,mBAAC+S,EAAA,EAAD,CACEnQ,IAAK4P,EAAWE,EAAY1D,GAC5BtL,KAAMgP,GAELC,KAGP,KAAK3S,EAAAA,GAAAA,UACH,OAAO,8BAAM2S,KACf,KAAK3S,EAAAA,GAAAA,QACH,OAAO,mBAAC,EAAD,CAAS9C,UAAWA,GAAYyV,KACzC,QACE,OAAOA,KAjSLK,CAAchE,EAAQ6C,EAAeC,EAAqBpH,EAAWxN,EAAW0N,GAUpF,GARIP,MAAMC,QAAQ8H,GAChBf,EAAanP,QAAQkQ,GAErBf,EAAanP,KAAKkQ,GAKhBhB,GAAgBQ,EAAiBT,EAAa,CAChD,IAAI8B,EAAYvP,EAAK0G,UAAUwH,EAAgBT,GAC3CZ,GAA2B0C,EAAU/R,OAAS,GAAsB,OAAjB+R,EAAU,KAC/DA,EAAYA,EAAU7I,UAAU,IAE9B6I,GACF5B,EAAanP,QAAQoO,EACnB2C,EAAWvI,EAAWC,EAAqB0F,EAAoBzF,IAKrE,MAAO,CACLyG,aAAAA,EACAO,eAAAA,GAKJ,IAAIpH,EAAQ,EAcZ,OAZAgG,EAAkBjG,SAAQ,CAACyE,EAAQkE,KACjC,MAAM,aAAE7B,EAAF,eAAgBO,GAAmBX,EACvCzG,EACA9G,EAAKxC,OACL8N,EACAkE,IAAe1C,EAAkBtP,OAAS,GAG5C0L,EAAO1K,QAAQmP,GACf7G,EAAQoH,KAGHhF,EAGF,SAASuG,EAA0BC,GACxC,MAAM,KAAE1P,EAAF,SAAQoH,GAAasI,GAAiB,GAC5C,IAAK1P,EACH,MAAO,GAGT,MAAMkJ,EAAS3B,EACbvH,EACAoH,OACArC,OACAA,GACA,GAGF,OAAI4B,MAAMC,QAAQsC,GACTA,EAAOnK,KAAK,IAGdmK,EAGT,SAAS0D,EACPrM,EACAyG,EACAC,EACA0F,EACAzF,GAEA,GAAIP,MAAMC,QAAQrG,GAAU,CAC1B,MAAM2I,EAAqB,GAM3B,OAJA3I,EAAQsG,SAAS8I,IACfzG,EAAO1K,QAAQoO,EAAkB+C,EAAG3I,EAAWC,EAAqB0F,EAAoBzF,OAGnFgC,EAGT,GAAIyD,EACF,OAAOvG,EAAAA,EAAAA,GAAW7F,EAAS,CAAC,cAAe,aAAc,YAG3D,MAEM6H,EAAwB,CAFVnB,EAAsB,WAAa,SAOvD,OAJKC,GACHkB,EAAQ5J,KAAK,MAGXwI,GACKZ,EAAAA,EAAAA,GAAW7F,EAAS6H,EAAQwH,OAAO,aAAc,CAAE5I,UAAAA,KAEnDZ,EAAAA,EAAAA,GAAW7F,EAAS6H,GA2B/B,SAAS8E,EACP5B,EACAxE,EACAM,EACA2F,GAEA,MAAM,OAAEc,EAAF,OAAUrQ,GAAW8N,EACrB6B,EAAmB,IAAIH,IAAI,CAAClG,IAElC,GAAIiG,EAAuBN,IAAI3F,GAC7B,OAIF,MAAM8G,EAAqC,GAsB3C,OArB6BxG,EAC1B5B,QAAO,CAAC7E,EAAGhD,IAAMA,EAAImJ,GAASnG,EAAEkN,QAAUA,GAAUlN,EAAEkN,OAASA,EAASrQ,IACxE8H,KAAK3E,GAAMuM,EAAevM,EAAGyG,EAAShF,QAAQzB,GAAIyG,EAAU2F,KAC5DvH,OAAyBhD,SAEPqE,SAASgJ,IAC5B,IAAIC,GAAY,EAEhBD,EAAa1C,iBAAiBtG,SAASuG,IAChC0C,GAAc3C,EAAiBV,IAAIW,KACtC0C,GAAY,GAGd3C,EAAiBE,IAAID,MAGnB0C,GACFlC,EAAepP,KAAKqR,MAIjB,CACLvE,OAAAA,EACA6B,iBAAAA,EACAS,eAAAA,GAuLJ,SAASkB,EAAWX,EAAuB7C,GACzC,MAAM,KAAElS,EAAF,IAAQ8F,GAAQoM,EACtB,OAAOlS,IAASkD,EAAAA,GAAAA,SAAiC4C,EAAMA,EAAMiP,EAG/D,SAASe,EAAsBvO,IAC7BL,EAAAA,EAAAA,MAAcyP,eAAe,CAAEC,QAASrP,EAAEsP,cAAc9G,YAG1D,SAASgG,EAAmBxO,IAC1BL,EAAAA,EAAAA,MAAc4P,wBAAwB,CAAEC,MAAOxP,EAAEsP,cAAc9G,aAC/D7I,EAAAA,EAAAA,MAAc8P,4B,+DCxcT,SAASC,EAAwB1P,GAAwD,IAAtB2P,EAAsB,wDAE5FC,EAAAA,KACIvO,SAASwO,eACVxO,SAASwO,cAActN,KAAOuN,EAAAA,KAC5BH,GAAgB3P,EAAEW,SAAWX,EAAEsP,eAKtCtP,EAAEO,iBAGG,SAASwP,EAAoC/P,GAClD0P,EAAwB1P,GAAG,K,kECF7B,MAyBA,GAAegQ,EAAAA,EAAAA,KACb,CAACC,EAAD,KAAoC,IAA3B,OAAE/B,GAAyB,EAClC,MAAO,CACLgC,WAAYhC,GAASiC,EAAAA,EAAAA,IAAWF,EAAQ/B,QAAU9J,KAHxD,EAzB+C,IAIzC,IAJ0C,SAC9CoG,EAD8C,WAE9C0F,EAF8C,SAG9C3Q,GACI,EACJ,MAAM,SACJ+C,EADI,mBAEJ8N,IACEzQ,EAAAA,EAAAA,MAUJ,OACE,wBAAGkB,QATe,KACdqP,EACF5N,EAAS,CAAEC,GAAI2N,EAAW3N,KACjBiI,GACT4F,EAAmB,CAAE5F,SAAUA,EAASzE,UAAU,MAK3BzG,UAAU,mBAAmBwB,IAAI,QACvDvB,O,2ECSP,MA4HA,EA1H6B,IA4BvB,IA5BwB,IAC5BwM,EAD4B,KAE5BtT,EAAO,SAFqB,QAG5BoI,EAH4B,cAI5BwP,EAJ4B,YAK5BC,EAL4B,aAM5BC,EAN4B,aAO5BC,EAP4B,QAQ5BC,EAR4B,SAS5BlR,EAT4B,KAU5BmJ,EAAO,UAVqB,MAW5BgI,EAAQ,UAXoB,gBAY5BC,EAZ4B,UAa5BrR,EAb4B,MAc5BmM,EAd4B,KAe5BmF,EAf4B,MAgB5BC,EAhB4B,OAiB5BC,EAjB4B,UAkB5BC,EAlB4B,UAmB5BC,EAnB4B,KAoB5BxS,EApB4B,SAqB5ByS,EArB4B,SAsB5BC,EAtB4B,OAuB5BC,EAvB4B,MAwB5BC,EAxB4B,SAyB5BC,EAzB4B,MA0B5B7R,EA1B4B,qBA2B5B8R,GACI,EAEAC,GAAaxG,EAAAA,EAAAA,IAA8C,MAC3DgB,IACFwF,EAAaxF,GAGf,MAAOyF,EAAWC,IAAgBC,EAAAA,EAAAA,KAAS,GAErCC,GAAgBlR,EAAAA,EAAAA,GACpB,SACAnB,EACAoJ,EACAgI,EACAjF,GAAS,QACTmF,GAAQ,OACRC,GAAS,QACTK,GAAY,WACZJ,GAAU,OACVC,GAAa,UACbI,GAAU,aACVC,GAAS,QACTI,GAAa,UACbb,GAAmB,cAGf7Q,GAAcC,EAAAA,EAAAA,KAAaC,KAC1BkR,GAAYrQ,GACfA,EAAQb,GAGVyR,GAAa,GACb/X,YAAW,KACT+X,GAAa,KA/DK,OAiEnB,CAACP,EAAUrQ,IAER+Q,GAAkB7R,EAAAA,EAAAA,KAAaC,IAC9BsR,GAAsBtR,EAAEO,kBACxB2Q,GAAYZ,GACfA,EAAYtQ,KAEb,CAACsQ,EAAaY,EAAUI,IAE3B,OAAI9S,EAEA,wBACEuN,IAAKwF,EACLjS,UAAWqS,EACXnT,KAAMA,EACNkC,MAAOsQ,EACPC,SAAUA,EACVI,SAAUA,EACVvQ,IAAKtB,EAAQ,WAAQ4E,GAEpB7E,GACC2R,GAAYC,GACZ,mBAAC,IAAD,OAQN,6BACEpF,IAAKwF,EACL9Y,KAAMA,EACN6G,UAAWqS,EACX9Q,QAASf,EACTuQ,cAAeA,EACfC,YAAasB,EACbrB,aAAcA,IAAiBW,EAAWX,OAAenM,EACzDoM,aAAcA,IAAiBU,EAAWV,OAAepM,EACzDqM,QAASA,IAAYS,EAAWT,OAAUrM,EAC1C,aAAY4M,EACZtQ,MAAOsQ,EACPK,SAAUA,EACVvQ,IAAKtB,EAAQ,WAAQ4E,EACrByN,MAAOlB,EAAmB,yBAAwBA,UAAqBvM,GAEtE2M,EACC,8BACE,2BAAMjQ,IAAKtB,EAAQ,YAAS4E,GAA5B,kBACA,mBAAC,IAAD,CAASsM,MAAOI,EAAS,OAAS,WAElCvR,GACF2R,GAAYC,GACZ,mBAAC,IAAD,S,sFCzIR,MAqDA,GAAe/R,EAAAA,EAAAA,KArDgB,IAazB,IAb0B,GAC9BmD,EAD8B,KAE9BtI,EAF8B,MAG9BkE,EAH8B,MAI9B2T,EAJ8B,SAK9BC,EAL8B,QAM9BC,EAN8B,SAO9Bd,EAP8B,MAQ9BzF,EAR8B,SAS9BwG,EAT8B,UAU9BlB,EAV8B,SAW9BmB,EAX8B,QAY9BC,GACI,EACJ,MAAMjP,GAAOkP,EAAAA,EAAAA,KACPC,GAAetS,EAAAA,EAAAA,KAAauS,IAC5BJ,GACFA,EAASI,GAGPH,GACFA,EAAQG,EAAMhD,cAAc0C,WAE7B,CAACE,EAAUC,IAER7S,GAAYmB,EAAAA,EAAAA,GAChB,WACAyQ,GAAY,WACZzF,GAAS,QACTsF,GAAa,UACbkB,GAAY,YAGd,OACE,4BAAO3S,UAAWA,EAAWwB,IAAKoC,EAAK1D,MAAQ,WAAQ4E,GACrD,4BACE3L,KAAK,WACL8J,GAAIA,EACJtI,KAAMA,EACNkE,MAAOA,EACP6T,QAASA,EACTd,SAAUA,EACVgB,SAAUG,IAEZ,0BAAK/S,UAAU,iBACb,2BAAMA,UAAU,QAAQwB,IAAI,SAAQ2E,EAAAA,EAAAA,GAAWqM,IAC9CC,GAAY,2BAAMzS,UAAU,WAAWwB,IAAI,SAAQ2E,EAAAA,EAAAA,GAAWsM,KAEhEhB,GAAa,mBAAC,IAAD,W,wDCzDpB,MAsEA,EAtEmC,IAU7B,IAV8B,QAClCwB,EADkC,UAElCjT,EAFkC,SAGlCC,EAHkC,UAIlCiT,EAAY,OAJsB,UAKlCC,EAAY,MALsB,OAMlCC,EANkC,UAOlCC,EAPkC,OAQlCC,EARkC,QASlCC,GACI,EAEJ,MAAMC,GAAU/H,EAAAA,EAAAA,IAAuB,MAEjCgI,GAAchI,EAAAA,EAAAA,IAAuB,OACpCiI,EAAQC,IAAavB,EAAAA,EAAAA,KAAS,GA6BrC,OACE,0BACE3F,IAAKgH,EACLzT,UAAY,gBAAeA,GAAa,KACxC4T,UAxBmBlT,IACrB,MAAMmT,EAAOL,EAAQvH,QAErB,IAAKyH,GAAwB,KAAdhT,EAAEoT,UAAmBD,EAClC,OAGF,MAAME,EAAiBhS,SAASwO,cAC1ByD,EAAkBtN,MAAMuN,KAAKJ,EAAK5T,UAEnC8T,IAA+D,IAA7CC,EAAgB7R,QAAQ4R,IAC5CC,EAAgB,GAAmBE,UAenCjB,EAAQ,CAAEkB,UAjCM,KACnBR,GAAWD,GACPA,EACEH,GAASA,IACJD,GAAQA,KA6BmBI,OAAAA,IAEpC,mBAAC,IAAD,CACEjH,IAAK+G,EACLY,aAAcX,EACdC,OAAQA,GAAUnR,QAAQ8Q,GAC1BrT,UAAWA,GAAa,GACxBkT,UAAWA,EACXC,UAAWA,EACXC,OAAQA,EACRiB,WAAS,EACTd,QAtBc,KAClBI,GAAU,GACNJ,GAASA,KAqBTe,qBAAsBjB,GAErBpT,M,kECpDT,MA8DA,GAAeH,EAAAA,EAAAA,KA9DiB,IAoB1B,IApB2B,IAC/B2M,EAD+B,GAE/BxJ,EAF+B,UAG/BjD,EAH+B,MAI/BnB,EAJ+B,MAK/B2T,EAL+B,MAM/BhZ,EAN+B,QAO/B+a,EAP+B,SAQ/B3C,EAR+B,SAS/B4C,EAT+B,YAU/BlO,EAV+B,aAW/BmO,EAX+B,UAY/BC,EAZ+B,UAa/BC,EAb+B,SAc/B/B,EAd+B,QAe/BgC,EAf+B,WAgB/BC,EAhB+B,UAiB/BjB,EAjB+B,OAkB/BkB,EAlB+B,QAmB/BC,GACI,EACJ,MAAMnR,GAAOkP,EAAAA,EAAAA,KACPkC,EAAYxb,GAAS+a,GAAW/B,EAChCH,GAAgBlR,EAAAA,EAAAA,GACpB,cACAtC,GAAS,UACTrF,EAAQ,QAAU+a,GAAW,UAC7B3C,GAAY,WACZ4C,GAAY,WACZQ,GAAa,aACbhV,GAGF,OACE,0BAAKA,UAAWqS,EAAe7Q,IAAKoC,EAAK1D,MAAQ,WAAQ4E,GACvD,4BACE2H,IAAKA,EACLzM,UAAU,eACV7G,KAAK,OACL8J,GAAIA,EACJzB,IAAI,OACJ3C,MAAOA,GAAS,GAChByH,YAAaA,EACbqO,UAAWA,EACXF,aAAcA,EACdC,UAAWA,EACX9C,SAAUA,EACV4C,SAAUA,EACV5B,SAAUA,EACVgC,QAASA,EACTC,WAAYA,EACZjB,UAAWA,EACXkB,OAAQA,EACRC,QAASA,IAEVC,GACC,4BAAOC,QAAShS,GAAK+R,Q,wDCzE7B,MAoBA,EApB2B,IAErB,IAFsB,SAC1B/U,EAD0B,UAChBD,EADgB,MACLE,EADK,QACEqB,GACxB,EACJ,MAAMf,GAAcC,EAAAA,EAAAA,KAAaC,IAC/BA,EAAEO,iBACFM,EAASb,KACR,CAACa,IAEJ,OACE,wBACErC,KAAK,IACLc,WAAWmB,EAAAA,EAAAA,GAAe,OAAQnB,GAClCwB,IAAKtB,EAAQ,MAAQ,OACrBqB,QAASA,EAAUf,OAAcsE,GAEhC7E,K,kECfP,MAQA,GAAeH,EAAAA,EAAAA,KARe,IAAkD,IAAjD,MAAEsR,EAAQ,OAAV,gBAAkB8D,EAAlB,QAAmC3T,GAAc,EAC9E,OACE,0BAAKvB,WAAWmB,EAAAA,EAAAA,GAAe,UAAWI,GAAW,eAAgBA,QAASA,GAC5E,mBAAC,IAAD,CAAS6P,MAAOA,EAAO8D,gBAAiBA,S,sICsB9C,MAkGA,EAhG2B,IAoBrB,IApBsB,IAC1BzI,EAD0B,aAE1B2H,EAF0B,OAG1BV,EAH0B,UAI1B1T,EAJ0B,MAK1BuS,EAL0B,YAM1B4C,EAN0B,SAO1BlV,EAP0B,iBAQ1BmV,EAR0B,iBAS1BC,EAT0B,UAU1BnC,EAAY,OAVc,UAW1BC,EAAY,MAXc,UAY1BkB,GAAY,EAZc,OAa1BjB,EAb0B,kBAc1BkC,GAAoB,EAdM,oBAe1BC,EAf0B,QAgB1BhC,EAhB0B,aAiB1BtC,EAjB0B,aAkB1BC,EAlB0B,qBAmB1BoD,GACI,EAEAd,GAAU/H,EAAAA,EAAAA,IAAuB,MACjCgB,IACF+G,EAAU/G,GAEZ,MAAM+I,EAAuBpB,GAAgBZ,GAEvC,qBACJiC,IACEC,EAAAA,EAAAA,GACFhC,EACA6B,EACAjB,OACAxP,EACAwP,IAGF/H,EAAAA,EAAAA,KACE,IAAOmH,GAAUH,GAAUoC,EAAAA,EAAAA,GAAsBpC,QAAWzO,GAC5D,CAAC4O,EAAQH,KAGXqC,EAAAA,EAAAA,IAAelC,EAAQH,OAASzO,OAAWA,EAAWuP,IAEtDwB,EAAAA,EAAAA,IAAsB,IAAkB,IAAhBC,GAAgB,GAClCpC,IAAYA,IAAyB,IAAfoC,KACxBC,EAAAA,EAAAA,IAjDqB,OAmDtB,CAACrC,IAEJ,MAAMsC,GAAgBC,EAAAA,EAAAA,GAA0BzC,EAASE,EAAQW,EAAYd,OAAUzO,OAAWA,GAAW,IAE7GoR,EAAAA,EAAAA,GACExC,EACA8B,EACAF,OAAoBxQ,EAAYyO,GAGlC,MAAM4C,GAAkBhV,EAAAA,EAAAA,GACtB,sCACAgS,EACAD,EACAE,GAAU,cACVqC,GAGIW,OAA6CtR,IAArBuQ,EAAkC,GAAEA,WAAuBvQ,EACnFuR,OAA6CvR,IAArBsQ,EAAkC,GAAEA,WAAuBtQ,EAEzF,OACE,0BACE9E,WAAWmB,EAAAA,EAAAA,GAAe,oBAAqBnB,GAC/C4T,UAAWF,EAASsC,OAAgBlR,EACpCmM,aAAcA,EACdC,aAAcwC,EAASxC,OAAepM,EACtCyN,MAAOA,GAENmB,GAEC,0BAAK1T,UAAU,WAAWgR,YAAaP,EAAAA,IAEzC,0BACEhE,IAAK+G,EACLxT,UAAWmW,EACX5D,MAAQ,qBAAoB8D,GAAyBnD,KAAakD,GAAyBjD,KACzFgC,GAAe,KACjB5T,QAAS8S,EAAYd,OAAUzO,GAE9B7E,EACAmT,GAAU,0BAAKpT,UAAU,UAAUoT,O,kEC7G5C,MA2FA,EA3FgCkD,IAC9B,MAAM,KACJC,EADI,UAEJvW,EAFI,SAGJC,EAHI,QAIJsB,EAJI,KAKJrC,EALI,SAMJyS,EANI,SAOJC,EAPI,YAQJ4E,EARI,UASJ9E,GACE4E,EAEE1S,GAAOkP,EAAAA,EAAAA,KACPtS,GAAcC,EAAAA,EAAAA,KAAaC,IAC/B,GAAIkR,IAAarQ,EAIf,OAHAb,EAAEoL,uBACFpL,EAAEO,iBAKJM,EAAQb,KACP,CAACkR,EAAUrQ,IAERyU,GAAgBvV,EAAAA,EAAAA,KAAaC,IACjC,GAAkB,KAAdA,EAAEoT,SAAgC,KAAdpT,EAAEoT,QAI1B,OAAIlC,IAAarQ,GACfb,EAAEoL,uBACFpL,EAAEO,uBAKJM,EAAQb,KACP,CAACkR,EAAUrQ,IAER8Q,GAAgBlR,EAAAA,EAAAA,GACpB,WACAnB,EACA4R,GAAY,WACZ4E,GAAe,eAGXlW,EACJ,sCACGiW,GACC,wBAAGvW,UAAY,QAAOuW,IAAQ,YAAWA,EAAKtL,WAAW,SAAWsL,EAAK/W,QAAQ,QAAS,SAAMsF,IAEjG7E,GAIL,OAAIf,EAEA,wBACE6S,SAAU,EACV/R,UAAWqS,EACXnT,KAAMA,EACNyS,SAAUA,EACV,aAAYD,EACZtQ,MAAOsQ,EACPrQ,OAAQnC,EAAK+L,WAAW/Q,OAAOgC,SAASua,QAAU,QAAU,SAC5DnV,IAAI,sBACJE,IAAKoC,EAAK1D,MAAQ,WAAQ4E,EAC1BvD,QAASA,GAERjB,GAML,0BACEoW,KAAK,SACL3E,SAAU,EACV/R,UAAWqS,EACX9Q,QAASf,EACToT,UAAWoC,EACX,aAAYtE,EACZtQ,MAAOsQ,EACPlQ,IAAKoC,EAAK1D,MAAQ,WAAQ4E,GAEzBxE,K,wDC9FP,MA8CA,GAAeR,EAAAA,EAAAA,KA5CU,KACvB,MAAO6W,EAASC,IAAcxE,EAAAA,EAAAA,IAAmB,IAE3CyE,GAAmBC,EAAAA,EAAAA,KAAQ,KACxBC,EAAAA,EAAAA,KAAS,KACdH,EAAW,MAPa,KAQA,IACzB,IAEGtE,GAAkB7R,EAAAA,EAAAA,KAAaC,IACnC,GAAiB,IAAbA,EAAEsW,OACJ,OAGF,MAAMC,EAAYvW,EAAEsP,cACdkH,EAAWD,EAAUE,wBAErBC,EAAaH,EAAUI,YAAc,EAE3CT,EAAW,IACND,EACH,CACEW,EAAG5W,EAAE6W,QAAUL,EAASI,EAAKF,EAAa,EAC1CI,EAAG9W,EAAE+W,QAAUP,EAASM,EAAKJ,EAAa,EAC1ChO,KAAMgO,KAIVM,uBAAsB,KACpBb,SAED,CAACF,EAASE,IAEb,OACE,0BAAK7W,UAAU,mBAAmBgR,YAAasB,GAC5CqE,EAAQtR,KAAI,QAAC,EAAEiS,EAAF,EAAKE,EAAL,KAAQpO,GAAT,SACX,2BACEmJ,MAAQ,SAAQ+E,aAAaE,eAAepO,gBAAmBA,iB,wDC9CzE,MAcA,EAXK,IAGC,IAHA,MACJgI,EAAQ,OADJ,gBAEJ8D,GACI,EACJ,OACE,0BAAKlV,WAAWmB,EAAAA,EAAAA,GAAe,UAAWiQ,EAAO8D,GAAmB,kBAAoB,MAAKA,MAC3F,kC,8iCCfC,MAAMyC,EAAa,WACbC,EAAkB,cAElBC,EAAWC,gBACXC,EAAcD,SAEdlf,GACXkf,EAEWE,GAAa,EAEbC,GAAUH,EAGVI,EAAkB,mFAGlBC,EAAmB,YACnBC,EAAqB,mBAErBC,GAA8B,EAC9BC,EAAyB,kBACzBC,EAAqC,IACrCC,EAAqC,IACrCC,EAA+C,GAE/CC,GAAuB,EACvBC,EAAmB,WACnBC,EAA2B,mBAE3BC,EAA+B,uBAE/BC,EAAuB,eACvBC,EAAkB,mBAElBC,EAAkC,CAAC,EAAG,EAAG,GAAI,GAAI,IAAK,KAK7DC,EAAgC,oBAAX/e,QAA0BA,OAAOgf,aAAe,IAE9DC,EAAsB,EAEtBC,EAAqBH,EAAc,GAAK,GACxCI,EAAmD,EAArBD,EAE9BE,EAAiB,GACjBC,EAAkBN,EAAc,GAAK,GACrCO,EAAuB,IACvBC,EAAqB,GACrBC,EAAuB,GACvBC,EAAsB,GACtBC,EAAgB,GAChBC,EAAqB,IAIrBC,EAAyB,IAKzBC,EAAkC,GAIlCC,EAAiB,EACjBC,EAAwB,EAExBC,EAAsB,EAEtBC,EAAsB,EACtBC,EAA0BD,EAE1BE,EAA+B,GAC/BC,EAAmC,GACnCC,EAAqC,GAErCC,EAAiB,IACjBC,EAA+B,IAE/BjK,EAAoB,wBACpBkK,EAA0B,8BAG1BC,EAA4C,KAE5CC,EAAkC,KAElCC,EAA2C,KAC3CC,GAA0C,IAC1CC,GAA0B,IAC1BC,GAAoC,IACpCC,GAAqC,IAErCC,GAAwB,IACxBC,GAAc,IAEdC,GAAsB,IAEtBC,GAA2B,KAC3BC,GAA2B,IAC3BC,GAA2B,IAC3BC,GAA4C,IAQ5CC,IALsB1e,KAAKoP,OAAOmP,GAA2BC,IAA4B,GAC5D,IAAIxO,IAAI,CAChD,aAAc,sBAAuB,iBAAkB,0BAA2B,kBAGlC,IACrC2O,GAAoC,GACpCC,GAAoB,IACpBC,GAA2B,IAC3BC,GAAsB,GACtBC,GAAgC,GAChCC,GAA6B,GAC7BC,GAAsB,GACtBC,GAAqB,GACrBC,GAAsB,IACtBC,GAAiC,IACjCC,GAA+B,IAC/BC,GAAiC,IACjCC,GAA6B,IAC7BC,GAAuB,IAEvBC,GAAoB,iBAEpBC,GAA0B,KAE1BC,GAA2B,IAC3BC,GAA4B,IAE5BC,GAAiB,kBAGjBC,GAAgC,IAAI9P,IAAI,CACnD,YAAa,YAAa,eAGf+P,GAAgC,IAAI/P,IAAI,CACnD,cAGWgQ,GAA6B,IAAIhQ,IAAI,IAC7C8P,MACAC,KAGQE,GAAwB,4DAGxBrS,GAAmB,sHACnBC,GAAsB,iBACtB5J,GAAa,+BACbD,GAAc,iCAGdkc,GAAiC,IAAIlQ,IAAI,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAGhJmQ,GAAgC,SAChCC,GAAkB,aAClBC,GAAgB,EAChBC,GAAqB,EAErBC,GAA4B,GAC5BC,GAA0B,EAC1BC,GAAwB,WACxBC,GAAoB,KACpBC,GAAoB,UACpBC,GAAa,CAAC,UAAW,MAAO,WAAY,SAC5CC,GAAgB,eAChBC,GAAiB,CAAC,KAAM,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACrEC,GAAe,kDACfC,GAAuB,UACvBC,GAAsB,UACtBC,GAA2B,YAC3BC,GAAwB,yBAGxBC,GAA+B,IAC/BC,GAA4B,IAAMD,GAClCE,IAAyB,G,uDCtLtC,MAQA,EAR8B,CAAkBC,EAA4BC,EAAiBC,KAC3F,MAAMC,GAAWC,EAAAA,EAAAA,GAAeH,GAChC,OAAOhS,EAAAA,EAAAA,KAAU,IACR+R,EAAGG,GAAY,KAErBF,EAAcC,K,6CCNnB,MAcA,EAdgB,WAAsE,IAArEG,EAAqE,wDACpF,MAAO9f,EAAO+f,IAAYxM,EAAAA,EAAAA,IAASuM,GAE7BE,GAAUpe,EAAAA,EAAAA,KAAY,KAC1Bme,GAAS,KACR,IAEGE,GAAWre,EAAAA,EAAAA,KAAY,KAC3Bme,GAAS,KACR,IAEH,MAAO,CAAC/f,EAAOggB,EAASC,K,8CCX1B,MAQA,EARuB,KACrB,MAAO,CAAEC,IAAc3M,EAAAA,EAAAA,KAAkB,GAEzC,OAAO3R,EAAAA,EAAAA,KAAY,KACjBse,GAAY9L,IAAaA,MACxB,M,iECLL,MAAM+L,EAAwB,iCACxBC,EAAsB,+BAE5B,IAAIC,EACAC,GAAc,EA6BX,SAASC,IACd,OAAOD,EAGF,SAASpJ,IAAyD,IAA7BsJ,EAA6B,uDA9BhD,IA0CvB,SAASC,IACHJ,IACFK,aAAaL,GACbA,OAAUpa,GAGZqa,GAAc,EACdpd,SAASyd,cAAc,IAAIC,MAAMR,IAKnC,OAvBKE,IACHA,GAAc,EACdpd,SAASyd,cAAc,IAAIC,MAAMT,KAG/BE,IACFK,aAAaL,GACbA,OAAUpa,GAcZoa,EAAUhlB,OAAOE,WAAWklB,EAAOD,GAE5BC,EAGT,QAvD+B,SAC7BI,EACAC,GAEG,IADHC,EACG,yDACHrT,EAAAA,EAAAA,KAAU,KACR,IAAIqT,EAWJ,OAPIT,GACFO,IAGF3d,SAAS9I,iBAAiB+lB,EAAuBU,GACjD3d,SAAS9I,iBAAiBgmB,EAAqBU,GAExC,KACL5d,SAAS8d,oBAAoBZ,EAAqBU,GAClD5d,SAAS8d,oBAAoBb,EAAuBU,MAErD,CAACE,EAAYD,EAAoBD,M,wGCdtC,MAEaI,EAAgB5lB,OAAOgC,SAAS6jB,KACvCC,EAAa,GAAE9lB,OAAOgC,SAAS+jB,WAAW/lB,OAAOgC,SAASgkB,SAE1DC,EAA6B,CACjCC,aAAc,EACdC,yBAA0B,EAC1BC,kBAAkB,EAClBV,YAAY,EACZW,QAAQ,EACRC,eAAgB,IAGLC,EAAqB,KAChCN,EAAaP,YAAa,GAWtBc,EAAiB,KACjBP,EAAaI,QACfnmB,YAAW,KACT+lB,EAAaI,QAAS,IA5Bc,MAyC3B,SAAS3K,EACtB+K,EACAC,EACAC,EACAC,GAGA,IAFAC,EAEA,wDADAC,EACA,uCACA,MAAMC,GAAWxV,EAAAA,EAAAA,KAAQ,GACnByV,GAAYzV,EAAAA,EAAAA,KAAO,GACnB0V,GAAezC,EAAAA,EAAAA,GAAYiC,GAC3BS,GAAW3V,EAAAA,EAAAA,KAAO,GAClB4V,GAAe5V,EAAAA,EAAAA,IAA0C,IACzD6V,GAAa5C,EAAAA,EAAAA,GAAYsC,GACzBO,GAAyB9V,EAAAA,EAAAA,KAAgB,GAEzCsH,GAAetS,EAAAA,EAAAA,KAAY,WAA0B,IAAzB+gB,EAAyB,wDACzD,GAAKR,EAiDE,CACL,MAAMS,EAAOH,GAAc,GAC3B,GAAIG,EAAKlkB,OAASyjB,EAAOzjB,OACvBnD,YAAW,KACT,MAAMyM,IAAUsZ,EAAaC,aAC7BD,EAAaK,eAAejiB,KAAKsI,GAEjC3M,OAAOwnB,QAAQC,UAAU,CACvB9a,MAAAA,EACA+a,MAAOd,GACN,GAAK,IAAGE,EAAOA,EAAOzjB,OAAS,MAElC8jB,EAAapV,QAAQ1N,KAAK,CACxBsI,MAAAA,EACAkZ,KAAMiB,EAAOA,EAAOzjB,OAAS,OAE9B,OACE,CACL,MAAMZ,EAAQ8kB,EAAKlkB,OAASyjB,EAAOzjB,OACnC,GAAIgkB,EAAuBtV,QACzBsV,EAAuBtV,SAAU,MAC5B,CACL,GAAI+U,EAAOzjB,SAAW8jB,EAAapV,QAAQ1O,QACrCZ,EAAQ,EAAG,CACb,MAAMklB,EAAOR,EAAapV,QAAQoV,EAAapV,QAAQ1O,OAASZ,EAAQ,GACxE,IAAImlB,EAAYnlB,EAChB,GAAIklB,EAAM,CACR,MAAME,EAAY5B,EAAaK,eAAewB,WAC3CC,GAAMA,IAAMJ,EAAKhb,QAEpBib,EAAY3B,EAAaK,eAAejjB,OAASwkB,EAAY,EAE/D5B,EAAaG,kBAAmB,EAChCpmB,OAAOwnB,QAAQQ,IAAIJ,GACHT,EAAapV,QAAQxN,OAAO4iB,EAAapV,QAAQ1O,OAASZ,EAAQ,EAAGA,GAC7EiK,SAAQ,IAAe,IAAd,MAAEC,GAAY,EAC7BsZ,EAAaK,eAAe/hB,OAAO0hB,EAAaK,eAAere,QAAQ0E,GAAQ,MAKjFma,EAAOzjB,OAAS,GAClBnD,YAAW,KACT,MAAMyM,IAAUsZ,EAAaC,aAC7BD,EAAaK,eAAeL,EAAaK,eAAejjB,OAAS,GAAKsJ,EAEtE3M,OAAOwnB,QAAQS,aAAa,CAC1Btb,MAAAA,EACA+a,MAAOd,GACN,GAAK,GAAEd,KAAagB,EAAOA,EAAOzjB,OAAS,MAE9C8jB,EAAapV,QAAQoV,EAAapV,QAAQ1O,OAAS,GAAK,CACtDsJ,MAAAA,EACAkZ,KAAMiB,EAAOA,EAAOzjB,OAAS,MAE9B,UAvGLojB,IAAaa,IACfJ,EAASnV,SAAU,EAEfiV,EAAUjV,SACZiV,EAAUjV,SAAU,EACpBkU,EAAaK,eAAejiB,KAAK0iB,EAAShV,UAE1C7R,YAAW,KACT,MAAMyM,IAAUsZ,EAAaC,aAE7BD,EAAaK,eAAejiB,KAAKsI,GAEjC3M,OAAOwnB,QAEHvB,EAAaK,eAAezb,SAASob,EAAaE,wBAA0B,IAC1C,IAA/BnmB,OAAOwnB,QAAQE,MAAM/a,OACrBsZ,EAAaE,0BAA4BxZ,IACxCka,EAEF,eACA,aACH,CACDla,MAAAA,EACA+a,MAAOd,GACN,IAEHG,EAAShV,QAAUpF,EAEfka,IACFZ,EAAaE,wBAA0BF,EAAaC,aAAe,KAEpE,KAIFoB,GAAiBb,GAAcS,EAASnV,UACtCgV,EAAShV,UAAYkU,EAAaC,cAAiBW,IACtDZ,EAAaG,kBAAmB,EAChCpmB,OAAOwnB,QAAQU,OAEfhoB,YAAW,KACT+lB,EAAaE,yBAA2B,IACvC,MAELF,EAAaK,eAAe/hB,OAAO0hB,EAAaK,eAAere,QAAQ8e,EAAShV,SAAU,GAE1FmV,EAASnV,SAAU,KA8DtB,CAAC6U,EAAcE,EAAQL,EAAUW,EAAYP,IA8DhD,OA5DAxU,EAAAA,EAAAA,KAAU,KACR,MAAM8V,EAAkBrP,IACtB,GAAImN,EAAaG,iBAIf,YAHAlmB,YAAW,KACT+lB,EAAaG,kBAAmB,IAC/B,GAGL,MAAQzZ,MAAOnJ,GAAMsV,EAAM4O,MACrB/a,EAAQnJ,GAAK,EACnB,IACE,MAAM4kB,EAAYtB,EAASK,EAAapV,QAAQoV,EAAapV,QAAQ1O,OAAS,GAAGsJ,MAAQoa,EAAShV,QAE5FwV,EAAOtB,EAAaK,eAAeL,EAAaK,eAAere,QAAQmgB,GAAa,GAE1F,GAAInC,EAAaP,WAAY,QAEvBwB,EAASnV,UAAsB,IAAVpF,GAAeA,IAAU4a,IAAWT,IAAqB,IAAVna,GAAeA,IAAU4a,IAC7FT,IACFO,EAAuBtV,SAAU,EACjCoV,EAAapV,QAAQ3Q,OAGvB6kB,EAAaK,eAAe/hB,OAAO0hB,EAAaK,eAAere,QAAQmgB,GAAY,GAE/E1B,IACET,EAAaI,SACflgB,EAAAA,EAAAA,MACGkiB,2BAEL3B,GAAQT,EAAaI,QACrBa,EAASnV,SAAU,IAEZpF,IAAUyb,GAAalB,EAASnV,SAAW4U,IAAcG,IAClEE,EAAUjV,SAAU,EAChBkU,EAAaI,SACflgB,EAAAA,EAAAA,MACGkiB,2BAEL1B,EAAU7N,EAAM4O,MAAMA,QAExB,MAAOlhB,MAKL8hB,EAAaxB,GACbM,KAAemB,EAAAA,EAAAA,IAAqBnB,EAAYN,GAClDG,IAAiBR,EAOrB,OALKR,EAAaP,YAAc4C,GAC9BzP,IAGF7Y,OAAOjB,iBAAiB,WAAYopB,GAC7B,IAAMnoB,OAAO2lB,oBAAoB,WAAYwC,KACnD,CACDvB,EAAc/N,EAAciO,EAAQL,EAAUC,EAAQC,EAAWS,EAAYH,EAAcJ,IAGtF,CACL2B,WAAY,IAAM3P,GAAa,IArM/BzC,EAAAA,KACFpW,OAAOjB,iBAAiB,cAjBA+Z,IACxB,MAAMsE,EAAItE,EAAM2P,QAAQ,GAAGC,OAEvBtL,GArBiC,KAqBMA,GAAKpd,OAAO2oB,WArBlB,OAsBnC1C,EAAaI,QAAS,MAcxBrmB,OAAOjB,iBAAiB,WAAYynB,GACpCxmB,OAAOjB,iBAAiB,WAAYynB,IAGtCxmB,OAAOwnB,QAAQS,aAAa,CAAEtb,MAAOsZ,EAAaC,cAAgB,GAAIJ,I,8CCvDtE,MA4DA,EA5DkC,CAChC/N,EACAyB,EACAoP,EACAC,EACAC,KAEA,MAAOC,EAAcC,IAAmB9Q,EAAAA,EAAAA,KAAU,GAkDlD,OAhDA7F,EAAAA,EAAAA,KAAU,KACR2W,GAAiB,GAEjB,MAAMC,EAAUlR,EAAWhG,QACvByH,GAAUyP,IAAYH,IACxBG,EAAQpR,UAAY,EACpBoR,EAAQjP,WAET,CAACjC,EAAYyB,EAAQsP,KAEFviB,EAAAA,EAAAA,KAAaC,IACjC,MAAMyiB,EAAUlR,EAAWhG,QAE3B,IAAKkX,EACH,OAGF,GAAkB,KAAdziB,EAAEoT,SAAkBgP,EAEtB,YADAA,EAAkBG,GAIpB,GAAkB,KAAdviB,EAAEoT,SAAgC,KAAdpT,EAAEoT,QACxB,OAGF,MAAMC,EAAiBhS,SAASwO,cAC1ByD,EAAkBtN,MAAMuN,KAAK8O,EAAeI,EAAQC,iBAAiBL,GAAgBI,EAAQljB,UAEnG,IAAIojB,EAAYtP,GAAkBC,EAAgB7R,QAAQ4R,IAAoBkP,EAE9E,GAAkB,KAAdviB,EAAEoT,SAAkBuP,EAAW,EACjCA,SACK,GAAkB,KAAd3iB,EAAEoT,SAAkBuP,EAAWrP,EAAgBzW,OAAS,EACjE8lB,QACK,IAA+B,IAA3BrP,EAAgBzW,OAGzB,OAFA8lB,EAAW,EAKb,MAAMC,EAAOtP,EAAgBqP,GACzBC,IACFJ,EAAgBG,GAChBC,EAAKpP,WAEN,CAACjC,EAAY6Q,EAAmBC,EAAcE,M,iECpDnD,MAUA,EAVgB,KACd,MAAMM,GAAcC,EAAAA,EAAAA,KAMpB,OAJAC,EAAAA,EAAAA,IAAY,IACHC,EAAAA,GAAyBH,IAC/B,CAACA,IAEGG,EAAAA,K,kECLT,MAuBA,EAvBwB,SACtBC,EAAeC,GACZ,IAD2BC,EAC3B,wDAD2CC,EAC3C,wDACH,MAAMC,GAASC,EAAAA,EAAAA,IAAoBL,EAAYC,GACzCL,GAAcC,EAAAA,EAAAA,KAgBpB,OAdAjX,EAAAA,EAAAA,KAAU,KACR,GAAKuX,EAIL,OAAOG,EAAAA,EAAAA,IAAgBV,KACtB,CAACO,EAAYP,KAEhBhX,EAAAA,EAAAA,KAAU,KACHsX,GAAWE,IACdG,EAAAA,EAAAA,IAAWP,EAAYC,GAAY3nB,KAAKsnB,KAEzC,CAACI,EAAYJ,EAAaQ,EAAQH,EAAYC,IAE1CE,I,8CC1BT,MAOA,EAPoB,CAAkBzF,EAA4BC,KAChE,MAAME,GAAWC,EAAAA,EAAAA,GAAeH,GAC3BE,IAAYF,EAAa7W,MAAK,CAACyc,EAAGzmB,IAAMymB,IAAM1F,EAAS/gB,MAC1D4gB,EAAGG,GAAY,M,8CCUnB,QAVA,SAAoC2F,EAASC,GAC3C,MAAM5X,GAAMhB,EAAAA,EAAAA,OACN,QAAEQ,GAAYQ,EAKpB,OAJK4X,QAAgCvf,IAATsf,IAC1B3X,EAAIR,QAAUmY,GAGTnY,I,wDCTT,MA8DA,EA5D0B,WAMrB,IALHyH,EAKG,wDAJH4Q,EAIG,uCAHHC,EAGG,wDAFHvkB,EAEG,uDAFyB,OAC5BwkB,EACG,wDACH,MAAOpD,EAAUqD,IAAerS,EAAAA,EAAAA,KAAUsB,GACpCgR,GAAkBjZ,EAAAA,EAAAA,OAEjBkZ,EAAkBC,IAAuBxS,EAAAA,EAAAA,IAASsB,GAAU6Q,GAEnE,GAAI7Q,EACF+Q,GAAY,GACZG,GAAoB,GAEhBF,EAAgBzY,UAClB/R,OAAOqlB,aAAamF,EAAgBzY,SACpCyY,EAAgBzY,aAAUnH,QAK5B,GAFA8f,GAAoB,IAEfxD,IAAasD,EAAgBzY,QAAS,CACzC,MAAM4Y,EAAO,KACXJ,GAAY,GAERH,GACFA,IAGFI,EAAgBzY,aAAUnH,GAGxB0f,EACFK,IAEAH,EAAgBzY,QAAU/R,OAAOE,WAAWyqB,EAvC7B,KA6CrB,MAAMC,EAA0BH,KAAsBH,IAAsB9Q,GACtEqR,EAAYxiB,QAAQmiB,EAAgBzY,SACpC+Y,EAAetR,GAAUqR,EACzBtP,GAAuBtU,EAAAA,EAAAA,GAC3BnB,GAAa,qBACbA,EACA8kB,GAA2B,OAC3BE,GAAgB,QAChBD,GAAa,WAGf,MAAO,CACLC,aAAAA,EACAvP,qBAAAA,K,8CCtDW,SAASS,EACtBxC,EACAF,EACAD,IAEAhH,EAAAA,EAAAA,KAAU,KACR,MAAM0Y,EAAevkB,IACnB,MAAMmT,EAAOL,EAAQvH,QACf5K,EAASX,EAAEW,OACZwS,GAASxS,IAKXwS,EAAKqR,SAASxkB,EAAEW,UACdA,EAAO8jB,UAAUD,SAnBD,cAqBnBxkB,EAAEO,iBACFP,EAAEoL,kBACEyH,GACFA,OASN,OAJIG,GAAUH,GACZxR,SAAS9I,iBAAiB,YAAagsB,GAGlC,KACLljB,SAAS8d,oBAAoB,YAAaoF,MAE3C,CAACvR,EAAQF,EAASD,M,iEClCvB,MAAM6R,EAAwB,IAAIrY,IAAI,CAAC,SAAU,aAAc,eAEzDsY,EAAgD,GAChDC,EAAoE,GACpEC,EAA+B,IAAIhtB,IAElC,SAASU,EAAiBkqB,EAAsBqC,EAAkBC,GAAqC,IAAnBC,EAAmB,wDAC5G,MAAMC,EAAYC,EAAiBJ,EAAUrC,GACzC0C,EAAsBF,EAAWxC,EAASuC,GAC5CI,EAAqBH,EAAWxC,EAASsC,GAEzCtC,EAAQlqB,iBAAiB0sB,EAAWF,EAASC,GAI1C,SAAS7F,EAAoBsD,EAAsBqC,EAAkBC,GAAqC,IAAnBC,EAAmB,wDAC/G,MAAMC,EAAYC,EAAiBJ,EAAUrC,GACzC0C,EAAsBF,EAAWxC,EAASuC,GAC5CK,EAAwBJ,EAAWxC,GAEnCA,EAAQtD,oBAAoB8F,EAAWF,EAASC,GAIpD,SAASE,EAAiBJ,EAAkBrC,GAC1C,MAAMwC,EAAYH,EACfhmB,QAAQ,MAAO,IACfA,QAAQ,WAAY,IAAI8K,cAE3B,MAAkB,WAAdqb,GAA8C,WAApBxC,EAAQ6C,QAG7B,QAGS,gBAAdL,EACK,WAIS,UAAdA,EACK,UAGS,SAAdA,EACK,WAGFA,EAGT,SAASE,EAAsBI,EAAuB9C,EAAsBuC,GAC1E,OACGA,IACGN,EAAsB5Y,IAAIyZ,IACP,UAApB9C,EAAQ6C,SACY,WAApB7C,EAAQ6C,QAIf,SAASF,EAAqBH,EAAmBxC,EAAsBsC,GAChEJ,EAAsBM,KACzBN,EAAsBM,GAAa,EACnC5jB,SAAS9I,iBAAiB0sB,EAAWV,IA6EzC,SAAmCU,GAKjC,OAJKL,EAA8BK,KACjCL,EAA8BK,GAAa,IAAIptB,KAG1C+sB,EAA8BK,GA/ErCO,CAA0BP,GAAWpqB,IAAI4nB,EAASsC,GAkFpD,SAAoCtC,GAClC,MAAMgD,EAAWZ,EAA6BjsB,IAAI6pB,GAClD,GAAIgD,EACF,OAAOA,EAGT,MAAMC,EAAS,IAAIrZ,IAGnB,OAFAwY,EAA6BhqB,IAAI4nB,EAASiD,GAEnCA,EA1FPC,CAA2BlD,GAAS/V,IAAIuY,GACxCN,EAAsBM,KAGxB,SAASI,EAAwBJ,EAAmBxC,GAClDkC,EAAsBM,KACjBN,EAAsBM,IAGzB5jB,SAAS8d,oBAAoB8F,EAAWV,GAG1CK,EAA8BK,GAAWjqB,OAAOynB,GAChDoC,EAA6BjsB,IAAI6pB,GAAUznB,OAAOiqB,GAG7C,SAASW,EAA4BnD,GAC1C,MAAMoD,EAAahB,EAA6BjsB,IAAI6pB,GAC/CoD,IAILA,EAAW3f,SAAS+e,GAAcI,EAAwBJ,EAAWxC,KACrEoC,EAA6B7pB,OAAOynB,IAGtC,SAAS8B,EAAYuB,GACnB,MAAMC,EAASnB,EAA8BkB,EAAUrtB,MAEvD,GAAIstB,EAAQ,CACV,IAAIC,GAAwB,EACxBza,EAAuBua,EAAUnlB,OAErC,MAAMyK,EAAkB,KACtB4a,GAAwB,GAGpBzlB,EAAiB,KACrBulB,EAAUvlB,kBAIN+R,EAAQ,IAAI2T,MAAMH,EAAW,CACjCltB,IAAG,CAAC+H,EAAQulB,IACA,kBAANA,EACK3a,EAEC,oBAAN2a,GAAiC,6BAANA,EACtB9a,EAEC,mBAAN8a,EAEK3lB,EAEF4lB,QAAQvtB,IAAI+H,EAAQulB,KAK/B,KAAO3a,GAAWA,IAAYlK,SAAS+kB,MAAM,CAC3C,MAAMrB,EAAUgB,EAAOntB,IAAI2S,GAC3B,GAAIwZ,IACFA,EAAQzS,GACJ0T,GACF,OAIJza,EAAUA,EAAQ8a,aAyBpBnuB,EAAAA,IACFmJ,SAAS9I,iBAAiB,YAAY,KACpC,MAAM+tB,EAAyB5rB,OAAO6rB,KAAK5B,GAAuB9nB,OAC5D2pB,EAA0B9rB,OAAO+rB,OAAO9B,GAC3C/c,QAAO,CAAC8e,EAAKC,IAAYD,EAAMC,GAAS,GACrCC,EAA4BlsB,OAAO6rB,KAAK3B,GAA+B/nB,OACvEgqB,EAA0BnsB,OAAO+rB,OAAO7B,GAC3Chd,QAAO,CAAC8e,EAAKI,IAAuBJ,EAAMI,EAAmBpe,MAAM,GAChEqe,EAA0BlC,EAA6Bnc,KACvDse,EAA2BhhB,MAAMuN,KAAKsR,EAA6B4B,UACtE7e,QAAO,CAAC8e,EAAKb,IAAea,EAAMb,EAAWnd,MAAM,GAGtDvQ,QAAQ4B,KAAK,yBAA0B,CACrCysB,wBAAAA,EACAK,wBAAAA,EACAG,yBAAAA,EACAJ,0BAAAA,EACAG,wBAAAA,EACAT,uBAAAA,Q,4ECjKN,MAAMW,EAAsB,IAAI5a,IAAI,CAAC,MAAO,MAAO,gBAAiB,kBAC9D6a,EAAkB,IAAI7a,IAAI,CAAC,MAAO,SAClC8a,EAA6C,CACjDC,SAAU,WACVrT,aAAc,gBAIVsT,EAAiD,GA6BvD,SAASC,EACPC,EACAC,EACAC,EACAC,EACAvhB,GAYA,IAXA,oBACEwhB,GAAsB,EADxB,WAEEC,GAAa,EAFf,SAGEC,EAHF,cAIEC,GAOF,uDADI,GAEJ,MAAMC,EAAqBP,IAAYQ,EAAAA,EAAAA,IAAmBR,GACpDS,EAAiBR,IAAQO,EAAAA,EAAAA,IAAmBP,GAelD,IAZGE,GACEI,GAAsBE,KACrBC,EAAAA,EAAAA,GAAkBV,EAAWC,KAEjCA,EAAOU,EAAgBX,EAAqCC,KAIzDE,GAAuBM,GAAmBR,EAAiCW,kBAAkBC,WAChGC,EAA6Bb,EAAiCC,EAASvhB,EAAOohB,GAG5EC,IAAaC,EACf,OAAOA,EAGT,IAAKD,GAAYC,EAAM,CACjBQ,IACFR,EAAOc,EAAcd,EAAiCC,EAASvhB,EAAOohB,IAGxE,MAAMiB,EAAOC,EAAWhB,IACxBiB,EAAAA,EAAAA,IAAUjB,EAAMe,GAEZZ,GAAcL,EAASoB,WAAWxiB,GACpCohB,EAASqB,aAAaJ,EAAMjB,EAASoB,WAAWxiB,KAE/C0hB,GAAYN,GAAUsB,YAAYL,QAEhC,GAAIhB,IAAaC,EACtBF,EAASuB,aAAYC,EAAAA,EAAAA,IAAUvB,KAC/BwB,EAAAA,EAAAA,IAAYxB,QACP,GAAIA,GAAYC,EACrB,IAAIS,EAAAA,EAAAA,GAAkBV,EAAUC,GAAO,CACjCQ,IACFR,EAAOc,EAAcd,EAAiCC,EAASvhB,EAAOohB,IAGxE,MAAMiB,EAAOC,EAAWhB,IACxBiB,EAAAA,EAAAA,IAAUjB,EAAMe,GAChBjB,EAAS0B,aAAaT,GAAMO,EAAAA,EAAAA,IAAUvB,KACtCwB,EAAAA,EAAAA,IAAYxB,OACP,CACL,MAAM0B,EAAgBnB,GAAsBE,EACtC3Y,GAAgByZ,EAAAA,EAAAA,IAAUvB,GAWhC,GATK0B,KACHR,EAAAA,EAAAA,IAAUjB,EAAMnY,IAChBoZ,EAAAA,EAAAA,IAAUlB,OAAUpjB,GAEhB,UAAWojB,GAAY,UAAWC,IACpCA,EAAK7R,MAAM7J,IAAMyb,EAAS5R,MAAM7J,OAIhCod,EAAAA,EAAAA,IAAc1B,GAAO,CACvB,GAAIK,EAAe,CACjB,MAAMU,EAAOlZ,EACP8Z,EAAc7B,EAASoB,WAA6B,OAAlBb,EAAyB3hB,EAAQA,EAAQ,GAE7EijB,EACF7B,EAASqB,aAAaJ,EAAMY,IAE3BvB,GAAYN,GAAUsB,YAAYL,GAIlCU,GACHG,EAAkB7B,EAAiCC,EAAMnY,GAG3DmY,EAAKloB,SAAW+pB,EACb9B,EACDC,EACAyB,EAAgB3B,EAAWjY,IAMnC,OAAOmY,EAGT,SAASc,EACPgB,EAAmC7B,EAA8CvhB,EAAeohB,GAEhG,KAAKS,EAAAA,EAAAA,IAAmBuB,GACtB,OAAOA,EAGT,MAAM,kBAAEnB,GAAsBmB,EAE9B,IAAKnB,EAAkBC,UAAW,CAEhCC,EADAiB,GAAWC,EAAAA,EAAAA,IAAepB,GACaV,EAASvhB,EAAOohB,GAEvD,MAAMkC,EAAcF,EAAShqB,SAAS,IAClCyoB,EAAAA,EAAAA,IAAmByB,KACrBF,EAAShqB,SAAW,CAACgpB,EAAckB,EAAaF,EAAU,EAAGhC,KAG/Da,EAAkBC,WAAY,EAGhC,OAAOkB,EAGT,SAASpB,EAAgBX,EAAmCC,GAG1D,OAFAD,EAASY,kBAAkBxS,MAAQ6R,EAAKW,kBAAkBxS,OAEnD8T,EAAAA,EAAAA,IAAgBlC,EAASY,mBAGlC,SAASE,EACPiB,EAAmC7B,EAA8CvhB,EAAeohB,GAEhG,MAAM,kBAAEa,GAAsBmB,EAE9BnB,EAAkBpwB,SAAW,KAC3B0vB,EAAQnoB,SAAS4G,GAASmhB,EACxBC,EACAG,EAAQnoB,SAAS4G,GACjBiiB,EAAkBmB,SAClB7B,EACAvhB,EACA,CAAEwhB,qBAAqB,KAK7B,SAASc,EAAWc,GAClB,IAAII,EAAAA,EAAAA,IAAeJ,GACjB,OAAOloB,SAASuoB,eAAe,IAGjC,IAAIC,EAAAA,EAAAA,IAAcN,GAChB,OAAOloB,SAASuoB,eAAeL,EAASprB,OAG1C,IAAI6pB,EAAAA,EAAAA,IAAmBuB,GACrB,OAAOd,EAAWc,EAAShqB,SAAS,IAGtC,MAAM,IAAEuqB,EAAF,MAAOlU,EAAP,SAAcrW,EAAW,IAAOgqB,EAChC9G,EAAUphB,SAASiH,cAAcwhB,GAgBvC,MAdyB,iBAAdlU,EAAM7J,MACf6J,EAAM7J,IAAIR,QAAUkX,GAGtB/nB,OAAOqvB,QAAQnU,GAAO1P,SAAQ,IAAkB,IAAhB8jB,EAAK7rB,GAAW,OAC3BiG,IAAfwR,EAAMoU,IACRC,EAAaxH,EAASuH,EAAK7rB,MAI/BorB,EAAShqB,SAAWA,EAASoF,KAAI,CAACulB,EAAQltB,IACxCsqB,EAAkB7E,OAASre,EAAW8lB,EAAQX,EAAUvsB,KAGnDylB,EAGT,SAAS6G,EACP9B,EAA8BC,EAA0B0C,GAExD,GAAI1C,EAAK7R,MAAMwU,cACb,OA+BJ,SAAgC5C,EAA8BC,EAA0B0C,GACtF,MAAME,EAAU,IAAIhe,IAClBob,EAAKloB,SAASoF,KAAK2lB,IACjB,MAAMN,EAAM,UAAWM,GAAaA,EAAU1U,MAAMoU,IAQpD,OALI9xB,EAAAA,KAASixB,EAAAA,EAAAA,IAAcmB,IAAvB,MAAsCN,GAExC7xB,QAAQ4B,KAAK,oCAGRiwB,MAIX,IAAIO,EAAwB,EAC5B,MAAMC,EAAiBhD,EAASjoB,SAC7BqI,QAAO,CAAC8e,EAAK+D,EAAeztB,KAC3B,IAAIgtB,EAAM,UAAWS,EAAgBA,EAAc7U,MAAMoU,SAAM5lB,EAE/D,MAAMsmB,EAAeV,MAAAA,EAGrB,GAAIU,IAAiBL,EAAQve,IAAIke,GAG/B,OAFA1C,EAAkB6C,EAAWM,OAAermB,EAAWqjB,GAAO,GAEvDf,EACF,IAAKgE,EAAc,CACxB,MAAMJ,EAAY7C,EAAKloB,SAASvC,GAC1B2tB,EAAeL,GAAa,UAAWA,EAAaA,EAAU1U,MAAMoU,SAAM5lB,EAEhF,IAAIkmB,GAAcK,EAKhB,OAFArD,EAAkB6C,EAAWM,OAAermB,EAAWqjB,GAAO,GAEvDf,EAJPsD,EAAO,cAAqBhtB,IAchC,OALA0pB,EAAIsD,GAAO,CACTT,SAAUkB,EACVtkB,MAAOokB,IACPK,MAAO,UAAWH,EAAgBA,EAAc7U,MAAMiV,mBAAgBzmB,GAEjEsiB,IACN,IAEL,IAEIoE,EACAC,EAHAC,EAAgC,GAKhCC,EAAwB,EA6C5B,OA3CAxD,EAAKloB,SAAS2G,SAAQ,CAACokB,EAAWttB,KAChC,MAAMgtB,EAAM,UAAWM,EAAYA,EAAU1U,MAAMoU,IAAO,cAAqBhtB,IACzEkuB,EAAmBV,EAAeR,GAExC,IAAKkB,EAQH,OANKJ,IACHA,EAAgB,GAChBC,EAAgB/tB,QAGlB8tB,EAAcjtB,KAAKysB,GAIjBQ,IACFE,EAAcA,EAAY/b,OAAOkc,EAAmBL,EAAeC,EAAgBZ,EAAW1C,IAC9FsD,OAAgB3mB,EAChB0mB,OAAgB1mB,GAIlB,MAAMwmB,EAAQ,UAAWN,EAAYA,EAAU1U,MAAMiV,mBAAgBzmB,EAC/DgnB,EAAiBF,EAAiB/kB,QAAU8kB,GAAyBC,EAAiBN,QAAUA,EAChGS,EAAeD,GAAkBH,EAAwBC,EAAiB/kB,MAG3EilB,IAAkBC,GACrBJ,IAGFD,EAAYntB,KACVypB,EAAkB6C,EAAWe,EAAiB3B,SAAUe,EAAW7C,EAAMzqB,EAAG,CAC1E4qB,YAAY,EACZE,cAAesD,EAAkBC,EAAe,OAAS,UAAQjnB,QAKnE0mB,IACFE,EAAcA,EAAY/b,OAAOkc,EAAmBL,EAAeC,EAAgBZ,EAAW1C,KAGzFuD,EAlIEM,CAAuB9D,EAAUC,EAAM0C,GAGhD,MAAMoB,EAAwB/D,EAASjoB,SAAS1C,OAC1C2uB,EAAoB/D,EAAKloB,SAAS1C,OAClCoX,EAAY5X,KAAKsP,IAAI4f,EAAuBC,GAC5CR,EAAc,GACdnD,EAAW2D,EAAoBD,EAAwB,EAAIlqB,SAASoqB,8BAA2BrnB,EAErG,IAAK,IAAIpH,EAAI,EAAGA,EAAIiX,EAAWjX,IAAK,CAClC,MAAMstB,EAAYhD,EAChB6C,EACA3C,EAASjoB,SAASvC,GAClByqB,EAAKloB,SAASvC,GACdyqB,EACAzqB,EACAA,GAAKuuB,EAAwB,CAAE1D,SAAAA,QAAazjB,GAG1CkmB,GACFU,EAAYntB,KAAKysB,GAQrB,OAJIzC,GACFsC,EAAUtB,YAAYhB,GAGjBmD,EAyGT,SAASG,EACPL,EAAiCC,EAAuBxD,EAAuBG,GAE/E,GAA6B,IAAzBoD,EAAcjuB,OAChB,MAAO,CAACyqB,EAAkBC,OAAUnjB,EAAW0mB,EAAc,GAAIpD,EAASqD,EAAe,CAAEnD,YAAY,KAClG,GAAIkD,EAAcjuB,OAAS,EAAG,CACnC,MAAMgrB,EAAWxmB,SAASoqB,yBACpBT,EAAcF,EAAcnmB,KAAK+mB,GACrCpE,EAAkBC,OAAUnjB,EAAWsnB,EAAgBhE,EAASqD,EAAgB,CAAElD,SAAAA,MASpF,OANIN,EAASoB,WAAWoC,GACtBxD,EAASqB,aAAaf,EAAUN,EAASoB,WAAWoC,IAEpDxD,EAASsB,YAAYhB,GAGhBmD,EAGT,MAAM,IAAI5xB,MAAM,oBAGlB,SAASiwB,EAAiB7B,EAA8BC,EAA0BhF,GAChF,MAAMkJ,EAAiBjxB,OAAOqvB,QAAQvC,EAAS5R,OACzCgW,EAAalxB,OAAOqvB,QAAQtC,EAAK7R,OAEvC+V,EAAezlB,SAAQ,IAAyB,IAAvB8jB,EAAK6B,GAAkB,EAC9C,MAAMC,EAAWrE,EAAK7R,MAAMoU,QAGT5lB,IAAjBynB,SAEeznB,IAAb0nB,GACID,IAAiBC,GAAY9B,EAAIzf,WAAW,QAuCxD,SAAyBkY,EAAsBuH,EAAa7rB,GAC9C,cAAR6rB,EACFvH,EAAQnjB,UAAY,GACH,UAAR0qB,EACRvH,EAA6BtkB,MAAQ,GACrB,UAAR6rB,EACTvH,EAAQ5Q,MAAMka,QAAU,GACP,4BAAR/B,EACTvH,EAAQha,UAAY,GACXuhB,EAAIzf,WAAW,OACxB4U,EAAAA,EAAAA,IAAoBsD,EAASuH,EAAK7rB,EAAO6rB,EAAIvf,SAAS,YAC7Cuf,EAAIzf,WAAW,UAAYyf,EAAIzf,WAAW,UAAY2c,EAAgBpb,IAAIke,GACnFvH,EAAQuJ,gBAAgBhC,GACd/C,EAAoBnb,IAAIke,WAC1BvH,EAAgB0E,EAAkB6C,IAAQA,GAlDhDgC,CAAgBvJ,EAASuH,EAAK6B,MAIlCD,EAAW1lB,SAAQ,IAAqB,IAAnB8jB,EAAK8B,GAAc,EACtC,MAAMD,EAAerE,EAAS5R,MAAMoU,QAEnB5lB,IAAb0nB,GAA0BA,IAAaD,GACzC5B,EAAaxH,EAASuH,EAAK8B,MAKjC,SAAS7B,EAAaxH,EAAsBuH,EAAa7rB,GAE3C,cAAR6rB,EACFvH,EAAQnjB,UAAYnB,EAEH,UAAR6rB,EACJvH,EAA6BtkB,QAAUA,IACzCskB,EAA6BtkB,MAAQA,GAEvB,UAAR6rB,EACTvH,EAAQ5Q,MAAMka,QAAU5tB,EACP,4BAAR6rB,EAETvH,EAAQha,UAAYtK,EAAM8tB,OACjBjC,EAAIzf,WAAW,OACxBhS,EAAAA,EAAAA,IAAiBkqB,EAASuH,EAAK7rB,EAAO6rB,EAAIvf,SAAS,YAC1Cuf,EAAIzf,WAAW,UAAYyf,EAAIzf,WAAW,UAAY2c,EAAgBpb,IAAIke,GACnFvH,EAAQwH,aAAaD,EAAK7rB,GAChB8oB,EAAoBnb,IAAIke,KACjCvH,EAAgB0E,EAAkB6C,IAAQA,GAAO7rB,GAiCtD,MACA,EADiB,CAAE+tB,OAjcnB,SAAgB3C,EAA2BhC,GACzC,IAAKA,EACH,OAGF,IAAI4E,EAAS5E,EAAS6E,aAAa,sBAC9BD,IACHA,GAAS5xB,EAAAA,EAAAA,GAAc8sB,GACvBA,EAAe8E,GAAU,CAAE5sB,SAAU,IACrCgoB,EAAS0C,aAAa,qBAAsBkC,IAG9C,MAAME,EAAQhF,EAAe8E,GAC7BE,EAAM9sB,SAAW,CAAC+nB,EAAkBC,EAAU8E,EAAM9sB,SAAS,GAAIgqB,EAAU8C,EAAO,O,uPChC7E,IAAKC,G,SAAAA,GAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,IAAAA,GAAAA,MAAAA,EAAAA,EAAAA,UAAAA,GAAAA,Y,CAAAA,IAAAA,EAAAA,KAkFZ,MAAMC,EAAWC,OAAO,YAIlBC,EAA2B,IAAIpgB,IAAI,CAAC,mBAAoB,kBAAmB,SAAU,WAAY,aAEvG,IAAIqgB,EAEG,SAAS/C,EAAeJ,GAC7B,OAAOA,EAAS9wB,OAAS6zB,EAAwBK,MAG5C,SAAS9C,EAAcN,GAC5B,OAAOA,EAAS9wB,OAAS6zB,EAAwBM,KAG5C,SAASC,EAAatD,GAC3B,OAAOA,EAAS9wB,OAAS6zB,EAAwBQ,IAG5C,SAAS9E,EAAmBuB,GACjC,OAAOA,EAAS9wB,OAAS6zB,EAAwBS,UAG5C,SAAS5D,EAAcI,GAC5B,OAAOsD,EAAatD,IAAavB,EAAmBuB,GAGtD,SAASjhB,EACPgB,EACAsM,GAE6C,2BAD1CrW,EAC0C,iCAD1CA,EAC0C,kBAO7C,OANKqW,IACHA,EAAQ,IAGVrW,GAAWytB,EAAAA,EAAAA,IAAQztB,GAEf+J,IAAWijB,EACNhtB,EACoB,mBAAX+J,EACT2jB,EAAwB3jB,EAAQsM,EAAOrW,GAEvC2tB,EAAgB5jB,EAAQsM,EAAOrW,GAI1C,SAAS0tB,EAAwBF,EAAenX,EAAcrW,GAC5D,IAAI4tB,EACoB,IAApB5tB,EAAS1C,OACXswB,OAAiB/oB,EACY,IAApB7E,EAAS1C,QACjBswB,GAAkB5tB,EAEnB4tB,EAAiB5tB,EAGnB,MAAM6oB,EAAuC,CAC3CmB,SAAU,GACVwD,UAAAA,EACA9yB,KAAM8yB,EAAU9yB,KAChB2b,MAAO,IACFA,KACCuX,GAAkB,CAAE5tB,SAAU4tB,IAEpC9E,WAAW,EACX+E,MAAO,CACLlM,MAAO,CACLmM,OAAQ,EACRC,SAAU,IAEZC,QAAS,CACPF,OAAQ,EACRC,SAAU,IAEZE,MAAO,CACLH,OAAQ,EACRC,SAAU,MAOhB,OAFAlF,EAAkBmB,SAAWkE,EAAsBrF,GAE5CA,EAAkBmB,SAG3B,SAASkE,EACPrF,GAEyB,IADzB7oB,EACyB,uDADU,GAEnC,MAAM,MAAEqW,GAAUwS,EAElB,MAAO,CACLA,kBAAAA,EACA3vB,KAAM6zB,EAAwBS,UAC9BnX,MAAAA,EACArW,SAAAA,GAIJ,SAAS2tB,EAAgBpD,EAAalU,EAAcrW,GAClD,MAAO,CACL9G,KAAM6zB,EAAwBQ,IAC9BhD,IAAAA,EACAlU,MAAAA,EACArW,SAAUmuB,EAAcnuB,GAAUoF,IAAIgpB,IAK1C,SAASD,EAAcnuB,GACrB,IAAIvC,EAAIuC,EAAS1C,OAAS,EAE1B,KAAOG,GAAK,GACL4wB,EAAmBruB,EAASvC,IADpBA,KAMf,OAAOA,EAAI,EAAIuC,EAAS1C,OAAS0C,EAASL,MAAM,EAAGlC,EAAI,GAAKuC,EAG9D,SAASquB,EAAmBC,GAE1B,OAAiB,IAAVA,GAAAA,MAAmBA,EAG5B,SAASF,EAAkBE,GACzB,OAAID,EAAmBC,GAiBhB,CAAEp1B,KAAM6zB,EAAwBK,OAf5BxD,EAAc0E,GAChBA,GAMe1vB,EAJE0vB,EAKnB,CACLp1B,KAAM6zB,EAAwBM,KAC9BzuB,MAAOH,OAAOG,KAHlB,IAA0BA,EAY1B,MAAM2vB,EAA+B,GAO9B,SAASpE,EAAgBtB,GAC9BsE,EAAoBtE,EACpBA,EAAkBgF,MAAMlM,MAAMmM,OAAS,EACvCjF,EAAkBgF,MAAMG,QAAQF,OAAS,EACzCjF,EAAkBgF,MAAMI,MAAMH,OAAS,EAEvC,MAAM,UAAEN,EAAF,MAAanX,GAAUwS,EAC7B,IAAI2F,EAEJ,IAEE,IAAIC,EACJ,GAAI91B,EAAAA,GAAO,CACT,MAAM+1B,EAAgB7F,EAAkBnuB,KACnC6zB,EAAiBG,KACpBH,EAAiBG,GAAiB,CAChCA,cAAAA,EACAC,YAAa,EACbC,YAAa,KAIb7W,EAAAA,KACGmV,EAAyB3gB,IAAImiB,IAEhC91B,QAAQC,IAAK,kBAAiB61B,MAIlCD,EAAgBI,YAAYjzB,MAK9B,GAFA4yB,EAAmBhB,EAAUnX,GAEzB1d,EAAAA,GAAO,CACT,MAAMymB,EAAWyP,YAAYjzB,MAAQ6yB,EAC/BC,EAAgB7F,EAAkBnuB,KACpC0kB,EAjMqB,GAmMvBxmB,QAAQ4B,KAAM,kCAAiCk0B,MAAkB5xB,KAAKoP,MAAMkT,SAE9EmP,EAAiBG,GAAeE,YAAYtwB,KAAK8gB,GACjDmP,EAAiBG,GAAeC,eAElC,MAAOh0B,IACPm0B,EAAAA,EAAAA,GAAYn0B,GAEZ6zB,EAAmB3F,EAAkBkG,cAGvC,GAAIlG,EAAkBC,WAAa0F,IAAqB3F,EAAkBkG,cACxE,OAAOlG,EAAkBmB,SAG3BnB,EAAkBkG,cAAgBP,EAElC,MAAMQ,EAAWZ,EAAkBI,GAGnC,OAFA3F,EAAkBmB,SAAWkE,EAAsBrF,EAAmB,CAACmG,IAEhEnG,EAAkBmB,SAGpB,SAASrB,EAAkBsG,EAAsB/G,GACtD,cAAW+G,UAAgB/G,GAEhB+G,EAAK/1B,OAASgvB,EAAKhvB,OAEnBoxB,EAAc2E,IAAS3E,EAAcpC,GACvC+G,EAAKrwB,QAAUspB,EAAKtpB,MAClB0uB,EAAa2B,IAAS3B,EAAapF,GACpC+G,EAAK1E,MAAQrC,EAAKqC,KAAS0E,EAAK5Y,MAAMoU,MAAQvC,EAAK7R,MAAMoU,OACxDhC,EAAmBwG,KAASxG,EAAmBP,IAEtD+G,EAAKpG,kBAAkB2E,YAActF,EAAKW,kBAAkB2E,WAE5DyB,EAAK5Y,MAAMoU,MAAQvC,EAAK7R,MAAMoU,MAO7B,SAAShB,EAAYO,GAC1B,GAAIvB,EAAmBuB,IA+BCnB,EA9BLmB,EAASnB,mBA+BLC,YAKvBD,EAAkBgF,MAAMI,MAAMF,SAASpnB,SAASuoB,IAC9CA,EAAcljB,aAAUnH,KAG1BgkB,EAAkBgF,MAAMG,QAAQD,SAASpnB,SAAQ,IAAiB,IAAhB,QAAEwoB,GAAc,EAChE,GAAuB,mBAAZA,EACT,IACEA,IACA,MAAOx0B,IACPm0B,EAAAA,EAAAA,GAAYn0B,OAKlBkuB,EAAkBC,WAAY,EAMhC,SAAgBD,GACdA,EAAkBgF,MAAMG,QAAQD,SAASpnB,SAASyoB,IAChDA,EAAKD,aAAUtqB,EACfuqB,EAAKC,YAASxqB,EACduqB,EAAK9Q,kBAAezZ,KAGtBgkB,EAAkBgF,MAAMlM,MAAMoM,SAASpnB,SAASyoB,IAC9CA,EAAKxwB,WAAQiG,EACbuqB,EAAKE,eAAYzqB,EACjBuqB,EAAKG,YAAS1qB,KAGhBgkB,EAAkBgF,MAAMI,MAAMF,SAASpnB,SAASyoB,IAC9CA,EAAK9Q,kBAAezZ,KAGtBgkB,EAAkBgF,WAAQhpB,EAC1BgkB,EAAkBmB,cAAWnlB,EAC7BgkB,EAAkBkG,mBAAgBlqB,EAClCgkB,EAAkB2E,eAAY3oB,EAC9BgkB,EAAkBxS,WAAQxR,EAC1BgkB,EAAkBvF,iBAAcze,EAChCgkB,EAAkBpwB,cAAWoM,EA3B7B2qB,CAAO3G,SApCL,GAdIyE,EAAatD,KACXA,EAAS5oB,SACXilB,EAAAA,EAAAA,IAA4B2D,EAAS5oB,QAGnC4oB,EAAS3T,MAAM7J,MACjBwd,EAAS3T,MAAM7J,IAAIR,aAAUnH,IAI7BmlB,EAAS5oB,SACX4oB,EAAS5oB,YAASyD,IAGf+kB,EAAcI,GACjB,OAaN,IAA0BnB,EATxBmB,EAAShqB,SAAS2G,QAAQ8iB,GAGrB,SAASQ,EAAepB,GAG7B,OAFAsB,EAAgBtB,GAChBA,EAAkBC,WAAY,EACvBD,EAAkBmB,SAuD3B,SAASyF,EAAyB5G,GAC3BA,EAAkBC,YAIvBD,EAAkBgF,MAAMlM,MAAMoM,SAASpnB,SAASyoB,IAC9CA,EAAKxwB,MAAQwwB,EAAKE,aAGpBzG,EAAkB6G,iBAAkBC,EAAAA,EAAAA,KAAuB,IAAMF,EAAyB5G,KAC1FA,EAAkBvF,aAAcsM,EAAAA,EAAAA,KAAgB,IAAMC,EAAqBhH,MAG7E,SAASgH,EAAqBhH,GAC5B,IAAKA,EAAkBC,YAAcD,EAAkBpwB,SACrD,OAGF,MAAMq3B,EAAiBjH,EAAkBmB,SAEzCG,EAAgBtB,GAEZA,EAAkBmB,WAAa8F,GACjCjH,EAAkBpwB,WAIf,SAAS+wB,EAAUQ,GACxB,OAAIvB,EAAmBuB,GACdR,EAAUQ,EAAShqB,SAAS,IAE5BgqB,EAAS5oB,OAIb,SAAS+nB,EAAUa,EAA0B5oB,GAC9CqnB,EAAmBuB,GACrBb,EAAUa,EAAShqB,SAAS,GAAIoB,GAEhC4oB,EAAS5oB,OAASA,EAMf,SAAS+Q,EAAYuM,GAC1B,MAAM,OAAEoP,EAAF,SAAUC,GAAaZ,EAAkBU,MAAMlM,MAMzC,IAAEkH,EAwCd,YA5CyBhkB,IAArBkpB,EAASD,KACXC,EAASD,GAAU,CACjBlvB,MAAO8f,EACP4Q,UAAW5Q,EACX6Q,QAAU1G,EAkCPsE,EAlC8BZ,IAC3BwB,EAASD,GAAQwB,YAAc/C,IACjCwB,EAASD,GAAQwB,UAAgC,mBAAb/C,EAC/BA,EAA+BwB,EAASD,GAAQlvB,OACjD2tB,EAEC1D,EAAkB6G,iBAAoB7G,EAAkBvF,cAC3DuF,EAAkB6G,iBAAkBC,EAAAA,EAAAA,KAClC,IAAMF,EAAyB5G,KAEjCA,EAAkBvF,aAAcsM,EAAAA,EAAAA,KAC9B,IAAMC,EAAqBhH,MAI/BA,EAAkB6G,kBAClB7G,EAAkBvF,cAEdvL,EAAAA,IAC6B,oBAA3B8Q,EAAkBnuB,MAEpB9B,QAAQC,IACN,mBACAgwB,EAAkBnuB,KAElBmuB,EAAkB2E,WAAc3E,EAAkB2E,UAA2BuC,2BACxE,KAAKlH,EAAkB2E,UAA2BuC,6BACnD,GACH,4BAA2BjC,kBAC5BC,EAASD,GAAQwB,gBAS/BnC,EAAkBU,MAAMlM,MAAMmM,SAEvB,CACLC,EAASD,GAAQlvB,MACjBmvB,EAASD,GAAQyB,QAIrB,SAASS,EACPC,EACAC,EACAb,EACA/Q,EACAC,GAEA,MAAM,OAAEuP,EAAF,SAAUC,GAAaZ,EAAkBU,MAAMG,QAC/CnF,EAAoBsE,EAE1B,SAASgD,IACP,IAAKtH,EAAkBC,UACrB,OAGF,MAAM,QAAEqG,GAAYpB,EAASD,GAC7B,GAAuB,mBAAZqB,EACT,IAEE,IAAIV,EAOJ,GANI91B,EAAAA,KACF81B,EAAgBI,YAAYjzB,OAG9BuzB,IAEIx2B,EAAAA,GAAO,CACT,MAAMymB,EAAWyP,YAAYjzB,MAAQ6yB,EAC/BC,EAAgB7F,EAAkBnuB,KACpC0kB,EAhciB,GAkcnBxmB,QAAQ4B,KACL,0CAAyCszB,MAAWY,MAAkB5xB,KAAKoP,MAAMkT,UAIxF,MAAOzkB,IACPm0B,EAAAA,EAAAA,GAAYn0B,IAKlB,SAASiqB,IACP,IAAKiE,EAAkBC,UACrB,OAIF,IAAI2F,EAOJ,GANI91B,EAAAA,KACF81B,EAAgBI,YAAYjzB,OAG9BmyB,EAASD,GAAQqB,QAAUE,IAEvB12B,EAAAA,GAAO,CACT,MAAMymB,EAAWyP,YAAYjzB,MAAQ6yB,EAC/BC,EAAgB7F,EAAkBnuB,KACpC0kB,EA7dqB,GA+dvBxmB,QAAQ4B,KAAM,kCAAiCszB,MAAWY,MAAkB5xB,KAAKoP,MAAMkT,UAK7F,QAAyBva,IAArBkpB,EAASD,IAAyBxP,GAAgByP,EAASD,GAAQxP,cACrE,GAAIA,EAAa7W,MAAK,CAAC2oB,EAAY3yB,IAAM2yB,IAAerC,EAASD,GAAQxP,aAAc7gB,KAAK,CAC1F,GAAI8gB,EAAU,CACZ,MAAM8R,EAAW/R,EAAajW,QAAO,CAACioB,EAAK/D,EAAU9uB,KACnD,MAAM8yB,EAAYxC,EAASD,GAAQxP,aAAc7gB,GAKjD,OAJI8uB,IAAagE,GACfD,EAAIhyB,KAAM,GAAEb,MAAM8yB,QAAgBhE,KAG7B+D,IACN,IAGH13B,QAAQC,IAAK,mBAAkB0lB,6BAAqC8R,EAASxxB,KAAK,OAGpFqxB,EAAmBC,GACnBF,EAAYrL,SAGVrG,GAEF3lB,QAAQC,IAAK,mBAAkB0lB,sCAGjC2R,EAAmBC,GACnBF,EAAYrL,GAGdmJ,EAASD,GAAU,CACjBuB,OAAAA,EACA/Q,aAAAA,EACA6Q,QAASpB,EAASD,GAAUC,EAASD,GAAQqB,aAAUtqB,GAGzDsoB,EAAkBU,MAAMG,QAAQF,SAG3B,SAASxhB,EAAU+iB,EAA+B/Q,EAA+BC,GACtF,OAAOyR,EAAoBQ,EAAAA,GAASC,EAAAA,GAAgBpB,EAAQ/Q,EAAcC,GAGrE,SAASmS,EAAgBrB,EAA+B/Q,EAA+BC,GAC5F,OAAOyR,EAAoBW,EAAAA,GAAWC,EAAAA,GAAkBvB,EAAQ/Q,EAAcC,GAGzE,SAAS1H,EAAuBga,EAAmBvS,EAAqBC,GAC7E,MAAM,OAAEuP,EAAF,SAAUC,GAAaZ,EAAkBU,MAAMI,MACrD,IAAI,QAAEjiB,GAAY+hB,EAASD,IAAW,GA0BtC,YAvBuBjpB,IAArBkpB,EAASD,IACNxP,EAAa7W,MAAK,CAAC2oB,EAAY3yB,IAAM2yB,IAAerC,EAASD,GAAQxP,aAAa7gB,QAEjF9E,EAAAA,IAAS4lB,GAEX3lB,QAAQC,IACL,mBAAkBs0B,EAAkBzyB,SAAS6jB,2BAC9CwP,EAASD,IACLgD,EAAAA,EAAAA,GAAgBxS,EAAcyP,EAASD,GAAQxP,cAAczf,KAAK,MAClE,kBAIRmN,EAAU6kB,KAGZ9C,EAASD,GAAU,CACjB9hB,QAAAA,EACAsS,aAAAA,GAGF6O,EAAkBU,MAAMI,MAAMH,SAEvB9hB,EAGF,SAASxL,EAAmCuwB,EAAgBzS,EAAqBC,GAEtF,OAAO1H,GAAQ,IAAMka,GAAazS,EAAcC,GAO3C,SAAS/S,EAAUkT,GACxB,OAAO7H,GAAQ,KAAM,CACnB7K,QAAS0S,KAEP,IAGC,SAAS7e,EAAmB2tB,GAAkE,IAApDwD,EAAoD,uDAAzCC,EAAAA,EAAsB1S,EAAmB,uCACnG,OAAO,SAA0BlI,GAE/B,MAAM6a,EAAW1lB,EAAO6K,GAClB8a,EAAc3lB,IAepB,QAbK2lB,EAAYnlB,SAAYklB,EAASllB,UAAYglB,EAASE,EAASllB,QAASqK,MACvE1d,EAAAA,IAAS4lB,GAEX3lB,QAAQC,IACL,gBAAe20B,EAAU9yB,SAAS6jB,4BACnCuS,EAAAA,EAAAA,GAAgBI,EAASllB,QAAUqK,GAAOxX,KAAK,OAInDqyB,EAASllB,QAAUqK,EACnB8a,EAAYnlB,QAAUjD,EAAcykB,EAAWnX,IAG1C8a,EAAYnlB,SA9bvBlK,SAAS9I,iBAAiB,YAAY,KAEpCJ,QAAQ4B,KAAK,cAAc42B,EAAAA,EAAAA,IAAQj2B,OAAO+rB,OAAOqH,GAAmB,cAAe,YAicrF,MAKA,EALc,CACZxlB,cAAAA,EACAikB,SAAAA,I,4YChrBF,QAAeqE,EAAf,GAYA,IAAIC,EAAgB,GAEpB,MAAMC,EAAsC,GACtCC,EAAwB,CAqD9B,WAEE,IAAI/C,EACA91B,EAAAA,KACF81B,EAAgBI,YAAYjzB,OAI9B,IAAK,MAAMob,KAAaya,EAAWvK,SAAU,CAC3C,MAAM,gBACJwK,EADI,SACaC,EADb,YACuBC,EADvB,YACoCtO,GACtCtM,EAEJ,IAAI6a,EAEJ,IACEA,EAAiBH,EAAgBJ,EAAeK,GAChD,MAAOh3B,GAGP,YAFAm0B,EAAAA,EAAAA,GAAYn0B,GAKVhC,EAAAA,IACEwC,OAAO+rB,OAAO2K,GAAgBpqB,KAAKqqB,OAAOC,QAE5Cn5B,QAAQ4B,KAEL,sBAAqBwc,EAAUgb,2HAKlC72B,OAAO6rB,KAAK6K,GAAgBv0B,UAAW2zB,EAAAA,EAAAA,GAAqBW,EAAcC,KACxE9Z,EAAAA,IAEFnf,QAAQC,IACN,uBACAme,EAAUgb,oBACV,aACAlB,EAAAA,EAAAA,GAAgBc,EAAcC,GAAgBhzB,KAAK,OAIvDmY,EAAU4a,YAAcC,EACxB7a,EAAUib,uBAAwB,EAClCjb,EAAUkb,gBAEV5O,KAIJ,GAAI3qB,EAAAA,GAAO,CACT,MAAMw5B,EAAatD,YAAYjzB,MAAQ6yB,EACnC0D,EAAa,GAEfv5B,QAAQ4B,KAAM,oCAAmCsC,KAAKoP,MAAMimB,YA5G5DrmB,EAAU,GACV2lB,EAAa,IAAIn5B,IAUjB85B,GAAwBC,EAAAA,EAAAA,IAAoBC,GAElD,SAASA,IAA4C,IAA/BC,EAA+B,wDAC9CA,KAAyBpT,EAAAA,EAAAA,MAK9BqS,EAAU7qB,SAAS0X,GAAOA,EAAGiT,MAJ3Bd,EAAAA,EAAAA,IAAQ4B,GAOL,SAASI,EAAUC,EAAyBxuB,GACxB,iBAAdwuB,GAA0BA,IAAcnB,IACjDA,EAAgBmB,EACZxuB,MAAAA,GAAAA,EAASyuB,eACXJ,GAAa,GAEbF,EAAsBnuB,MAAAA,OAAD,EAACA,EAASsuB,wBAK9B,SAASI,IACd,OAAOrB,EAGF,SAASlxB,IACd,OAAO0L,EA2EF,SAAS8mB,EAAWl4B,EAAmBm4B,GACvCtB,EAAS72B,KACZ62B,EAAS72B,GAAQ,GAEjBoR,EAAQpR,GAAQ,CAACO,EAAyBgJ,MA5E9C,SAAoBvJ,EAAcO,EAAyBgJ,GACrDstB,EAAS72B,IACX62B,EAAS72B,GAAMiM,SAASksB,IACtB,MAAMJ,EAAYI,EAAQvB,EAAexlB,EAAS7Q,GAC9Cw3B,GACFD,EAAUC,EAAWxuB,MAwEvB6uB,CAAWp4B,EAAMO,EAASgJ,KAI9BstB,EAAS72B,GAAM4D,KAAKu0B,GAGf,SAASE,EAAY1U,GAC1BmT,EAAUlzB,KAAK+f,GAGV,SAAS2U,EAAe3U,GAC7B,MAAMzX,EAAQ4qB,EAAUtvB,QAAQmc,IACjB,IAAXzX,GACF4qB,EAAUhzB,OAAOoI,EAAO,GAIrB,SAAS6J,IAEd,IADAihB,EACA,uDAD6C,KAAM,IAEnD,OAAQlE,GACC,SAASyF,EAAgB5c,GAC7B4c,EAAiClD,2BAA6BvC,EAAU9yB,KAEzE,MAAOsI,IAAMmP,EAAAA,EAAAA,KAASnX,EAAAA,EAAAA,GAAcy2B,IAC9BnO,GAAcC,EAAAA,EAAAA,MAEpBjX,EAAAA,EAAAA,KAAU,IACD,KACLmlB,EAAWh2B,OAAOuH,KAEnB,CAACA,IAEJ,IAAIgU,EAAYya,EAAWp4B,IAAI2J,GAkB/B,GAjBKgU,IACHA,EAAY,CACV0a,gBAAAA,EACAC,SAAUtb,EACV4b,uBAAuB,EACvB3O,YAAAA,EACA4O,cAAe,EACfF,oBAAqBxE,EAAU9yB,MAGjC+2B,EAAWn2B,IAAI0H,EAAIgU,IAGjBA,EAAUib,wBACZjb,EAAUib,uBAAwB,IAG/Bjb,EAAU4a,eAAgBX,EAAAA,EAAAA,GAAqBja,EAAU2a,SAAUtb,GAAQ,CAC9EW,EAAU2a,SAAWtb,EAErB,IACEW,EAAU4a,YAAcF,EAAgBJ,EAAejb,GACvD,MAAO1b,IACPm0B,EAAAA,EAAAA,GAAYn0B,IAKhB,OAAO,mBAAC6yB,EAAD,KAAexW,EAAU4a,YAAiBvb,KAKnD1d,EAAAA,KACDsB,OAAe04B,UAAYA,EAE5B7wB,SAAS9I,iBAAiB,YAAY,KAEpCJ,QAAQ4B,KACN,qBACA42B,EAAAA,EAAAA,IACE3qB,MAAMuN,KAAKyd,EAAWvK,UACnB9hB,KAAI,QAAC,oBAAE4sB,EAAF,cAAuBE,GAAxB,QAA6C,CAAEF,oBAAAA,EAAqBE,cAAAA,MAC3E,gBACA,c,wCCjOR,MAAMgB,EAAa,UAEbC,EAAkB10B,OAAOC,aAAa,MAErC,SAASgL,EAAY0pB,GAC1B,OAAOA,EAASlxB,QAAQixB,GAAmB,EAAIC,EAAS7zB,QAAQ2zB,EAAY,IAAME,EAKpF,+vY,8GCcAR,EAAAA,EAAAA,IAAW,WAAW,CAACliB,EAAqB5E,KAC1C,WACOkM,EAAAA,WACGqb,EAAAA,EAAAA,OACDC,EAAAA,EAAAA,QAGF96B,EAAAA,EAAAA,IAAQsT,EAAQynB,UAAW,CAC9BC,UAAWC,UAAUD,UACrBx5B,SAAU05B,EAAAA,GACVC,aAAaC,EAAAA,EAAAA,MACbC,OAAQ55B,OAAOgC,SAASgkB,OAAOnb,SAAS,QACxCgvB,eAAgBC,EAAAA,GAChBC,gBAAiBC,EAAAA,MAZrB,OAiBFrB,EAAAA,EAAAA,IAAW,sBAAsB,CAACliB,EAAQ5E,EAAS7Q,KACjD,MAAM,YAAEi5B,GAAgBj5B,EAIxB,OAFKX,EAAAA,EAAAA,IAAQ,yBAA0B45B,EAAY30B,QAAQ,SAAU,KAE9D,IACFmR,EACHyjB,eAAe,EACfC,eAAWvvB,OAIf+tB,EAAAA,EAAAA,IAAW,eAAe,CAACliB,EAAQ5E,EAAS7Q,KAC1C,MAAM,KAAEgK,GAAShK,EAIjB,OAFKX,EAAAA,EAAAA,IAAQ,kBAAmB2K,GAEzB,IACFyL,EACHyjB,eAAe,EACfC,eAAWvvB,OAIf+tB,EAAAA,EAAAA,IAAW,mBAAmB,CAACliB,EAAQ5E,EAAS7Q,KAC9C,MAAM,SAAEo5B,GAAap5B,EAIrB,OAFKX,EAAAA,EAAAA,IAAQ,sBAAuB+5B,GAE7B,IACF3jB,EACHyjB,eAAe,EACfC,eAAWvvB,OAIf+tB,EAAAA,EAAAA,IAAW,sBAAsB,CAACliB,EAAQ5E,EAAS7Q,KACjD,MAAM,KAAEq5B,GAASr5B,GAEZX,EAAAA,EAAAA,IAAQ,qBAAsBg6B,OAGrC1B,EAAAA,EAAAA,IAAW,UAAU,CAACliB,EAAQ5E,EAAS7Q,KACrC,MAAM,UAAEs5B,EAAF,SAAaC,GAAav5B,EAIhC,OAFKX,EAAAA,EAAAA,IAAQ,0BAA2B,CAAEi6B,UAAAA,EAAWC,SAAAA,IAE9C,IACF9jB,EACHyjB,eAAe,EACfC,eAAWvvB,OAIf+tB,EAAAA,EAAAA,IAAW,2BAA4BliB,KAChCpW,EAAAA,EAAAA,IAAQ,eAEN,IACFoW,EACH0jB,eAAWvvB,OAIf+tB,EAAAA,EAAAA,IAAW,kBAAmBliB,KACvBpW,EAAAA,EAAAA,IAAQ,qBAEN,IACFoW,EACH+jB,qBAAqB,EACrBL,eAAWvvB,OAIf+tB,EAAAA,EAAAA,IAAW,eAAe,CAACliB,EAAQ5E,EAAS7Q,KAC1C,MAAM,YAAE04B,GAAgB14B,EAEpB04B,GACFe,EAAAA,EAAAA,IAAaz5B,EAAQ04B,YAAajjB,EAAOikB,gBAEzCC,EAAAA,EAAAA,UAIJhC,EAAAA,EAAAA,IAAW,WAAW,KACpB,WACE,UACQiC,EAAAA,EAAAA,YACAv6B,EAAAA,EAAAA,IAAQ,iBACRw6B,EAAAA,EAAAA,KAAa,GACnB,MAAOn6B,KAITyF,EAAAA,EAAAA,MAAc20B,SAThB,OAaFnC,EAAAA,EAAAA,IAAW,SAAS,MAClBgC,EAAAA,EAAAA,MAEKI,EAAAA,MAAetc,EAAAA,IACfsc,EAAAA,MAAerc,EAAAA,IACfqc,EAAAA,MAAepc,EAAAA,IACfoc,EAAAA,MAAenc,EAAAA,IAEpB,MAAMoc,EAAkBnc,EAAAA,GAAAA,QAAwB,OAAQ,IAClDoc,GAAoBpc,EAAAA,GAAAA,MAAsB,SAAW,CAAC,IAAI,GAChE,IAAK,IAAIrb,EAAI,EAAGA,EAAIy3B,EAAkBz3B,IAC/Bu3B,EAAAA,MAAgB,GAAEC,IAAwB,IAANx3B,EAAU,GAAKA,MAGrD61B,EAAAA,EAAAA,OAEL6B,EAAAA,EAAAA,GAAe,IAEf/0B,EAAAA,EAAAA,MAAcg1B,WAGhBxC,EAAAA,EAAAA,IAAW,cAAc,KACvB,iBACQt4B,EAAAA,EAAAA,IAAQ,eADhB,OAKFs4B,EAAAA,EAAAA,IAAW,sBAAuBliB,IACD,yBAA3BA,EAAO2kB,iBAIX,WACE,MAAMC,QAA2Bh7B,EAAAA,EAAAA,IAAQ,wBAEzCk4B,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACH2C,mBAAAA,KALJ,OAUF1C,EAAAA,EAAAA,IAAW,kBAAkB,CAACliB,EAAQ5E,EAASypB,MAC7C/C,EAAAA,EAAAA,IAAU,IACL9hB,EACHpS,KAAM,CACJi3B,YAAAA,EACAC,aAAc75B,KAAKC,aAKzBg3B,EAAAA,EAAAA,IAAW,qBAAsBliB,IAC/B,MAAM+hB,EAAY,IAAK/hB,UAChB+hB,EAAUn0B,MACjBk0B,EAAAA,EAAAA,IAAUC,O,qHCuRZ,SAASgD,EAAuB/kB,EAAhC,GAQsB,IAR+B,WACnDglB,EADmD,WAEnDC,EAFmD,UAGnDC,GAKoB,EACpB,MACEC,OAASC,KAAMC,GACfC,OAASF,KAAMG,IACbvlB,EAEEwlB,EAA2B,CAC/BR,WAAAA,GAEF,IAAIG,EACAG,EAEJ,MAAMG,EAAgBxnB,IACpB,KAAKynB,EAAAA,EAAAA,IAASznB,GACZ,OAEF,MAAM,GAAE3L,EAAF,WAAMO,GAAewyB,EAAUpnB,IAAW,GAChD,OAAK3L,EAIE,CAAEA,GAAAA,EAAIO,WAAAA,QAJb,GAOI8yB,EAAgB1nB,IACpB,IAAIynB,EAAAA,EAAAA,IAASznB,GACX,OAEF,MAAMxI,EAAO8vB,EAAUtnB,GAEvB,OAAOxI,EAAO,CAAEnD,GAAImD,EAAKnD,SAAO6B,GA2BlC,MAxBmB,aAAf6wB,GAA4C,WAAfA,IAC/BG,EAAQF,EAAWvwB,IAAI+wB,GAAc7wB,OAAOhD,SAC5C0zB,EAAQL,EAAWvwB,IAAIixB,GAAc/wB,OAAOhD,SAExCuzB,EAAMv4B,OAAS,IACjB44B,EAAMI,aAAeT,GAEnBG,EAAM14B,OAAS,IACjB44B,EAAMK,aAAeP,IAIN,cAAfN,GAA6C,aAAfA,IAChCG,EAAQD,EAAUxwB,IAAI+wB,GAAc7wB,OAAOhD,SAC3C0zB,EAAQJ,EAAUxwB,IAAIixB,GAAc/wB,OAAOhD,SAEvCuzB,EAAMv4B,OAAS,IACjB44B,EAAMM,aAAeX,GAEnBG,EAAM14B,OAAS,IACjB44B,EAAMO,aAAeT,IAIlBE,GA1gBTtD,EAAAA,EAAAA,IAAW,iBAAiB,CAACliB,EAAQ5E,EAAS7Q,KAC5C,MAAM,MACJy7B,EADI,UACGnC,EADH,SACcC,EAAUmC,IAAKC,EAD7B,SACoC3rB,GACtChQ,EAEJ,WACE,MAAM,cAAE05B,GAAkBjkB,EAC1B,GAAKikB,EAAL,CAeA,IAXAnC,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACHkE,YAAa,CACXC,SAAUC,EAAAA,GAAAA,cAIVL,SACIp8B,EAAAA,EAAAA,IAAQ,qBAAsBo8B,IAGlCnC,GAAaC,GAAYoC,UACNt8B,EAAAA,EAAAA,IAAQ,gBAAiB,CAAEi6B,UAAAA,EAAWC,SAAAA,EAAUoC,MAAAA,IACzD,CACVlmB,GAASiiB,EAAAA,EAAAA,MACT,MAAMqE,EAAcrC,IAAiB/jB,EAAAA,EAAAA,IAAWF,EAAQikB,GAEpDqC,IACFxE,EAAAA,EAAAA,KAAUyE,EAAAA,EAAAA,IACRvmB,EACAsmB,EAAYh0B,GACZ,CACEuxB,UAAAA,EACAC,SAAAA,EACA0C,SAAU,IACLF,EAAYE,SACfP,IAAKC,MAQb3rB,SACmB3Q,EAAAA,EAAAA,IAAQ,iBAAkB2Q,IACjC0pB,IACZnC,EAAAA,EAAAA,KAAUyE,EAAAA,EAAAA,KAAWtE,EAAAA,EAAAA,MAAagC,EAAe,CAAE1pB,SAAAA,MAIvDunB,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACHkE,YAAa,CACXC,SAAUC,EAAAA,GAAAA,cAlDhB,OAwDFnE,EAAAA,EAAAA,IAAW,iBAAiB,CAACliB,EAAQ5E,EAAS7Q,KAC5C,MAAM,SAAEgQ,GAAahQ,EAErB,WAEE,GAAIyV,EAAOmmB,aAAenmB,EAAOmmB,YAAYC,WAAaC,EAAAA,GAAAA,WACxD,QAGFvE,EAAAA,EAAAA,IAAU,IACL9hB,EACHmmB,YAAa,CACXC,SAAUpmB,EAAOmmB,YAAcnmB,EAAOmmB,YAAYC,SAAWC,EAAAA,GAAAA,KAC7DI,yBAAqBtyB,KAIzB,MAAMsyB,QAA4B78B,EAAAA,EAAAA,IAAQ,gBAAiB2Q,GAE3DyF,GAASiiB,EAAAA,EAAAA,OACTH,EAAAA,EAAAA,IAAU,IACL9hB,EACHmmB,YAAa,IACRnmB,EAAOmmB,YACVM,oBAAAA,MArBN,OA2BFvE,EAAAA,EAAAA,IAAW,kBAAkB,KAC3B,WACE,MAAM5pB,QAAe1O,EAAAA,EAAAA,IAAQ,mBAC7B,IAAK0O,EACH,OAGF,MAAM0H,GAASiiB,EAAAA,EAAAA,OACfH,EAAAA,EAAAA,IAAU,IACL9hB,EACH0mB,SAAU,IACL1mB,EAAO0mB,SACVC,iBAAkBruB,EAAOsuB,eAX/B,OAiBF1E,EAAAA,EAAAA,IAAW,mBAAmB,CAACliB,EAAQ5E,EAAS7Q,KAC9C,MAAMq5B,EAAOr5B,EACPsH,EAAiBxJ,IAAIw+B,gBAAgBjD,IAE3C9B,EAAAA,EAAAA,IAAU,IACL9hB,EACH0mB,SAAU,IACL1mB,EAAO0mB,SACVC,iBAAkB,CAChB,CACEG,KAAMC,EAAAA,GACN31B,SAAU,CACRC,SAAU,GACVoH,KAAMmrB,EAAKnrB,KACXnH,SAAUsyB,EAAKp7B,KACfqJ,eAAAA,OAGAmO,EAAO0mB,SAASC,kBAAoB,OAK9C,WACE,MAAMruB,QAAe1O,EAAAA,EAAAA,IAAQ,kBAAmBg6B,GAChD,IAAKtrB,EACH,OAGF,MAAM,UAAE0uB,GAAc1uB,EAGtB,KADA0H,GAASiiB,EAAAA,EAAAA,OACGyE,SAASC,iBACnB,OAGF,MAAMM,EAAiBjnB,EAAO0mB,SAASC,iBAAiB,GACxD,IAAKM,GAAkBA,EAAeH,OAASC,EAAAA,GAC7C,OAGF,MAAMG,EAAiB,IAClBF,EACH51B,SAAU,IACL41B,EAAU51B,SACbS,eAAAA,KAIJiwB,EAAAA,EAAAA,IAAU,IACL9hB,EACH0mB,SAAU,IACL1mB,EAAO0mB,SACVC,iBAAkB,CAChBO,KACGlnB,EAAO0mB,SAASC,iBAAiB13B,MAAM,QAhClD,OAuCFizB,EAAAA,EAAAA,IAAW,uBAAuB,KAChC,WAAa,QACX,MAAM5pB,QAAe1O,EAAAA,EAAAA,IAAQ,wBAE7B,IAAK0O,EACH,OAGF,IAAIypB,GAAYE,EAAAA,EAAAA,MAEhB,UAAI3pB,EAAO6sB,aAAX,OAAI,EAAcv4B,SAChBm1B,GAAYoF,EAAAA,EAAAA,IAASpF,GAAWqF,EAAAA,EAAAA,IAAqB9uB,EAAO6sB,MAAO,QAErE,UAAI7sB,EAAOgtB,aAAX,OAAI,EAAc14B,SAChBm1B,GAAYsF,EAAAA,EAAAA,IAAYtF,GAAWqF,EAAAA,EAAAA,IAAqB9uB,EAAOgtB,MAAO,QAGxEvD,EAAY,IACPA,EACHuF,QAAS,IACJvF,EAAUuF,QACbC,IAAK,IAAKxF,EAAUuF,QAAQC,KAAO,MAAQjvB,EAAOkvB,YAClDC,WAAYnvB,EAAOmvB,cAIvB3F,EAAAA,EAAAA,IAAUC,IAzBZ,OA6BFG,EAAAA,EAAAA,IAAW,gBAAgB,CAACliB,EAAQ5E,EAAS7Q,KAC3C,MAAM,UAAEm9B,EAAF,WAAa70B,GAAetI,EAElC,WAEE,UADqBX,EAAAA,EAAAA,IAAQ,eAAgB89B,EAAW70B,GAEtD,OAGF,MAAMkvB,GAAYE,EAAAA,EAAAA,OAElBH,EAAAA,EAAAA,KAAU6F,EAAAA,EAAAA,IAAkB5F,EAAW2F,KARzC,OAYFxF,EAAAA,EAAAA,IAAW,kBAAkB,CAACliB,EAAQ5E,EAAS7Q,KAC7C,MAAM,UAAEm9B,GAAcn9B,EACtB,IAAIsI,EAGJ,IAFkB6yB,EAAAA,EAAAA,IAASgC,GAEZ,CACb,MAAM/yB,GAAOuL,EAAAA,EAAAA,IAAWF,EAAQ0nB,GAChC,IAAK/yB,EACH,OAGF9B,EAAa8B,EAAK9B,WAGpB,WAEE,UADqBjJ,EAAAA,EAAAA,IAAQ,iBAAkB89B,EAAW70B,GAExD,OAGF,MAAMkvB,GAAYE,EAAAA,EAAAA,OAElBH,EAAAA,EAAAA,KAAU8F,EAAAA,EAAAA,IAAqB7F,EAAW2F,KAR5C,OAYFxF,EAAAA,EAAAA,IAAW,sBAAsB,KAC/B,WACE,MAAM5pB,QAAe1O,EAAAA,EAAAA,IAAQ,uBACxB0O,IAILwpB,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACH4F,eAAgBvvB,KARpB,OAaF4pB,EAAAA,EAAAA,IAAW,0BAA0B,CAACliB,EAAQ5E,EAAS7Q,KACrD,MAAM,KAAE6kB,GAAS7kB,EAEjB,WAEE,UADqBX,EAAAA,EAAAA,IAAQ,yBAA0BwlB,GAErD,OAGF,MAAM2S,GAAYE,EAAAA,EAAAA,OAElBH,EAAAA,EAAAA,IAAU,IACLC,EACH8F,eAAgB9F,EAAU8F,eAAejzB,QAAQkzB,GAAYA,EAAQ1Y,OAASA,OAVlF,OAeF8S,EAAAA,EAAAA,IAAW,8BAA8B,KACvC,WAEE,UADqBt4B,EAAAA,EAAAA,IAAQ,8BAE3B,OAGF,MAAMoW,GAASiiB,EAAAA,EAAAA,OAEfH,EAAAA,EAAAA,IAAU,IACL9hB,EACH6nB,eAAgB7nB,EAAO6nB,eAAejzB,QAAQkzB,GAAYA,EAAQC,eAVtE,OAeF7F,EAAAA,EAAAA,IAAW,8BAA+BliB,IACxC,MAAM,iBAAEgoB,GAAqBhoB,EAE7B,WACE,MAAM1H,QAAe1O,EAAAA,EAAAA,IAAQ,8BAA+B,CAAEo+B,iBAAAA,IACzD1vB,IAILwpB,EAAAA,EAAAA,KAAUmG,EAAAA,EAAAA,KAAoBhG,EAAAA,EAAAA,MAAa3pB,KAN7C,OAUF4pB,EAAAA,EAAAA,IAAW,4BAA6BliB,IACtC,MAAM,iBAAEgoB,GAAqBhoB,EAC7B,WACE,MAAM1H,QAAe1O,EAAAA,EAAAA,IAAQ,4BAA6B,CACxDo+B,iBAAAA,IAEG1vB,IAILwpB,EAAAA,EAAAA,KAAUoG,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAa3pB,KARzC,OAYF4pB,EAAAA,EAAAA,IAAW,8BAA8B,CAACliB,EAAQ5E,EAAS7Q,KACzD,MAAM,SAAE49B,EAAF,SAAYC,EAAZ,mBAAsBC,GAAuB99B,EAEnD,iBACuBX,EAAAA,EAAAA,IAAQ,6BAA8Bu+B,EAAU,CAAEC,SAAAA,EAAUC,mBAAAA,MAMjFvG,EAAAA,EAAAA,KAAUwG,EAAAA,EAAAA,KAAqBrG,EAAAA,EAAAA,MAAakG,EAAUC,EAAUC,KAPlE,OAWFnG,EAAAA,EAAAA,IAAW,iCAAiC,CAACliB,EAAQ5E,EAAS7Q,KAC5D,YACEu3B,EAAAA,EAAAA,KAAUoG,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAa13B,IACvC,MAAMw3B,GAAYE,EAAAA,EAAAA,OACZ,qBAAEsG,EAAF,oBAAwBC,GAAwBzG,EAAU2E,SAAS+B,MACrED,GAAuBD,QACnBG,EAAAA,EAAAA,YAEAvE,EAAAA,EAAAA,OAPV,OAYFjC,EAAAA,EAAAA,IAAW,mCAAmC,CAACliB,EAAQ5E,EAAS7Q,KAC9D,MAAM,SAAE69B,GAAa79B,EAErB,iBACuBX,EAAAA,EAAAA,IAAQ,kCAAmCw+B,KAKhEtG,EAAAA,EAAAA,KAAUoG,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAa,CAAE0G,+BAAgCP,MAN3E,OAUFlG,EAAAA,EAAAA,IAAW,iBAAiB,KAC1B,WACE,MAAM5pB,QAAe1O,EAAAA,EAAAA,IAAQ,kBACxB0O,IAILwpB,EAAAA,EAAAA,KAAUoG,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAa,CAAE2G,UAAWtwB,MANtD,OAUF4pB,EAAAA,EAAAA,IAAW,uBAAuB,KAChC,WACE,MACE2G,EAAqBC,EAAkBC,EAAsBC,EAAkBC,SACvEz+B,QAAQ0+B,IAAI,EACpBt/B,EAAAA,EAAAA,IAAQ,uBAAwB,gBAChCA,EAAAA,EAAAA,IAAQ,uBAAwB,aAChCA,EAAAA,EAAAA,IAAQ,uBAAwB,iBAChCA,EAAAA,EAAAA,IAAQ,uBAAwB,aAChCA,EAAAA,EAAAA,IAAQ,uBAAwB,gBAGlC,KACGi/B,GAAwBC,GAAqBC,GAAyBC,GAAqBC,GAE5F,OAGF,MAAMjpB,GAASiiB,EAAAA,EAAAA,MAEfjiB,EAAO0mB,SAASyC,QAAQ3F,YAAcqF,EACtC7oB,EAAO0mB,SAASyC,QAAQC,SAAWN,EACnC9oB,EAAO0mB,SAASyC,QAAQE,aAAeN,EACvC/oB,EAAO0mB,SAASyC,QAAQG,SAAWN,EACnChpB,EAAO0mB,SAASyC,QAAQI,WAAaN,GAErCnH,EAAAA,EAAAA,IAAU9hB,IAzBZ,OA6BFkiB,EAAAA,EAAAA,IAAW,wBAAwB,CAACliB,EAAQ5E,EAAS7Q,KACnD,MAAM,WAAEi/B,EAAF,WAAcxE,GAAez6B,GAGjC4+B,SAAW,CAACK,GAA8B9C,IACxC1mB,EAAO0mB,SAEX,IAAKA,EACH,OAGF,MAAMlB,EAAQT,EAAuB/kB,EAAQ,CAC3CglB,WAAAA,EACAC,WAAY,IAAIyB,EAAS+C,gBAAiB/C,EAASgD,cACnDxE,UAAW,IAAIwB,EAASiD,gBAAiBjD,EAASkD,gBAGpD,WACE,MAAMtxB,QAAe1O,EAAAA,EAAAA,IAAQ,qBAAsB4/B,EAAYhE,GAE/D,GAAIltB,EAAQ,CACV,MAAMypB,GAAYE,EAAAA,EAAAA,MAElBF,EAAU2E,SAASyC,QAAQK,GAA+BlxB,GAE1DwpB,EAAAA,EAAAA,IAAUC,KARd,OAaFG,EAAAA,EAAAA,IAAW,sBAAsB,CAACliB,EAAQ5E,EAAS7Q,KACjD,MAAM,WAAEi/B,EAAF,YAAcK,EAAd,YAA2BC,GAAgBv/B,GAE/C4+B,SAAW,CAACK,GAA8B9C,IACxC1mB,EAAO0mB,SAEX,IAAKA,EACH,OAGF,MAAMlB,EAAQT,EAAuB/kB,EAAQ,CAC3CglB,WAAY0B,EAAS1B,WACrBC,WAAY4E,EAAcC,EAAc,IAAIpD,EAAS+C,gBAAiB/C,EAASgD,cAC/ExE,UAAY2E,EAA4B,IAAInD,EAASiD,gBAAiBjD,EAASkD,cAArDE,IAG5B,WACE,MAAMxxB,QAAe1O,EAAAA,EAAAA,IAAQ,qBAAsB4/B,EAAYhE,GAE/D,GAAIltB,EAAQ,CACV,MAAMypB,GAAYE,EAAAA,EAAAA,MAElBF,EAAU2E,SAASyC,QAAQK,GAA+BlxB,GAE1DwpB,EAAAA,EAAAA,IAAUC,KARd,OAiFFG,EAAAA,EAAAA,IAAW,kBAAkB,CAACliB,EAAQ5E,EAAS7Q,MAC7CX,EAAAA,EAAAA,IAAQ,iBAAkBW,OAG5B23B,EAAAA,EAAAA,IAAW,uBAAuB,KAChC,WACE,MAAM5pB,QAAe1O,EAAAA,EAAAA,IAAQ,wBACxB0O,IAELwpB,EAAAA,EAAAA,KAAUoG,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAa3pB,KAJzC,OAQF4pB,EAAAA,EAAAA,IAAW,yBAAyB,CAACliB,EAAQ5E,EAAS7Q,KACpD,YACEu3B,EAAAA,EAAAA,KAAUoG,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAa,CAAE8H,mBAAoBx/B,WAExCX,EAAAA,EAAAA,IAAQ,wBAAyBW,KAEpDu3B,EAAAA,EAAAA,KAAUoG,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAa,CAAE8H,oBAAqBx/B,MALlE,OAUF23B,EAAAA,EAAAA,IAAW,mBAAmB,SAACliB,EAAQ5E,GAA0B,IAAjB7Q,EAAiB,uDAAP,IACpD,SAAEy/B,GAAaz/B,EACdy/B,IAAUA,EAAWhqB,EAAO0mB,SAAS+B,MAAMwB,UAEhD,WACE,MAAMC,QAAoBtgC,EAAAA,EAAAA,IAAQ,mBAAoB,CAAEogC,SAAAA,IACnDE,IAELpI,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACHiI,YAAAA,KANJ,OAWFhI,EAAAA,EAAAA,IAAW,oBAAoB,CAACliB,EAAQ5E,KACtC,GAAI4E,EAAO4kB,mBAAoB,CAC7B,MAAMuF,EAAa7d,EAAAA,GAAAA,IAAmCtM,EAAO4kB,mBAAmB32B,eAAiB,MAAQ,MACzGmN,EAAQgvB,iBAAiB,CAAED,WAAAA,KAC3BE,EAAAA,EAAAA,IAAcF,GAGhB,WACE,IAAIlI,EAAAA,EAAAA,MAAYyE,SAAS+B,MAAM6B,yBAC7B,OAGF,MAAMC,QAA2B3gC,EAAAA,EAAAA,IAAQ,uBACzC,GAAI2gC,EAAoB,CACtB,MAAMJ,EAAa7d,EAAAA,GAAAA,IAAmCie,EAAmBt8B,eAAiB,MAAQ,MAClGmN,EAAQgvB,iBAAiB,CAAED,WAAAA,KAC3BE,EAAAA,EAAAA,IAAcF,KATlB,OAcFjI,EAAAA,EAAAA,IAAW,iBAAiB,KAC1B,WACE,MAAMsI,QAAkB5gC,EAAAA,EAAAA,IAAQ,kBAE3B4gC,IAEL1I,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACHuI,UAAAA,KAPJ,O,mGCxkBFtI,EAAAA,EAAAA,IAAW,aAAa,CAACliB,EAAQ5E,EAAS3S,KAQxC,OAPIR,EAAAA,IACsB,qBAApBQ,EAAO,UAAuD,2BAApBA,EAAO,UAEnDP,QAAQC,IAAI,kBAAmBM,EAAO,SAAU,CAAEA,OAAAA,IAI9CA,EAAO,UACb,IAAK,kBA6CT,SAA0BuX,GACxB,MAAM,oBAAEwoB,EAAF,qBAAuBD,IAAyBkC,EAAAA,EAAAA,IAAqBzqB,GACvEwoB,GAAuBD,IACpBG,EAAAA,EAAAA,OAEFgC,EAAAA,EAAAA,IAAY1qB,EAAO0mB,SAAS+B,MAAMwB,UAjDnCU,CAAiB3qB,GACjB,MAEF,IAAK,4BAiDT,SAAoCvX,GAClC,IAAIuX,GAASiiB,EAAAA,EAAAA,MAEb,MAAM2I,EAAoC,4BAArB5qB,EAAO6qB,UACtBA,EAAYpiC,EAAOqiC,mBAUzB,QARAhJ,EAAAA,EAAAA,IAAU,IACL9hB,EACH6qB,UAAAA,EACApH,eAAe,IAGjBzjB,GAASiiB,EAAAA,EAAAA,MAED4I,GACN,IAAK,gCACEzG,EAAAA,EAAAA,KAAa,IAElBtC,EAAAA,EAAAA,IAAU,IACL9hB,EACH+qB,cAAc,IAEhB,MACF,IAAK,8BACHjJ,EAAAA,EAAAA,IAAU,IACL9hB,EACHgrB,iBAAkBviC,EAAOwiC,eAE3B,MACF,IAAK,kCACHnJ,EAAAA,EAAAA,IAAU,IACL9hB,EACHkrB,SAAUziC,EAAO0iC,OAEnB,MACF,IAAK,gCACHrJ,EAAAA,EAAAA,IAAU,IACL9hB,EACH+jB,qBAAqB,EACrBqH,WAAY3iC,EAAO4iC,SAErB,MACF,IAAK,0BACH,GAAIT,EACF,OAGGxG,EAAAA,EAAAA,KAAa,IAElBtC,EAAAA,EAAAA,IAAU,IACL9hB,EACH+qB,cAAc,KAnGhBO,CAA2B7iC,GAC3B,MAEF,IAAK,4BAwGT,SAAoCA,IAClCq5B,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACHyB,UAAWj7B,EAAOW,UA1GhBmiC,CAA2B9iC,GAC3B,MAEF,IAAK,yBA2GT,SAAiCA,GAC/B,MAAM,gBAAEk8B,GAAoBl8B,EACtBuX,GAASiiB,EAAAA,EAAAA,MAEX0C,IAAoB3kB,EAAO2kB,mBAI/B7C,EAAAA,EAAAA,IAAU,IACL9hB,EACH2kB,gBAAAA,IAGsB,0BAApBA,IACFj1B,EAAAA,EAAAA,MAAc87B,WAxHZC,CAAwBhjC,GACxB,MAEF,IAAK,iBAyHT,SAAyBA,GACvB,MAAM,YAAEw6B,GAAgBx6B,GAClB,eAAEijC,EAAF,UAAkBb,IAAc5I,EAAAA,EAAAA,MAChC0J,GAAW1I,IAAgBA,EAAY2I,SAExCF,GAAgC,4BAAdb,IAA2Cc,IAIlEj8B,EAAAA,EAAAA,MAAcm8B,YAAY,CAAE5I,YAAAA,IAjIxB6I,CAAgBrjC,GAChB,MAEF,IAAK,0BAiIT,SAAkCA,GAChC,MAAMuX,GAASiiB,EAAAA,EAAAA,MAEXjiB,EAAOgoB,mBAAqBv/B,EAAOu/B,mBAIvClG,EAAAA,EAAAA,IAAU,IACL9hB,EACHgoB,iBAAkBv/B,EAAOu/B,mBAzIvB+D,CAAyBtjC,GACzB,MAEF,IAAK,qBA0IT,SAA6BA,GAC3B,MAAM,YAAE69B,GAAgB79B,GAExBq5B,EAAAA,EAAAA,IAAU,KACLyE,EAAAA,EAAAA,KAAWtE,EAAAA,EAAAA,MAAaqE,EAAYh0B,GAAIg0B,GAC3CrC,cAAeqC,EAAYh0B,KAM/B,SAA6B2xB,GAC3B,MAAM+H,EAAkBC,aAAaC,QAAQ1kB,EAAAA,IAC7C,IAAKwkB,EAAiB,OAEtB,MAAMG,EAAWC,KAAKC,MAAML,GAC5BG,EAAS75B,GAAK2xB,EAEdgI,aAAaK,QAAQ9kB,EAAAA,GAAkB4kB,KAAKG,UAAUJ,IAVtDK,CAAoBlG,EAAYh0B,IAjJ5Bm6B,CAAoBhkC,GACpB,MAEF,IAAK,QAAS,CACiB,oBAAzBA,EAAOI,MAAMO,SACfgS,EAAQowB,UAGV,MAAMkB,GAAuBC,EAAAA,EAAAA,IAAiBlkC,EAAOI,OACjD6jC,EACFtxB,EAAQwxB,gBAAgB,CAAE/jC,MAAO6jC,IACxBtxB,EAAQyxB,YACjBzxB,EAAQyxB,WAAW,CAAEtkC,KAAME,EAAOI,QAGpC,Y,mGC6BN,WACE,SAASikC,IACP,MAAMC,EAAoB37B,SAAS47B,gBAAgB39B,UAAUV,MAAM,eAC7Ds+B,EAAeF,EAAoBA,EAAkB,GAAK,QAC1D/sB,GAASiiB,EAAAA,EAAAA,MACTiL,GAAYC,EAAAA,EAAAA,IAAYntB,IACxB,eAAEotB,GAAmBptB,EAAO0mB,SAAS+B,MAEvCyE,IAAcD,KAChBI,EAAAA,EAAAA,GAAYH,EAAWE,IAAmB5jB,EAAAA,KAE1CsY,EAAAA,EAAAA,IAAU,IAAK9hB,KAInB,MAAMstB,EAAM/jC,OAAOgkC,WAAW,gCACM,mBAAzBD,EAAIhlC,iBACbglC,EAAIhlC,iBAAiB,SAAUwkC,GACK,mBAApBQ,EAAIE,aACpBF,EAAIE,YAAYV,GAzGpBW,IAEAvL,EAAAA,EAAAA,IAAW,QAASliB,IAClB,MAAM,eAAEotB,EAAF,gBAAkBM,EAAlB,SAAmCzD,GAAajqB,EAAO0mB,SAAS+B,MAChEkF,GAAQR,EAAAA,EAAAA,IAAYntB,IAErB0qB,EAAAA,EAAAA,IAAYT,OAAU91B,GAAW,GAEtC/C,SAAS47B,gBAAgBprB,MAAMgsB,YAC7B,uBAAyB,GAAExhC,KAAKsP,IAAIgyB,EAAiB/tB,EAAAA,GAAS,GAAK,SAErEvO,SAAS47B,gBAAgBprB,MAAMgsB,YAAY,wBAA0B,GAAExhC,KAAKC,MAAwB,OAAlBqhC,QAClFt8B,SAAS47B,gBAAgBprB,MAAMgsB,YAAY,sBAAwB,GAAEF,OACrEt8B,SAAS47B,gBAAgBhT,aAAa,yBAA0B0T,EAAgBG,YAChFz8B,SAAS+kB,KAAK3B,UAAU/X,IAAI,WAC5BrL,SAAS+kB,KAAK3B,UAAU/X,IAAK,mBAAkB2wB,KAC/Ch8B,SAAS+kB,KAAK3B,UAAU/X,IAAIqxB,EAAAA,GAAe,eAAiB,mBAE5DT,EAAAA,EAAAA,GAAYM,EAAOP,IAAmB5jB,EAAAA,KAEtCukB,EAAAA,EAAAA,MACAC,EAAAA,EAAAA,MAEIruB,EAAAA,GACFvO,SAAS+kB,KAAK3B,UAAU/X,IAAI,UACnBwxB,EAAAA,GACT78B,SAAS+kB,KAAK3B,UAAU/X,IAAI,cACnByxB,EAAAA,IACT98B,SAAS+kB,KAAK3B,UAAU/X,IAAI,YAE1B0xB,EAAAA,IACF/8B,SAAS+kB,KAAK3B,UAAU/X,IAAI,iBAIhCylB,EAAAA,EAAAA,IAAW,gBAAgB,CAACliB,EAAQ5E,EAAS7Q,KAC3C,MAAM,aAAE6jC,GAAiB7jC,EAMzB,OAJqB,IAAjB6jC,GACFh9B,SAAS+kB,KAAK3B,UAAU6Z,OAAO,WAG1B,IACFruB,EACHouB,aAAAA,OAIJlM,EAAAA,EAAAA,IAAW,sBAAsB,CAACliB,EAAQ5E,EAAS7Q,KACjD,MAAM,YAAEi5B,GAAgBj5B,EAExB,MAAO,IACFyV,EACHsuB,gBAAiB9K,OAIrBtB,EAAAA,EAAAA,IAAW,qBAAqB,CAACliB,EAAQ5E,EAAS7Q,KACzC,IACFyV,EACH0rB,eAAgB95B,QAAQrH,QAI5B23B,EAAAA,EAAAA,IAAW,kBAAmBliB,IACrB,IACFA,EACH0jB,eAAWvvB,OAIf+tB,EAAAA,EAAAA,IAAW,4BAA4B,KACrCz4B,YAAW,MACTq4B,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACHsM,6BAA6B,IAE/Bn9B,SAAS+kB,KAAK3B,UAAU6Z,OAAO,gBA/EA,MAkFjCvM,EAAAA,EAAAA,IAAU,KACLG,EAAAA,EAAAA,MACHsM,6BAA6B,GAC5B,CAAEvM,gBAAgB,Q,wCC7FvBE,EAAAA,EAAAA,IAAW,oBAAoB,CAACliB,EAAQ5E,EAAS7Q,KACxC29B,EAAAA,EAAAA,IAAgBloB,EAAQzV,MAGjC23B,EAAAA,EAAAA,IAAW,oBAAoB,CAACliB,EAAQ5E,EAAS7Q,KAC/C,MAAM,MAAEojC,KAAUjH,GAAan8B,EAE/B,OAAOikC,EAAAA,EAAAA,IAAqBxuB,EAAQ2tB,EAAOjH,O,0VCO7C,MAAM+H,EAAsBxjC,KAAKC,MAAQ,IAAO,SAE1CwjC,EAAyB,IACzBC,EAAuB,IAEtB,SAASjJ,EAASkJ,GAEvB,MAAwB,iBAAbA,EACFA,EAAW,GAGZA,EAASt0B,WAAW,KAGvB,SAASu0B,EAAYp5B,GAC1B,OAAOq5B,EAAiBr5B,IAASs5B,EAAiBt5B,GAG7C,SAASq5B,EAAiBr5B,GAC/B,MAAqB,uBAAdA,EAAKjN,KAGP,SAASumC,EAAiBt5B,GAC/B,MAAqB,uBAAdA,EAAKjN,KAGP,SAASwmC,EAAcv5B,GAC5B,MAAqB,oBAAdA,EAAKjN,KAGP,SAASymC,EAAgBx5B,GAC9B,MAAqB,oBAAdA,EAAKjN,MAA4C,uBAAdiN,EAAKjN,KAG1C,SAAS0mC,EAAqBx8B,GACnC,OAAOA,IAAW8Z,EAAAA,GAGb,SAAS2iB,EAAkB15B,GAChC,OAAQA,EAAKjN,MACX,IAAK,kBACH,MAAO,cACT,IAAK,qBACL,IAAK,qBACH,MAAO,gBACT,IAAK,kBACH,MAAO,kBACT,QACE,MAAO,QAIN,SAAS4mC,EAAqB35B,GACnC,GAAkB,oBAAdA,EAAKjN,MAA4C,mBAAdiN,EAAKjN,KAG5C,OAAOiN,EAAKnD,GAIP,SAASoD,EAAazC,EAAcwC,EAAed,GAAgC,IAAhB06B,EAAgB,wDACxF,OAAIA,GAAW16B,GAAQc,EAAKnD,KAAOqC,EAAKrC,IAAMqC,EAAK06B,OAC1Cp8B,EAAK,iBAEPwC,EAAKhF,OAASwC,EAAK,cAGrB,SAASq8B,EAAmB75B,GACjC,GAAKA,EAAK+wB,SAGV,OAAO/wB,EAAK+wB,SAASN,MAGhB,SAASqJ,EAAY95B,GAC1B,MAAM,SAAE8E,GAAa9E,EACrB,GAAI8E,EACF,MAAQ,gBAAeA,IAGzB,MAAM,WAAEi1B,GAAe/5B,EAAK+wB,UAAY,GAExC,OAAOgJ,EAGF,SAASC,EACdC,GAEA,IADAj3B,EACA,uDADyB,SAEzB,GAAKi3B,EAAMC,WAIX,MACO,QADCl3B,EAEI,UAASi3B,EAAMp9B,MAAMo9B,EAAMC,aAE3B,SAAQD,EAAMp9B,MAAMo9B,EAAMC,aAIjC,SAASC,EAAkBn6B,GAChC,OAAQA,EAAKo6B,YAGR,SAASC,EAAYr6B,GAC1B,OAAO7D,QAAQ6D,EAAKs6B,aAGf,SAASC,EAAiBv6B,EAAeskB,GAC9C,QAAOtkB,EAAKs6B,aAAct6B,EAAKs6B,YAAYhW,GAGtC,SAASkW,EAAkBx6B,EAAeskB,GAAgC,QAC/E,OAAOnoB,SACL,UAAC6D,EAAKy6B,+BAAN,aAAC,EAA+BnW,MAAhC,UACItkB,EAAK06B,2BADT,aACI,EAA2BpW,KAI5B,SAASqW,EAAiB36B,EAAe46B,GAC9C,OAAIA,IAAa1kC,EAAAA,MAIb8J,EAAK66B,cAAgB76B,EAAK86B,YAAc96B,EAAK+6B,aAAetB,EAAqBz5B,EAAKnD,SAItFmD,EAAKg7B,aAIL/K,EAASjwB,EAAKnD,MAId08B,EAAcv5B,GACTu6B,EAAiBv6B,EAAM,gBAGzBq6B,EAAYr6B,KAAUw6B,EAAkBx6B,EAAM,kBAWhD,SAASi7B,EAA4Bj7B,GAAkE,IAAlDk7B,EAAkD,wDAC5G,IAAKl7B,EACH,MAAO,CACLm7B,gBAAgB,EAChBC,gBAAgB,EAChBC,iBAAiB,EACjBC,aAAa,EACbC,qBAAqB,GAIzB,MAAMC,EAAUnB,EAAYr6B,GAE5B,MAAO,CACLm7B,eAAgBK,IAAYhB,EAAkBx6B,EAAM,aACpDo7B,gBAAiBI,IAAYhB,EAAkBx6B,EAAM,iBAAmBiwB,EAASjwB,EAAKnD,KAAOq+B,GAC7FG,gBAAiBG,IAAYhB,EAAkBx6B,EAAM,gBACrDs7B,YAAaE,IAAYhB,EAAkBx6B,EAAM,YACjDu7B,oBAAqBC,IAAYhB,EAAkBx6B,EAAM,eAItD,SAASy7B,EACdj+B,EACAi9B,EACAC,GAEA,GAAID,MAAAA,GAAAA,EAAyBiB,aAAc,CACzC,MAAM,UAAEC,GAAclB,EACtB,OAAOkB,GAAaA,EAAY3C,EAC5Bx7B,EACA,gDACAA,EACE,mBACA,EAACo+B,EAAAA,EAAAA,IAAmB,IAAIpmC,KAAiB,IAAZmmC,GAAmBn+B,EAAKsB,OAAO+8B,EAAAA,EAAAA,IAAWr+B,EAAkB,IAAZm+B,MAG/En+B,EAAK,mDAGX,GAAIk9B,MAAAA,GAAAA,EAAqBgB,aACvB,OAAOl+B,EAAK,iEAMT,SAASs+B,EAAuB97B,GACrC,GAAKA,GAASA,EAAK+wB,SAInB,OAAO/wB,EAAK+wB,SAASgL,SAOhB,SAASC,EAAeh8B,GAC7B,OAAOA,EAAKi8B,WAAahlB,EAAAA,GAGpB,SAASilB,EACdl8B,EAAem8B,GACf,IAD+CC,EAC/C,uDADmG,GAGnG,OAAIA,EAAiBp8B,EAAKnD,UAA6C6B,IAAtC09B,EAAiBp8B,EAAKnD,IAAIw/B,QAClDD,EAAiBp8B,EAAKnD,IAAIw/B,QAIjCr8B,EAAKq8B,SACDpM,EAASjwB,EAAKnD,MAAQs/B,EAAeG,8BACrC/C,EAAcv5B,KAAUm8B,EAAeI,2BACvCnD,EAAYp5B,KAAUm8B,EAAeK,sBAItC,SAASC,EACdz8B,EAAem8B,GACf,IAD+CC,EAC/C,uDADmG,GAEnG,MAAM,8BACJM,GAAgC,EAD5B,2BAEJC,GAA6B,EAFzB,uBAGJC,GAAyB,GACvBT,EAEJ,OAAIC,EAAiBp8B,EAAKnD,UAAwD6B,IAAjD09B,EAAiBp8B,EAAKnD,IAAI+1B,mBAClDwJ,EAAiBp8B,EAAKnD,IAAI+1B,mBAG3B3C,EAASjwB,EAAKnD,KAAO6/B,GACvBnD,EAAcv5B,IAAS28B,GACvBvD,EAAYp5B,IAAS48B,EAGtB,SAASC,EAAiB78B,GAC/B,OAAOq5B,EAAiBr5B,KAAWs5B,EAAiBt5B,IAASu5B,EAAcv5B,KAAUA,EAAKg7B,UAGrF,SAAS8B,EAAyBt/B,EAAcu/B,EAAuBC,GAC5E,MAAM,GACJngC,EADI,MACA7B,EADA,SACOiiC,EADP,YACiBv7B,EADjB,cAC8Bw7B,EAD9B,gBAEJC,EAFI,gBAEaC,EAFb,gBAGJC,EAHI,aAGaC,EAHb,YAG2BC,KAC5Bx7B,GACDg7B,EAIJ,YACiBr+B,IAAfs+B,IACEhoC,OAAO+rB,OAAOhf,GAAS5C,OAAOhD,SAAShF,OAAS,GAC5CgmC,MAAAA,GAAAA,EAAiBhmC,QACjBimC,MAAAA,GAAAA,EAAiBjmC,QAEhBqG,EAAK,QAASw/B,GAInBj7B,EAAQy7B,KACHhgC,EAAK,cACHuE,EAAQ07B,OACVjgC,EAAK,gBACHuE,EAAQ27B,SACVlgC,EAAK,kBACHuE,EAAQ47B,SACVngC,EAAK,kBACHuE,EAAQ67B,YACVpgC,EAAK,0BAEZ,EAIG,SAASqgC,EAAqBrgC,EAAcP,EAAgBN,GACjE,GAAKA,IAAUszB,EAAShzB,GAIxB,OAAIN,EAAOi9B,OACFp8B,EAAK,YAGPsgC,EAAAA,EAAAA,IAAuBnhC,GAGzB,SAASohC,EACdC,EACAlO,GAGA,IAFAmO,EAEA,wDADAC,EACA,uCACA,OAAOjT,EAAAA,EAAAA,IAAQ+S,GAAUnhC,IACvB,MAAMmD,EAAO8vB,EAAUjzB,GACvB,IAAKmD,EACH,OAAO,EAGT,IAAIm+B,EAAW,EAcf,OAZIn+B,EAAKo6B,cACP+D,GAAYn+B,EAAKo6B,YAAYgE,MAG3BH,GAA4Bj+B,EAAKq+B,aACnCF,GAAYlF,GAGViF,GAAeA,EAAYv/B,SAAS9B,KACtCshC,EAAW3oC,KAAKC,MAAQyjC,GAAwBgF,EAAY/mC,OAAS+mC,EAAYniC,QAAQc,KAGpFshC,IACN,QAGE,SAASG,EACd9gC,EACAwgC,EACAlO,EACAhmB,EACA0kB,GAEA,IAAK1kB,EACH,OAAOk0B,EAGT,MAAMO,GAAcC,EAAAA,EAAAA,GAA4B10B,GAEhD,OAAOk0B,EAAQ7+B,QAAQtC,IACrB,MAAMmD,EAAO8vB,EAAUjzB,GACvB,QAAKmD,GAIEu+B,EAAYt+B,EAAazC,EAAMwC,OAAMtB,EAAW7B,IAAO2xB,S,ukCC/VlE,MAAMlqB,EAAU,IAAI/H,OAAOgI,EAAAA,GAAkB,KAItC,SAASk6B,EAAc9qC,GAC5B,MAAM,OAAEsJ,EAAF,GAAUJ,GAAOlJ,EAEvB,OAGK,SAAyBsJ,EAAgByhC,GAC9C,MAAQ,MAAKzhC,KAAUyhC,IAJhBC,CAAgB1hC,EAAQJ,GAO1B,SAAS+hC,EAAgBta,GAC9B,MAAMprB,EAAQorB,EAAIprB,MAAM,qBAExB,MAAO,CAAE+D,OAAQ/D,EAAM,GAAI/F,UAAWw4B,OAAOzyB,EAAM,KAG9C,SAAS2lC,EAAqBlrC,GACnC,OAAOA,EAAQmrC,iBAAmBnrC,EAAQkJ,GAGrC,SAASoE,EAAetN,GAC7B,MAAM,KACJgG,EADI,QACEolC,EADF,MACWxO,EADX,MACkByO,EADlB,MACyBC,EADzB,MACgCC,EADhC,SACuCvjC,EADvC,KACiDwjC,EADjD,QACuDC,EADvD,QACgEC,EADhE,QACyE5/B,GAC3E9L,EAAQuG,QAEZ,OAAIP,EACKA,EAAKA,KAGVolC,GAAWxO,GAASyO,GAASC,GAASC,GAASvjC,GAAY0jC,GAAWF,GAAQC,GAAW3/B,OAA7F,EAIOmX,EAAAA,GAGF,SAAS0oB,EAAsB3rC,GACpC,MAAM,KACJgG,EADI,QACEolC,EADF,MACWxO,EADX,MACkByO,EADlB,MACyBC,EADzB,MACgCC,EADhC,SACuCvjC,EADvC,KACiDwjC,EADjD,QACuDC,EADvD,QACgEC,GAClE1rC,EAAQuG,QAEZ,SAAI6kC,GAAYC,MAAAA,GAAAA,EAAOO,aAIlB5lC,GAAQ42B,GAASyO,GAASC,GAASC,GAASvjC,GAAYwjC,GAAQC,GAAWC,MAKzEG,EAAAA,EAAAA,GAAqB7lC,EAAKA,QAAS,GAGrC,SAAS8lC,EAAsB9rC,GACpC,MAAM,KAAEgG,GAAShG,EAAQuG,QACzB,GAAMP,GAAQA,EAAKA,KAAKxC,QAAU,GAIK,IAAnCmoC,EAAsB3rC,GAI1B,OAAOgG,EAAKA,KAGP,SAAS+lC,EAAsB/rC,GACpC,MAAM,KAAEgG,GAAShG,EAAQuG,QAEzB,IAAIhB,EACJ,GAAIS,MAAAA,GAAAA,EAAMoH,SAAU,CAClB,IAAI4+B,EAAOhmC,EAAKoH,SAAS6+B,MAAM36B,GAAWA,EAAOlS,OAASkD,EAAAA,GAAAA,UAK1D,GAJI0pC,IACFzmC,EAAQymC,EAAK9mC,IAAKK,MAAMoL,KAGrBpL,IACHymC,EAAOhmC,EAAKoH,SAAS6+B,MAAM36B,GAAWA,EAAOlS,OAASkD,EAAAA,GAAAA,MAClD0pC,GAAM,CACR,MAAM,OAAEn4B,EAAF,OAAUrQ,GAAWwoC,EAC3BzmC,EAAQS,EAAKA,KAAK0G,UAAUmH,EAAQA,EAASrQ,GAAQ+B,MAAMoL,IASjE,IAJKpL,GAASS,IACZT,EAAQS,EAAKA,KAAKT,MAAMoL,IAGrBpL,EAIL,MAAO,CACLL,IAAKK,EAAM,GACXC,OAAQD,EAAM,IAkBX,SAAS2mC,EAAalsC,GAC3B,OAAOA,EAAQmsC,WAGV,SAASC,EAAepsC,GAC7B,OAAOwI,QAAQxI,EAAQqsC,kBAGlB,SAASC,EAAmBtsC,GACjC,OAAOwI,QAAQxI,EAAQusC,aAGlB,SAASC,EAAgBxsC,GAC9B,OAAOwI,QAAQxI,EAAQuG,QAAQ6D,QAG1B,SAASqiC,EAA6BzsC,GAC3C,OAAOA,EAAQsJ,SAAW6Z,EAAAA,IAAiCngB,KAAKoP,MAAMpS,EAAQkJ,MAAQlJ,EAAQkJ,GAGzF,SAASwjC,EAAsB1sC,GACpC,OAAOwI,QAAQxI,EAAQ2sC,aAAcrQ,EAAAA,EAAAA,IAASt8B,EAAQ2sC,WAAcT,EAAalsC,GAG5E,SAAS4sC,EAAe/iC,EAAcb,GAC3C,OAAOszB,EAAAA,EAAAA,IAAStzB,EAAOE,KAAMiD,EAAAA,EAAAA,IAAgBnD,IAAqBsD,EAAAA,EAAAA,GAAazC,EAAMb,GAGhF,SAAS6jC,EAAgB7sC,GAC9B,OAAKA,EAAQ8sC,aAImB,8BAAzB9sC,EAAQ8sC,aAA+C,SAAW,UAHhE,YAMJ,SAASC,EAAe/sC,GAC7B,OAAOA,EAAQkJ,IAAMiY,EAAAA,GAGhB,SAAS6rB,EAAsBhtC,GACpC,OAAOA,EAAQuG,QAAQ6D,QAA0C,iBAAhCpK,EAAQuG,QAAQ6D,OAAOhL,KAGnD,SAAS6tC,EAA0BjtC,GACxC,MAAM,QAAEuG,GAAYvG,EAEdqrC,EAAQ9kC,EAAQklC,QAAUllC,EAAQklC,QAAQJ,MAAQ9kC,EAAQ8kC,MAC1DzO,EAAQr2B,EAAQklC,QAAUllC,EAAQklC,QAAQ7O,MAAQr2B,EAAQq2B,MAC1D50B,EAAWzB,EAAQklC,QAAUllC,EAAQklC,QAAQzjC,SAAWzB,EAAQyB,SACtE,GAAIA,EACF,OAAOA,EAASC,SAGlB,GAAIojC,EACF,OAAOA,EAAMpjC,SAGf,GAAI1B,EAAQ6kC,QAAS,CACnB,MAAM9iC,EAAY/B,EAAQ6kC,QAAQ8B,SAAW,MAAQ3mC,EAAQ6kC,QAAQ+B,MACjE,QAASC,EAAAA,EAAAA,MAAoB,OAAS,MAC1C,MAAQ,GAAE7mC,EAAQ6kC,QAAQliC,MAAMZ,IAGlC,GAAI/B,EAAQ+kC,MACV,OAAO/kC,EAAQ+kC,MAAMrjC,SAGvB,MAAMolC,EAAevC,EAAc9qC,GAEnC,OAAI48B,EACM,GAAEyQ,QAGR9mC,EAAQglC,MACH+B,EAAAA,GAAqB,GAAED,QAAsB,GAAEA,QAGjDA,EAGF,SAASE,EAAkBC,GAChC,OAAQA,EAAUC,QAAQ9/B,MAAMua,GAAMA,EAAEwlB,MAAQ,I,cC/MlD,MAAMC,EAAgB,CAAC,IAAK,IAAK,IAAK,KACzBlgC,EAA2B,GAEjC,SAAS1B,EACdlC,EACA7J,GAGA,IAFAwN,EAEA,wDADAL,EACA,uDADiBM,EAEjB,MAAMG,GAASJ,GAAWK,EAAuB7N,GAC3C8N,EAAiBF,EAAS,GAAEA,KAAW,GACvC5H,GAAOkG,EAAAA,EAAAA,GAAS0hC,EAA2B5tC,GAAUmN,GACrDY,EAAcC,EAA6BnE,EAAM7J,EAASgG,GAEhE,MAAQ,GAAE8H,IAAiBC,IAGtB,SAAS6/B,EAA2B5tC,GACzC,MAAMgG,EAAOsH,EAAetN,GAC5B,IAAKgG,EACH,OAGF,MAAM,SAAEoH,GAAapN,EAAQuG,QAAQP,MAAQ,GAC7C,OAAKoH,MAAAA,GAAAA,EAAU5J,OAIR4J,EAASmB,QAAO,CAACs/B,EAAD,KAAuC,IAA7B,KAAEzuC,EAAF,OAAQyU,EAAR,OAAgBrQ,GAAa,EAC5D,GAAIpE,IAASkD,EAAAA,GAAAA,QACX,OAAOurC,EAGT,MAAMC,EA+FH,SAAgCtqC,GACrC,OAAO,IAAImJ,MAAMnJ,GACduqC,UAAKhjC,GACLO,KAAI,IAAMqiC,EAAc3qC,KAAKC,MAAMD,KAAKgrC,SAAWL,EAAcnqC,WACjEuB,KAAK,IAnGUkpC,CAAuBzqC,GAGvC,MAAQ,GAAEqqC,EAAQ75B,OAAO,EAAGH,KAAUi6B,IAAUD,EAAQ75B,OAAOH,EAASrQ,EAAQqqC,EAAQrqC,YACvFwC,GAZMA,EAeJ,SAAS6H,EAAuB7N,GACrC,MAAM,MACJ48B,EADI,MACGyO,EADH,MACUC,EADV,MACiBC,EADjB,SACwBvjC,EADxB,QACkCojC,EADlC,KAC2CI,GAC7CxrC,EAAQuG,QAEZ,OAAIvG,EAAQkuC,WAAatR,EAChB,KAGLyO,EACK,KAGLD,EACKA,EAAQx9B,MAGb09B,EACK,KAGLC,EACK,KAGLvjC,EACK,KAGLwjC,EACK,UADT,EAOK,SAASx9B,EAA6BnE,EAAc7J,EAAqBmuC,GAC9E,MAAM,KACJnoC,EADI,MACE42B,EADF,MACSyO,EADT,MACgBC,EADhB,MACuBC,EADvB,SAC8BvjC,EAD9B,QACwCojC,EADxC,QACiDM,EADjD,KAC0DF,EAD1D,QACgE1/B,GAClE9L,EAAQuG,QAEZ,OAAIvG,EAAQkuC,UACHC,GAAiBtkC,EAAK,oBAG3B+yB,EACKuR,GAAiBtkC,EAAK,eAG3BwhC,EACK8C,GAAiBtkC,EAAKwhC,EAAM8B,MAAQ,YAAc,eAGvD/B,EACKvhC,EAAK,iBAAiB+B,OAG3B0/B,EAsCN,SAAgCtrC,GAC9B,MAAM,MAAEsrC,EAAF,KAAStlC,GAAShG,EAAQuG,QAEhC,OAAQ+kC,GAAS,CAACA,EAAMjkC,MAAOikC,EAAM8C,WAAW5iC,OAAOhD,SAASzD,KAAK,SAAYiB,MAAAA,OAA1E,EAA0EA,EAAMA,MAxC9EqoC,CAAuBruC,IAAY6J,EAAK,eAG7C0hC,EACK4C,GAAiBtkC,EAAK,eAG3B7B,EACKmmC,GAAiBnmC,EAASC,SAG/ByjC,EACK7hC,EAAK,iBAGV2hC,EACKA,EAAK8C,QAAQC,SAGlBziC,EACK,UAGL9F,EACKmoC,EAGFlrB,EAAAA,G,cCrHF,SAASurB,EAAkBxuC,GAChC,OAAOA,EAAQuG,QAGV,SAASkoC,EAAgBzuC,GAC9B,OAAOwI,QACLkmC,EAAgB1uC,IACb2uC,EAAgB3uC,IAChB4uC,EAAmB5uC,IACnB6uC,EAAkB7uC,IAqDlB,SAA2BA,GAChC,OAAOA,EAAQuG,QAAQmlC,QArDlBoD,CAAkB9uC,IAClB+uC,EAAe/uC,IACfgvC,EAAiBhvC,IACjBivC,EAAgBjvC,IAChBkvC,EAAgBlvC,IAIhB,SAAS0uC,EAAgB1uC,GAC9B,OAAOA,EAAQuG,QAAQq2B,MAGlB,SAAS+R,EAAgB3uC,GAC9B,OAAOA,EAAQuG,QAAQ8kC,MAGlB,SAAS8D,EAAqBnvC,GACnC,MAAM,MAAEqrC,GAAUrrC,EAAQuG,QAE1B,OAAO8kC,MAAAA,GAAAA,EAAOO,QAAUP,OAAQtgC,EAG3B,SAASikC,EAAiBhvC,GAC/B,OAAOA,EAAQuG,QAAQ6D,OAGlB,SAAS6kC,EAAgBjvC,GAC9B,OAAOA,EAAQuG,QAAQ+kC,MAGlB,SAAS4D,EAAgBlvC,GAC9B,OAAOA,EAAQuG,QAAQglC,MAGlB,SAASsD,EAAkB7uC,GAChC,OAAOA,EAAQuG,QAAQ6kC,QAGlB,SAASwD,EAAmB5uC,GACjC,OAAOA,EAAQuG,QAAQyB,SAGlB,SAASonC,EAAuBpvC,GACrC,MAAMgI,EAAW4mC,EAAmB5uC,GACpC,OAAOgI,EAAkC,UAAvBA,EAASqnC,eAAwBtkC,EAG9C,SAASukC,EAAuBtvC,GACrC,MAAMgI,EAAW4mC,EAAmB5uC,GACpC,OAAOgI,EAAkC,UAAvBA,EAASqnC,eAAwBtkC,EAO9C,SAASgkC,EAAe/uC,GAC7B,OAAOA,EAAQuG,QAAQilC,KAGlB,SAAS+D,EAAkBvvC,GAChC,OAAOA,EAAQuG,QAAQuF,QAGlB,SAAS0jC,EAAkBxvC,GAChC,OAAOA,EAAQuG,QAAQklC,QAGlB,SAASgE,EAAuBzvC,GAAqB,MAC1D,iBAAOwvC,EAAkBxvC,UAAzB,aAAO,EAA4B48B,MAO9B,SAAS8S,EAAuB1vC,GAA2C,MAChF,iBAAOwvC,EAAkBxvC,UAAzB,aAAO,EAA4BqrC,MAkB9B,SAASsE,GAA4B3vC,GAAqB,MAC/D,iBAhBK,SAAkCA,GACvC,MAAM4vC,EAAQlB,EAAgB1uC,IACzB2uC,EAAgB3uC,IAChB4uC,EAAmB5uC,IACnB6uC,EAAkB7uC,IAClByvC,EAAuBzvC,IACvB0vC,EAAuB1vC,GAE5B,GAAK4vC,EAIL,OAAOA,EAAMlnC,UAINmnC,CAAyB7vC,UAAhC,aAAO,EAAmC8vC,QAGrC,SAASC,GACd/vC,EACAsH,GAEA,MAAM,MACJs1B,EADI,MACGyO,EADH,QACUD,EADV,MACmBE,EADnB,MAC0BC,EAD1B,SACiCvjC,GACnChI,EAAQuG,QACNypC,EAAeP,EAAuBzvC,GACtCiwC,EAAeP,EAAuB1vC,GAEtCkwC,EAAe7E,GAAS4E,EACxBE,EAAevT,GAASoT,EAE9B,KAAMG,GAAgBD,GAAgB9E,GAAWE,GAASC,GAASvjC,GACjE,OAGF,MAAMooC,GAAWD,GAAgBD,GAAgB9E,GAAWE,GAASC,GAASvjC,GAAWkB,GACnFzG,EAAQ,GAAEqoC,EAAc9qC,KAAWowC,EAAW,IAAGA,IAAY,KAEnE,GAAIF,EACF,OAAQ5oC,GACN,IAAK,QACL,IAAK,YAIL,IAAK,gBACH,MAAQ,GAAE7E,WAHZ,IAAK,SACH,OAAQ4tC,GAAuBrwC,QAAyD+K,EAA9CulC,GAAwBJ,EAAcztC,GAGlF,IAAK,aACH,OAAO6tC,GAAwBJ,EAAcztC,GAC/C,IAAK,WACH,MAAQ,GAAEA,aAIhB,GAAI0tC,EACF,OAAQ7oC,GACN,IAAK,QACL,IAAK,YACH,MAAQ,GAAE7E,WACZ,IAAK,SACH,OAAQ4tC,GAAuBrwC,QAA8B+K,EAAlB,GAAEtI,WAC/C,IAAK,gBACH,MAAQ,GAAEA,WACZ,IAAK,aACL,IAAK,WACH,MAAQ,GAAEA,WAIhB,GAAIuF,EACF,OAAQV,GACN,IAAK,QACL,IAAK,YACL,IAAK,SACL,IAAK,gBACH,KAAKiB,EAAAA,EAAAA,IAAsBP,IAAaqoC,GAAuBrwC,GAC7D,OAGF,MAAQ,GAAEyC,WACZ,IAAK,aACL,IAAK,WACH,OAAOA,EAIb,GAAI2oC,EACF,OAAQ9jC,GACN,IAAK,QACH,OACF,IAAK,YACH,MAAQ,GAAE7E,WACZ,IAAK,SACH,OAAOA,EACT,IAAK,WACH,MAAQ,GAAEA,aAIhB,GAAI6oC,EACF,OAAQhkC,GACN,IAAK,QACL,IAAK,YACH,OAAOipC,GAAiBjF,GAAU,GAAE7oC,gBAAgBsI,EACtD,IAAK,SACH,OAAOulC,GAAwBhF,EAAO7oC,GACxC,IAAK,WACH,MAAQ,GAAEA,aAIhB,GAAI8oC,EACF,OAAQjkC,GACN,IAAK,QACL,IAAK,YACH,OACF,IAAK,SACH,OAAO7E,EACT,IAAK,WACH,MAAQ,GAAEA,cAOlB,SAAS6tC,GAAwBV,EAA4BntC,GAC3D,OAAI+tC,EAAAA,IAA4BzL,EAAAA,GACtB,GAAEtiC,cAAiBmtC,EAAMvgC,iBAAiBugC,EAAM1nC,WAGnDzF,EAGF,SAAS8tC,GAAiBX,GAC/B,OAAOA,EAAMa,gBAAkBb,EAAMa,eAAejtC,OAAS,EAGxD,SAASktC,GACd1wC,EAAqBsH,GAErB,MAAM,QACJ8jC,EADI,MACKC,EADL,MACYC,EADZ,MACmBC,GACrBvrC,EAAQuG,QAENoqC,EAAYtF,GAASqE,EAAuB1vC,GAElD,OAAIorC,GAAsB,WAAX9jC,GAAuB8jC,EAAQ8B,SACrC7qC,EAAAA,GAAAA,OACEsuC,GAAaH,EAAAA,KACX,eAAXlpC,GAAsC,WAAXA,GAEpBjF,EAAAA,GAAAA,YACEipC,GAASC,EAEdA,IAAU+B,EAAAA,GACLjrC,EAAAA,GAAAA,QAGFA,EAAAA,GAAAA,YAGFA,EAAAA,GAAAA,QAGF,SAASuuC,GAAmB5wC,GACjC,MAAM,MACJ48B,EADI,MACGyO,EADH,SACUrjC,GACZhI,EAAQuG,QACNypC,EAAeP,EAAuBzvC,GACtCiwC,EAAeP,EAAuB1vC,GAE5C,GAAI48B,GAASoT,EACX,MAAQ,QAAOhwC,EAAQyqC,YAGzB,MAAM,SAAExiC,GAAaojC,GAAS4E,GAAgBjoC,GAAY,GAE1D,OAAOC,EAGF,SAAS4oC,GAAmB7wC,GACjC,MAAM,MAAEqrC,EAAF,SAASrjC,GAAahI,EAAQuG,QAC9B0pC,EAAeP,EAAuB1vC,IACtC,KAAEqP,GAASg8B,GAAS4E,GAAgBjoC,GAAY,GAEtD,OAAOqH,EAGF,SAASghC,GAAuBrwC,GACrC,MAAM,MAAE48B,EAAF,MAASyO,EAAT,SAAgBrjC,GAAahI,EAAQuG,QAE3C,OAAQq2B,MAAAA,OAAD,EAACA,EAAOkU,WAAazF,MAAAA,OAArB,EAAqBA,EAAOyF,WAAa9oC,MAAAA,OAAzC,EAAyCA,EAAUS,gBAGrD,SAASsoC,GACdC,EAAsCC,GACtC,IAD2DC,EAC3D,wDACA,OAAOC,GAAqBH,EAAUC,EAAWC,EAAoB,QAAU,eAG1E,SAASE,GAAuBxU,GACrC,OACEA,EAAMyU,MAAMpF,MAAM58B,GAAuB,MAAdA,EAAKjQ,QAC7Bw9B,EAAMyU,MAAMpF,MAAM58B,GAAuB,MAAdA,EAAKjQ,QAChCkyC,GAAyB1U,GAIzB,SAAS0U,GAAyB1U,GACvC,OACEA,EAAMyU,MAAMpF,MAAM58B,GAAuB,MAAdA,EAAKjQ,QAC7Bw9B,EAAMyU,MAAMpF,MAAM58B,GAAuB,MAAdA,EAAKjQ,QAChCw9B,EAAMyU,MAAMpF,MAAM58B,GAAuB,MAAdA,EAAKjQ,QAChCw9B,EAAMl0B,UAIN,SAAS6oC,GAAmBlG,GACjC,GAAIA,EAAMmG,OAASnG,EAAMoG,OACvB,OAAOpG,EAMJ,SAASqG,GAAsB1xC,EAAqBg9B,GAAyC,IAAtB2U,EAAsB,wDAClG,MAAMC,EAAc7E,EAAe/sC,GAC7B6xC,EAAiBD,GAAeD,EAChCG,EAAmB9Z,OAAOgF,GAEhC,MAAO,CACL4U,YAAAA,EAAaC,eAAAA,EAAgBC,iBAAAA,GAI1B,SAASX,GACdH,EAAsCe,EAAsBC,GAE5D,IAAIC,EAEJ,OAAQD,GACN,IAAK,QACHC,EAAajyC,IACX,MAAMqrC,EAAQsD,EAAgB3uC,GAC9B,OAAO0uC,EAAgB1uC,IAAaqrC,IAAUA,EAAMO,UAAYP,EAAM8B,OAExE,MAEF,IAAK,YACH8E,EAAYrD,EACZ,MAEF,IAAK,QACHqD,EAAajyC,GAAwBwvC,EAAkBxvC,IFlPtD,SAAgCA,GACrC,MAAM,KAAEgG,GAAShG,EAAQuG,QACnBhB,EAAQS,GAAQA,EAAKA,KAAKT,MAAMoL,GAEtC,GAAKpL,EAIL,MAAO,CACLL,IAAKK,EAAM,GACXC,OAAQD,EAAM,IEwOuD2sC,CAAuBlyC,GAC1F,MAEF,IAAK,QACHiyC,EAAYhD,EACZ,MAEF,IAAK,QACHgD,EAAajyC,IACX,MAAMqrC,EAAQsD,EAAgB3uC,GAC9B,OAAOkvC,EAAgBlvC,IAAaqrC,GAASA,EAAMO,SAErD,MAEF,IAAK,cACHqG,EAAajyC,IACX,MAAMqrC,EAAQsD,EAAgB3uC,GAC9B,OACE0uC,EAAgB1uC,IACZqrC,IAAUA,EAAMO,UAAYP,EAAM8B,OACnCiC,EAAuBpvC,IACvBsvC,EAAuBtvC,IAG9B,MAEF,QACE,MAAO,GAGX,OAAO+xC,EAAWxjC,QAAO,CAACW,EAAQ1P,KAC5BwxC,EAASxxC,IAAcyyC,EAAUjB,EAASxxC,KAC5C0P,EAAO1K,KAAKhF,GAGP0P,IACN,IAGE,SAASijC,GAAiBnyC,GAC/B,MAAM,MAAEsrC,EAAF,MAASC,EAAT,MAAgBF,GAAUmD,EAAkBxuC,GAC5C4vC,EAAQtE,GAASC,GAASF,GAASqE,EAAuB1vC,GAChE,GAAK4vC,EAIL,OAAOA,EAAMtqB,SCvZR,SAAS8sB,GAAmB9oC,EAAgB29B,GACjD,MAAQ,GAAE39B,KAAU29B,ICCtB,MAAMoL,GAA+C,CACnDC,4BAA6B,CAC3BC,MAAO,aACPvyC,QAAS,yBAEXwyC,eAAgB,CACdD,MAAO,aACPvyC,QAAS,yBAEXyyC,OAAQ,CACNF,MAAO,aACPvyC,QAAS,yBAEX0yC,SAAU,CACRH,MAAO,SACPvyC,QAAS,kBAEX2yC,UAAW,CACTJ,MAAO,SACPvyC,QAAS,mBAEX4yC,oBAAqB,CACnBL,MAAO,SACPvyC,QAAS,kBAEX6yC,qBAAsB,CACpBN,MAAO,SACPvyC,QAAS,mBAEX8yC,IAAK,CACHP,MAAO,MACPvyC,QAAS,iBAEX+yC,YAAa,CACXR,MAAO,MACPvyC,QAAS,kBAIN,SAASgzC,GAAevzC,GAK7B,MAAQO,QAAS+N,EAAX,KAAwB5C,EAAxB,MAA8B8nC,GAAUxzC,GACxC,MAAE8yC,EAAF,QAASvyC,GAAYizC,EAAQZ,GAAcY,GAASZ,GAAclnC,GAExE,MAAO,CAAEonC,MAAAA,EAAOvyC,QAAAA,EAAS+N,YAAAA,K,+KCxC3B,MAAMmlC,EAAkB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAEpC,SAAS/I,EAAuB5+B,GACrC,GAAKA,EAIL,OAAQA,EAAKnM,MACX,IAAK,cACL,IAAK,kBACH,OAAOmM,EAAKkvB,WAAalvB,EAAKmvB,SAGhC,IAAK,kBACL,IAAK,kBACH,MAAO,UAGT,QACE,QAIC,SAASvuB,EAAgBZ,GAC9B,GAAKA,EAAL,CAIA,GAAI4nC,EAAc5nC,GAChB,MAAO,kBAGT,OAAQA,EAAKnM,MACX,IAAK,cACL,IAAK,kBACH,GAAImM,EAAKkvB,WAAalvB,EAAKmvB,SACzB,MAAQ,GAAEnvB,EAAKkvB,aAAalvB,EAAKmvB,WAGnC,GAAInvB,EAAKkvB,UACP,OAAOlvB,EAAKkvB,UAGd,GAAIlvB,EAAKmvB,SACP,OAAOnvB,EAAKmvB,SAGd,MAGF,IAAK,kBACL,IAAK,kBACH,MAAO,oBAON,SAAS0Y,EACdvpC,EAAc0B,EAAe8nC,EAAuCzU,GAEpE,GAAIrzB,EAAKrC,KAAOia,EAAAA,GACd,OAAOtZ,EAAK,wBAAwB0G,cAGtC,GAAIhF,EAAKnM,MAAsB,gBAAdmM,EAAKnM,KACpB,OAAOyK,EAAK,OAGd,IAAKwpC,EACH,MAAO,GAGT,OAAQA,EAAWj0C,MACjB,IAAK,kBACH,OAAOyK,EAAK,gBAGd,IAAK,sBACH,OAAOA,EAAK,gBAGd,IAAK,qBACH,OAAOA,EAAK,eAGd,IAAK,oBAAqB,CACxB,MAAM,UAAEypC,GAAcD,EAEtB,IAAKC,EAAW,OAAOzpC,EAAK,oBAE5B,MAAM/H,EAAM,IAAID,MAAK,IAAIA,MAAO0xC,UAA+B,IAAnB3U,GACtC4U,EAAgB,IAAI3xC,KAAiB,IAAZyxC,GAE/B,GAAIE,GAAiB1xC,EACnB,OAAO+H,EAAK,oBAGd,MAAM4pC,EAAO,IAAI5xC,KAAKC,EAAIyxC,UAAYC,EAAcD,WAGpD,GAAIE,EAAKF,UAAY,IAAO,GAC1B,OAAO1pC,EAAK,oBAId,GAAI4pC,EAAKF,UAAY,IAAO,KAE1B,OAAO1pC,EAAK,sBADI7G,KAAKC,MAAMwwC,EAAKF,UAAY,IAAO,KAKrD,MAAMG,EAAQ,IAAI7xC,KAGlB,GAFA6xC,EAAMC,SAAS,EAAG,EAAG,EAAG,GAEpBH,EADgB,IAAI3xC,KAAK6xC,EAAMH,UAA+B,IAAnB3U,GAG7C,OAAI6U,EAAKF,UAAY,IAAO,MAEnB1pC,EAAK,oBADE7G,KAAKC,MAAMwwC,EAAKF,UAAY,IAAO,GAAK,KAKjD1pC,EAAK,oBAAoBq+B,EAAAA,EAAAA,IAAWr+B,EAAM2pC,IAInD,MAAMI,EAAY,IAAI/xC,KAItB,OAHA+xC,EAAUC,QAAQ/xC,EAAIgyC,UAAY,GAClCF,EAAUD,SAAS,EAAG,EAAG,EAAG,GAExBH,EADoB,IAAI3xC,KAAK+xC,EAAUL,UAA+B,IAAnB3U,GAE9C/0B,EAAK,wBAAwBq+B,EAAAA,EAAAA,IAAWr+B,EAAM2pC,IAGhD3pC,EAAK,mBAAmBkqC,EAAAA,EAAAA,IAAelqC,EAAM2pC,IAGtD,IAAK,mBACH,OAAO3pC,EAAK,UAGd,IAAK,qBACH,OAAOA,EAAK,UAGd,QACE,QAIC,SAASmqC,EAAazoC,EAAe8nC,GAC1C,MAAM,GAAEnqC,EAAF,KAAM9J,GAASmM,EAErB,QAAK8nC,GAIDnqC,IAAOia,EAAAA,IAIgB,qBAApBkwB,EAAWj0C,MAAwC,gBAATA,EAG5C,SAAS+zC,EAAc5nC,GAC5B,OAAIA,EAAK0oC,UAA0B,gBAAd1oC,EAAKnM,MAA0BmM,EAAKrC,KAAOia,EAAAA,KAI3C,oBAAd5X,EAAKnM,MACO,oBAAdmM,EAAKnM,MAGL,SAAS80C,EAAU3oC,GACxB,MAAqB,gBAAdA,EAAKnM,KAGP,SAAS+0C,EAAiB5oC,GAC/B,OAAQA,EAAK6oC,YAAcF,EAAU3oC,GAGhC,SAAS8oC,EACdC,EACArY,EACAsY,EACAhK,GAEA,IADA3L,EACA,uDADmB,EAEnB,OAAOtH,EAAAA,EAAAA,IAAQgd,GAAUprC,IACvB,MAAMpH,GAAM0yC,EAAAA,EAAAA,GAAc5V,GAE1B,GAAI2L,GAAeA,EAAYv/B,SAAS9B,GAItC,OAAOpH,EAAO,QAAiByoC,EAAY/mC,OAAS+mC,EAAYniC,QAAQc,IAG1E,MAAMqC,EAAO0wB,EAAU/yB,GACjBmqC,EAAakB,EAAiBrrC,GACpC,IAAKqC,IAAS8nC,EACZ,OAAO,EAGT,GAAwB,qBAApBA,EAAWj0C,KACb,OAAOi0C,EAAWoB,QACb,GAAwB,sBAApBpB,EAAWj0C,MAAgCi0C,EAAWC,UAC/D,OAAOD,EAAWC,UAGpB,OAAQD,EAAWj0C,MACjB,IAAK,qBACH,OAAO0C,EAAM,MACf,IAAK,qBACH,OAAOA,EAAM,OACf,IAAK,sBACH,OAAOA,EAAM,QACf,QACE,OAAO,KAEV,QAGE,SAAS4yC,EACdJ,EACArY,EACA9lB,EACA0kB,EACA8Z,GAEA,IAAKx+B,EACH,OAAOm+B,EAGT,MAAM1J,GAAcC,EAAAA,EAAAA,GAA4B10B,GAEhD,OAAOm+B,EAAQ9oC,QAAQtC,IACrB,MAAMqC,EAAO0wB,EAAU/yB,GACvB,IAAKqC,EACH,OAAO,EAGT,MAAM3K,EAAOsI,IAAO2xB,EAAgB8Z,EAAoBxoC,EAAgBZ,GACxE,OAAQ3K,GAAQgqC,EAAYhqC,IAAUgqC,EAAYr/B,EAAK4F,aAIpD,SAASyjC,EAAkB//B,GAEhC,MAAsB,iBAAXA,EACF7R,KAAK6xC,IAAIhgC,GAGX7R,KAAK6xC,IAAI7c,OAAOnjB,IAKlB,SAASigC,EAAgBC,GAC9B,MAAMjoC,EAAQioC,EAAOH,EAAkBG,EAAK7rC,IAAM,EAAI,EAEtD,OAAOgqC,EAAgBpmC,K,0ICzQlB,SAASkoC,EACdp+B,EACAxX,EACA61C,GAEA,MAAO,IACFr+B,EACHslB,MAAO,IACFtlB,EAAOslB,MACVgZ,QAAS,IACJt+B,EAAOslB,MAAMgZ,QAChB,CAAC91C,GAAO61C,KAMT,SAASE,EAAkBv+B,EAAqBxX,EAA6Bg2C,GAClF,MAAQ,CAACh2C,GAAO81C,GAAYt+B,EAAOslB,MAAMgZ,QACnCD,EAASC,MAAAA,GAAAA,EAAS1xC,OACpB4xC,EAAU5pC,QAAQtC,IAAQgsC,EAAQlqC,SAAS9B,KAC3CksC,EAEJ,OAAIF,IAAYD,EAAOzxC,OACdoT,EAGFo+B,EAAmBp+B,EAAQxX,EAAM,IAClC81C,GAAW,MACZD,IAIA,SAASI,EAAaz+B,EAAqB0+B,GAChD,MAAO,IACF1+B,EACHslB,MAAO,IACFtlB,EAAOslB,MACVF,KAAMsZ,IAKL,SAASC,EACd3+B,EAAqBtN,EAAgBksC,EAA8B5Y,GAEnE,MAAM,KAAEZ,GAASplB,EAAOslB,MAElBuZ,EAAcC,EAAe9+B,EAAQtN,EAAQksC,EAAY5Y,GAC/D,OAAK6Y,EAIEJ,EAAaz+B,EAAQ,IACvBolB,EACH,CAAC1yB,GAASmsC,IALH7+B,EASJ,SAASqnB,EAAYrnB,EAAqB0+B,GAC/C,MAAMK,EAAct0C,OAAO6rB,KAAKooB,GAAS/mC,QAAO,CAAC8e,EAA8BnkB,KAC7E,MAAMusC,EAAcC,EAAe9+B,EAAQ1N,EAAIosC,EAAQpsC,IAKvD,OAJIusC,IACFpoB,EAAInkB,GAAMusC,GAGLpoB,IACN,IAOH,OALAzW,EAASy+B,EAAaz+B,EAAQ,IACzBA,EAAOslB,MAAMF,QACb2Z,IAOA,SAASC,EAASh/B,EAAqB0+B,GAC5C,MAAM,KAAEtZ,GAASplB,EAAOslB,MACxB,IAAI2Z,GAAY,EAEhB,MAAMC,EAAYz0C,OAAO6rB,KAAKooB,GAAS/mC,QAAgC,CAAC8e,EAAKnkB,KAC3E,IAAK8yB,EAAK9yB,IAAQ8yB,EAAK9yB,GAAI6sC,QAAUT,EAAQpsC,GAAI6sC,MAAQ,CACvD,MAAMN,EAAcC,EAAe9+B,EAAQ1N,EAAIosC,EAAQpsC,IACnDusC,IACFpoB,EAAInkB,GAAMusC,EACLI,IACHA,GAAY,IAIlB,OAAOxoB,IACN,IAEH,OAAKwoB,EAILj/B,EAASy+B,EAAaz+B,EAAQ,IACzBolB,KACA8Z,IALIl/B,EAYX,SAAS8+B,EACP9+B,EAAqBtN,EAAgBksC,EAA8B5Y,GAEnE,MAAM,KAAEZ,GAASplB,EAAOslB,MAClB7vB,EAAO2vB,EAAK1yB,GACZ0sC,EAAoBR,EAAWO,OAAS1pC,IAASA,EAAK0pC,MACtDN,EAAuB,IACxBppC,KACC2pC,GAAoBC,EAAAA,EAAAA,IAAKT,EAAY,CAAC,QAAS,eAAiBA,KAChE5Y,GAAS,CAAEsZ,OAAQ,CAACtZ,KAAWvwB,EAAK6pC,QAAU,MAGpD,GAAKT,EAAYvsC,IAAOusC,EAAYr2C,KAIpC,OAAOq2C,EAGF,SAASU,EACdv/B,EACAtN,EACAg/B,GAEA,MAAM8N,EAAW9N,IAAahlB,EAAAA,GAAqB,WAAa,SAEhE,IAAI+yB,EAAiBz/B,EAAOslB,MAAMgZ,QA0BlC,OAzBC7zC,OAAO6rB,KAAKmpB,GAAuDxpC,SAASypC,IAC3E,MAAMC,EAAoBF,EAAeC,IAAgB,GACrDA,IAAgBF,GAAaG,EAAkBvrC,SAAS1B,GAKjDgtC,IAAgBF,GAAYG,EAAkBvrC,SAAS1B,KAChE+sC,EAAiB,IACZA,EACH,CAACC,GAAcC,EAAkB/qC,QAAQtC,GAAOA,IAAOI,MAPzD+sC,EAAiB,IACZA,EACH,CAACC,GAAc,IAAIC,EAAmBjtC,OAkBnCisC,EART3+B,EAAS,IACJA,EACHslB,MAAO,IACFtlB,EAAOslB,MACVgZ,QAASmB,IAIe/sC,EAAQ,CAAEg/B,SAAUA,QAAYv9B,IAKvD,SAASyrC,EACd5/B,EACAxX,EACAq3C,GAKA,MAAMC,EAAyB,WAATt3C,EAAoB,MAAQ,WAElD,MAAO,IACFwX,EACHslB,MAAO,IACFtlB,EAAOslB,SACNua,EAAKE,kBAAoB,CAC3BA,iBAAkB,IACb//B,EAAOslB,MAAMya,iBAChB,CAACv3C,GAAOq3C,EAAKE,mBAGjBtY,WAAY,IACPznB,EAAOslB,MAAMmC,WAChB,CAACqY,GAAgBD,EAAKG,gBAExBC,cAAe,IACVjgC,EAAOslB,MAAM2a,cAChB,CAACz3C,IAAO,KAMT,SAAS03C,EAAUlgC,EAAqBmgC,GAC7C,MAAMX,GAAWY,EAAAA,EAAAA,IAAmBpgC,EAAQmgC,GAC5C,IAAKX,EACH,OAAOx/B,EAGT,MAAQ,CAACw/B,GAAWlB,GAAYt+B,EAAOslB,MAAMgZ,QAQ7C,OANIA,IACFt+B,EAASo+B,EAAmBp+B,EAAQw/B,EAAUlB,EAAQ1pC,QAAQyrC,GAAWA,IAAWF,MAG7ExB,EAAW3+B,EAAQmgC,EAAY,CAAE3P,aAAa,M,+zBCjNlD,SAAS8P,EACdtgC,EACAugC,EACAnxB,EACAoxB,EACAC,GAEA,MAAMC,EAAcF,EAAK9rC,KAAKisC,IAC5B,MAAMnrB,EAAWxV,EAAO4gC,SAASC,SAASF,EAAWruC,IACrD,OAAKkjB,EAIE,IACFA,KACAmrB,GALIA,KASX,MAAO,IACF3gC,EACH4gC,SAAU,IACL5gC,EAAO4gC,SACVC,SAAU,IACL7gC,EAAO4gC,SAASC,aAChBzZ,EAAAA,EAAAA,IAAqBsZ,EAAa,OAEvC,CAACH,GAAW,IACPvgC,EAAO4gC,SAASL,GACnBnxB,KAAAA,KAEe,WAAbmxB,EACI,CAAEE,UAAAA,GACF,CAAEK,OAAQN,EAAK9rC,KAAI,QAAC,GAAEpC,GAAH,SAAYA,SAOtC,SAASyuC,EACd/gC,EAAqBghC,EAAsBv4C,GAE3C,MAAMw4C,EAAoBjhC,EAAO4gC,SAASC,SAASG,IAAiB,GAC9DE,EAAYlhC,EAAO4gC,SAASO,MAAML,QAAU,GAClD,IAAIA,EAAmBI,EASvB,OARIz4C,EAAO24C,eAAiBF,IAAcA,EAAU9sC,SAAS4sC,KAC3DF,EAAS,CAACE,KAAiBF,KAGxBr4C,EAAO24C,eAAR,MAAyBF,GAAAA,EAAW9sC,SAAS4sC,KAC/CF,EAASA,EAAOlsC,QAAQtC,GAAOA,IAAO0uC,KAGjC,IACFhhC,EACH4gC,SAAU,IACL5gC,EAAO4gC,SACVO,MAAO,IACFnhC,EAAO4gC,SAASO,MACnBL,OAAAA,GAEFD,SAAU,IACL7gC,EAAO4gC,SAASC,SACnB,CAACG,GAAe,IACXC,KACAx4C,MAON,SAAS44C,EACdrhC,EAAqBshC,EAAgBzK,EAAqB0K,GAE1D,MAAQ1K,QAAS2K,GAAmBxhC,EAAOyhC,KAAKlyB,OAEhD,IAAImyB,EACJ,GAAIJ,IAAUE,EACZE,EAAa7K,MACR,CACL,MAAM8K,EAAa,IAAIvlC,IAAIolC,EAAe9sC,KAAKktC,GAAQA,EAAItvC,MAC3DovC,EAAa,IACRF,KACA3K,EAAQjiC,QAAQgtC,IAASD,EAAW9lC,IAAI+lC,EAAItvC,OAInD,MAAO,IACF0N,EACHyhC,KAAM,IACDzhC,EAAOyhC,KACVlyB,OAAQ,IACHvP,EAAOyhC,KAAKlyB,OACftS,OAAQskC,EACR1K,QAAS6K,KAMV,SAASG,EAAsB7hC,EAAqB2gC,GACzD,MAAO,IACF3gC,EACH8hC,eAAgBnB,GAIb,SAASoB,EACd/hC,EAAqBhJ,EAAegrC,EAA+B5yB,GAEnE,MACM6yB,EAAc,KADEC,EAAAA,EAAAA,IAAuBliC,EAAQhJ,MACVgrC,GAAkB,IACvDG,GAAYC,EAAAA,EAAAA,IAAOH,EAAYvtC,KAAI,QAAC,GAAEpC,GAAH,SAAYA,MAC/C8yB,GAAOgC,EAAAA,EAAAA,IAAqB6a,EAAa,MACzCrB,EAAWuB,EAAUztC,KAAKpC,GAAO8yB,EAAK9yB,KAE5C,MAAO,IACF0N,EACH4gC,SAAU,IACL5gC,EAAO4gC,SACVyB,SAAU,CACRrrC,MAAAA,EACA4pC,SAAAA,EACAxxB,KAAAA,KAMD,SAASkzB,EAAwBtiC,GACtC,MAAM,MAAEhJ,EAAF,SAAS4pC,EAAT,KAAmBxxB,GAASpP,EAAO4gC,SAASyB,UAAY,GAC9D,OAAKrrC,EAIE+qC,EAAuB/hC,EAAQhJ,EAAO4pC,EAAUxxB,GAH9CpP,E,aCrIJ,SAASuiC,EAAaviC,EAAqB0+B,GAChD,MAAO,IACF1+B,EACHmlB,MAAO,IACFnlB,EAAOmlB,MACVC,KAAMsZ,IAKZ,SAAS8D,EAAkBxiC,EAAqByiC,GAC9C,MAAQ/E,QAASgF,GAAmB1iC,EAAO2iC,aAAe,GAE1D,IAAKD,EAAgB,OAAO1iC,EAE5B,MAAM4iC,EAAoBH,EACvB7tC,QAAQD,IAASA,MAAAA,OAAA,EAAAA,EAAM6oC,aAAckF,EAAetuC,SAASO,EAAKrC,MAClEoC,KAAKC,GAASA,EAAKrC,KAEtB,OAAiC,IAA7BswC,EAAkBh2C,OAAqBoT,EAEpC,IACFA,EACH2iC,YAAa,CACXjF,QAAS,IACJkF,KACAF,KAMJ,SAASnc,EAAWvmB,EAAqB/B,EAAgB4kC,GAC9D,MAAM,KAAEzd,GAASplB,EAAOmlB,MAElB2d,EAAcC,EAAe/iC,EAAQ/B,EAAQ4kC,GACnD,OAAKC,EAMEP,EAFPviC,EAASwiC,EAAkBxiC,EAAQ,CAAC8iC,IAER,IACvB1d,EACH,CAACnnB,GAAS6kC,IAPH9iC,EAWJ,SAASgjC,EAAYhjC,EAAqB0+B,GAC/C,MAAMK,EAAct0C,OAAO6rB,KAAKooB,GAAS/mC,QAAO,CAAC8e,EAA8BnkB,KAC7E,MAAMwwC,EAAcC,EAAe/iC,EAAQ1N,EAAIosC,EAAQpsC,IAKvD,OAJIwwC,IACFrsB,EAAInkB,GAAMwwC,GAGLrsB,IACN,IASH,OAFAzW,EAASwiC,EALTxiC,EAASuiC,EAAaviC,EAAQ,IACzBA,EAAOmlB,MAAMC,QACb2Z,IAG8Bt0C,OAAO+rB,OAAOuoB,IAM5C,SAAS5X,EAASnnB,EAAqB0+B,GAC5C,MAAM,KAAEtZ,GAASplB,EAAOmlB,MACxB,IAAI8Z,GAAY,EAEhB,MAAMC,EAAYz0C,OAAO6rB,KAAKooB,GAAS/mC,QAAgC,CAAC8e,EAAKnkB,KAC3E,IAAK8yB,EAAK9yB,IAAQ8yB,EAAK9yB,GAAI6sC,QAAUT,EAAQpsC,GAAI6sC,MAAQ,CACvD,MAAM2D,EAAcC,EAAe/iC,EAAQ1N,EAAIosC,EAAQpsC,IACnDwwC,IACFrsB,EAAInkB,GAAMwwC,EACL7D,IACHA,GAAY,IAIlB,OAAOxoB,IACN,IAEH,OAAKwoB,EASLj/B,EAASwiC,EALTxiC,EAASuiC,EAAaviC,EAAQ,IACzBolB,KACA8Z,IAG8Bz0C,OAAO+rB,OAAO0oB,IARxCl/B,EAcX,SAAS+iC,EAAe/iC,EAAqB/B,EAAgB4kC,GAC3D,MAAM,KAAEzd,GAASplB,EAAOmlB,MAClBxwB,EAAOywB,EAAKnnB,GACZmhC,EAAoByD,EAAW1D,OAASxqC,IAASA,EAAKwqC,MAEtD2D,EAAc,IACfnuC,KACCyqC,GAAoBC,EAAAA,EAAAA,IAAKwD,EAAY,CAAC,QAAS,eAAiBA,GAGtE,GAAKC,EAAYxwC,IAAOwwC,EAAYt6C,KAIpC,OAAOs6C,EAGF,SAASG,EAAcjjC,EAAqB/B,GACjD,MAAM,KAAEmnB,GAASplB,EAAOmlB,OAClB,QAAEuY,GAAY19B,EAAO2iC,aAAe,GAS1C,OAAOJ,EAPPviC,EAAS,IACJA,EACH2iC,YAAa,CACXjF,QAASA,EAAUA,EAAQ9oC,QAAQtC,GAAOA,IAAO2L,IAAUilC,EAAAA,IAInC,IACvB9d,EACH,CAACnnB,GAAS,IACLmnB,EAAKnnB,GACRu/B,eAAWrpC,KAKV,SAASgvC,EACdnjC,EACAojC,GAEA,MAAO,IACFpjC,EACHqjC,WAAY,IACPrjC,EAAOqjC,cACPD,IAKF,SAASE,EACdtjC,EAAqBujC,GAErB,OAAOJ,EAAiBnjC,EAAQ,CAC9BwjC,eAAgBD,IAIb,SAASE,EAAuBzjC,EAAqB/B,EAAgBylC,GAC1E,MAAM,KAAEte,GAASplB,EAAOmlB,MAClBxwB,EAAOywB,EAAKnnB,GAClB,OAAKtJ,GAASA,EAAK6xB,SAIZD,EAAWvmB,EAAQ/B,EAAQ,IAC7BtJ,EACH6xB,SAAU,IACL7xB,EAAK6xB,SACRkd,UAAAA,KAPK1jC,EAYJ,SAAS2jC,EAAoB3jC,EAAqB0+B,GACvD,MAAO,IACF1+B,EACHmlB,MAAO,IACFnlB,EAAOmlB,MACVye,aAAclF,IAMb,SAASmF,EAAgB7jC,EAAqB0+B,GACnD,MAAM,aAAEkF,GAAiB5jC,EAAOmlB,MAE1B/K,EAAU3vB,OAAO6rB,KAAKooB,GAAS9pC,QAAQtC,IAAQsxC,EAAatxC,KAClE,OAAK8nB,EAAQxtB,OAIboT,EAAS2jC,EAAoB3jC,EAAQ,IAChC4jC,MACAE,EAAAA,EAAAA,IAAKpF,EAAStkB,KALVpa,EChMX,MAAM+jC,EAAiB36C,GAAyB,GAAEA,EAAQsJ,UAAUtJ,EAAQkJ,KAErE,SAAS0xC,EACdhkC,EACAojC,GAEA,MAAO,IACFpjC,EACHikC,aAAc,IACTjkC,EAAOikC,gBACPb,IAKF,SAASc,EACdlkC,EACAmkC,GAEA,OAAOH,EAAmBhkC,EAAQ,CAAEmkC,eAAAA,IAG/B,SAASC,EACdpkC,EACAqkC,EACA5c,EACAj/B,EACA87C,GACa,MACb,MAAM,cAAEC,GAAkBvkC,EAAOikC,cAAgB,GAC3CO,EAAuBH,EAAiB1sC,QAAO,CAACW,EAAQlP,KAC5DkP,EAAOyrC,EAAc36C,IAAYA,EAE1BkP,IACN,IACGmsC,EAAkBF,MAAAA,GAAH,UAAGA,EAAgB/7C,UAAnB,aAAG,EAAuBk8C,SAE/C,QAAwBvwC,IAApBswC,GACCh6C,OAAO6rB,KAAKkuB,GAAsBG,OAClCC,GAAUH,EAAgBrwC,SAAS2vC,EAAcS,EAAqBI,OAGzE,OAAOC,EAAiC7kC,EAAQ,CAAEo6B,UAAU,IAG9D,MAAM0K,EAAeL,GAAmB,GAClCM,EAAcV,EAAiB3vC,KAAKtL,GAAY26C,EAAc36C,KAC9Ds7C,EAAW3uC,MAAMivC,UAAUhmC,OAAO8lC,EAAcC,GAChDE,GAAsBnzB,EAAAA,EAAAA,IAAqBgzB,EAAcJ,GAAYI,EAAeJ,EAI1F,OAAOV,EAFPhkC,EAAS6kC,EAAiC7kC,EAAQ,CAAEo6B,UAAU,IAE5B,CAChCmK,cAAe,KACTvkC,EAAOikC,cAAgB,IAAIM,cAC/B,CAAC/7C,GAAO,CACNi/B,WAAAA,EACAyd,aAAcZ,EACdI,SAAUO,MAMX,SAASJ,EACd7kC,EAAqBujC,GAErB,OAAOS,EAAmBhkC,EAAQ,CAChCwjC,eAAgB,IACXxjC,EAAOikC,aAAaT,kBACpBD,K,cCjDT,SAAS4B,EACPnlC,EACAolC,EACAC,GAEA,MAAO,IACFrlC,EACHslC,gBAAiB,CACfC,gBAAiB,IACZvlC,EAAOslC,gBAAgBC,gBAC1B,CAACH,GAAgBC,KAMlB,SAASG,EACdxlC,EACAtN,EACA29B,EACArgB,EACAzQ,GAEA,MAAM6lC,GAAgB5J,EAAAA,EAAAA,IAAmB9oC,EAAQ29B,GAEjD,OAAO8U,EAAuBnlC,EAAQolC,EAAe,IAChDplC,EAAOslC,gBAAgBC,gBAAgBH,GAC1Cp1B,SAAAA,EACAzQ,MAAAA,IAIG,SAASkmC,EACdzlC,EACAtN,EACA29B,EACAqU,EACAjd,EACAyd,GAEA,MAAME,GAAgB5J,EAAAA,EAAAA,IAAmB9oC,EAAQ29B,GAEjD,OAAO8U,EAAuBnlC,EAAQolC,EAAe,IAChDplC,EAAOslC,gBAAgBC,gBAAgBH,GAC1CvO,QAAS,CACP6N,SAAAA,EACAjd,WAAAA,EACAyd,aAAAA,KAKC,SAASQ,EACd1lC,EACAtN,EACA29B,EACA0U,EACAtd,EACAyd,GAEA,MAAME,GAAgB5J,EAAAA,EAAAA,IAAmB9oC,EAAQ29B,IAC3C,QAAEwG,GAAY72B,EAAOslC,gBAAgBC,gBAAgBH,IAAkB,GACvEN,GAAgBjO,MAAAA,OAAD,EAACA,EAAS6N,WAAa,GACtCA,EAAWiB,GAAcvD,EAAAA,EAAAA,IAAOrsC,MAAMivC,UAAUhmC,OAAO8lC,EAAcC,KAG3E,OAAOU,EAA8BzlC,EAAQtN,EAAQ29B,GAFzBve,EAAAA,EAAAA,IAAqBgzB,EAAcJ,GAAYI,EAAeJ,EAENjd,EAAYyd,GAGlG,SAASU,EACP5lC,EACAtN,EACA2yC,GAEA,MAAO,IACFrlC,EACH6lC,iBAAkB,CAChBC,SAAU,IACL9lC,EAAO6lC,iBAAiBC,SAC3B,CAACpzC,GAAS2yC,KAMX,SAASU,EACd/lC,EACAtN,EACAszC,GAEA,OAAOJ,EAAwB5lC,EAAQtN,EAAQ,IAC1CsN,EAAO6lC,iBAAiBC,SAASpzC,GACpCszC,YAAAA,IAyBG,SAASC,EACdjmC,EACAtN,EACAlK,EACAu8C,EACAtd,EACAyd,GAEA,MAAM,cAAEX,GAAkBvkC,EAAO6lC,iBAAiBC,SAASpzC,IAAW,GAChEoyC,EAAeP,MAAAA,GAAAA,EAAgB/7C,GAAQ+7C,EAAc/7C,GAAOk8C,SAAW,GACvEA,EAAWiB,GAAcvD,EAAAA,EAAAA,IAAOrsC,MAAMivC,UAAUhmC,OAAO8lC,EAAcC,KAG3E,OAlCK,SACL/kC,EACAtN,EACAlK,EACAk8C,EACAjd,EACAyd,GAEA,OAAOU,EAAwB5lC,EAAQtN,EAAQ,IAC1CsN,EAAO6lC,iBAAiBC,SAASpzC,GACpC6xC,cAAe,KACTvkC,EAAO6lC,iBAAiBC,SAASpzC,IAAW,IAAI6xC,cACpD,CAAC/7C,GAAO,CACNk8C,SAAAA,EACAjd,WAAAA,EACAyd,aAAAA,MAmBCgB,CAA+BlmC,EAAQtN,EAAQlK,GAF1BspB,EAAAA,EAAAA,IAAqBgzB,EAAcJ,GAAYI,EAAeJ,EAETjd,EAAYyd,GAG/F,SAASS,EAActL,GACrB,OAAOA,EAAU8L,MAAK,CAACC,EAAGC,IAAMA,EAAID,IC7J/B,SAASE,EAAyBtmC,EAAqBomB,GAC5D,MAAO,IACFpmB,EACHumC,WAAY,IACPvmC,EAAOumC,WACVngB,SAAAA,IAKC,SAASogB,EAAiBxmC,EAAqBtN,EAAgBjK,GACpE,MAAO,IACFuX,EACHumC,WAAY,IACPvmC,EAAOumC,WACVT,SAAU,IACL9lC,EAAOumC,WAAWT,SACrB,CAACpzC,GAAS,IACJsN,EAAOumC,WAAWT,SAASpzC,IAAW,MACvCjK,MCfN,SAASy/B,EAAgBloB,EAAqBymC,GACnD,MAAO,IACFzmC,EACH0mB,SAAU,IACL1mB,EAAO0mB,SACV+B,MAAO,IACFzoB,EAAO0mB,SAAS+B,SAChBge,KAMJ,SAASjY,EACdxuB,EAAqB2tB,EAAiB8Y,GAEtC,MAAO,IACFzmC,EACH0mB,SAAU,IACL1mB,EAAO0mB,SACVggB,OAAQ,IACH1mC,EAAO0mB,SAASggB,OACnB,CAAC/Y,GAAQ,IACH3tB,EAAO0mB,SAASggB,OAAO/Y,IAAU,MAClC8Y,MAON,SAASxe,EACdjoB,EAAqB6xB,GAOrB,OALAA,EAAiB57B,SAAS0wC,IACxB,MAAM,OAAEj0C,KAAWk0C,GAAkBD,EACrC3mC,EAAS6mC,EAAmB7mC,EAAQtN,EAAQk0C,MAGvC5mC,EAGF,SAAS6mC,EACd7mC,EAAqB1N,EAAYq0C,GAEjC,MAAO,IACF3mC,EACH0mB,SAAU,IACL1mB,EAAO0mB,SACVmL,iBAAkB,IACb7xB,EAAO0mB,SAASmL,iBACnB,CAACv/B,GAAKq0C,KAMP,SAASre,EACdtoB,EAAqBmoB,EAA6CC,EAAoBC,GAEtF,OAAQF,GACN,IAAK,UACH,OAAOD,EAAgBloB,EAAQ,SACL,IAAbooB,GAA4B,CAAE2J,8BAA+B3J,WACtC,IAAvBC,GAAsC,CAAE8J,8BAA+B9J,KAEtF,IAAK,QACH,OAAOH,EAAgBloB,EAAQ,SACL,IAAbooB,GAA4B,CAAE6J,uBAAwB7J,WAC/B,IAAvBC,GAAsC,CAAEgK,uBAAwBhK,KAE/E,IAAK,YACH,OAAOH,EAAgBloB,EAAQ,SACL,IAAbooB,GAA4B,CAAE4J,2BAA4B5J,WACnC,IAAvBC,GAAsC,CAAE+J,2BAA4B/J,KAGnF,QACE,QAIC,SAASV,EAAkB3nB,EAAqB0nB,GAGrD,OAFA1nB,EAASyjC,EAAuBzjC,EAAQ0nB,GAAW,GAE5C,IACF1nB,EACHsnB,QAAS,IACJtnB,EAAOsnB,QACVC,IAAK,CAACG,KAAc1nB,EAAOsnB,QAAQC,KACnCE,WAAYznB,EAAOsnB,QAAQG,WAAa,IAKvC,SAASG,EAAqB5nB,EAAqB0nB,GAGxD,OAFA1nB,EAASyjC,EAAuBzjC,EAAQ0nB,GAAW,GAE5C,IACF1nB,EACHsnB,QAAS,IACJtnB,EAAOsnB,QACVC,IAAKvnB,EAAOsnB,QAAQC,IAAI3yB,QAAQtC,GAAOA,IAAOo1B,IAC9CD,WAAYznB,EAAOsnB,QAAQG,WAAa,IC5GvC,SAASqf,EACd9mC,EACAvX,GAEA,MAAO,IACFuX,EACH+mC,cAAe,IACV/mC,EAAO+mC,iBACPt+C,ICNF,SAASu+C,EACdhnC,EACAinC,GAEA,MAAO,IACFjnC,EACHknC,QAAS,IACJlnC,EAAOknC,QACVD,gBAAAA,IAKC,SAASE,EAAiBnnC,EAAqB1N,GACpD,MAAO,IACF0N,EACHknC,QAAS,IACJlnC,EAAOknC,QACVE,UAAW90C,IAKV,SAAS+0C,EAAernC,EAAqBsnC,GAClD,MAAO,IACFtnC,EACHknC,QAAS,IACJlnC,EAAOknC,QACVI,KAAAA,IAKC,SAASC,EAAsBvnC,EAAqB5W,GACzD,IAAKA,EAAQuG,UAAYvG,EAAQuG,QAAQuF,QACvC,OAAO8K,EAET,MAAM,MACJvP,EADI,KAEJrB,EAFI,OAGJsE,EAHI,SAIJC,EAJI,OAKJwvB,EALI,SAMJqkB,GACEp+C,EAAQuG,QAAQuF,QACpB,MAAO,IACF8K,EACHknC,QAAS,IACJlnC,EAAOknC,QACVO,eAAgB,CACdh3C,MAAAA,EACArB,KAAAA,EACAo4C,SAAAA,EACA9zC,OAAAA,EACAC,SAAAA,EACAwvB,OAAAA,KAMD,SAASukB,GAAkB1nC,EAAqB2nC,GACrD,MAAO,IACF3nC,EACHknC,QAAS,IACJlnC,EAAOknC,QACVU,kBAAmB,IACdD,KAMJ,SAASE,GAAe7nC,EAAqB8nC,GAClD,MAAO,IACF9nC,EACHknC,QAAS,IACJlnC,EAAOknC,WACPY,IAKF,SAASC,GACd/nC,EACAgoC,EACA5+C,GAEA,IAAK4+C,IAAY5+C,EACf,MAAO,IACF4W,EACHknC,QAAS,IACJlnC,EAAOknC,QACVc,aAAS7zC,IAKf,MAAQe,QAAS+yC,GAAmB7+C,EAAQuG,SACtC,SAAE63C,EAAF,KAAYp4C,EAAZ,MAAkBqB,GAAWw3C,GAAkB,GAErD,MAAO,IACFjoC,EACHknC,QAAS,IACJlnC,EAAOknC,QACVc,QAAS,IACJA,EACHR,SAAAA,EACAp4C,KAAAA,EACAqB,MAAAA,KAMD,SAASy3C,GAAaloC,GAC3B,MAAO,IACFA,EACHknC,QAAS,IAIN,SAASiB,GAAanoC,GAC3B,MAAO,IACFA,EACHknC,QAAS,IACJlnC,EAAOknC,QACVkB,oBAAoB,M,yQCjGnB,SAASC,EACdroC,EACAtN,GAIa,IAHb29B,EAGa,uDAHM1kC,EAAAA,GACnBnD,EAEa,uDAFW,SACxB8/C,EACa,uCACb,MAAM,aAAEC,GAAiBvoC,EAAOo6B,SAChC,IAAIoO,EAAiCD,EACrC,GAAID,GAAwBhhC,EAAAA,GAC1BkhC,EAAkB91C,EAAS,CAAC,CAAEA,OAAAA,EAAQ29B,SAAAA,EAAU7nC,KAAAA,IAAU,QACrD,GAAIkK,EAAQ,CACjB,MAAMwe,EAAOq3B,EAAaA,EAAa37C,OAAS,GAC3CskB,GAAQA,EAAKxe,SAAWA,GAAUwe,EAAKmf,WAAaA,GAAYnf,EAAK1oB,OAASA,IAE/EggD,EADEt3B,GAAQA,EAAKxe,SAAW8X,EAAAA,GACR,IAAI+9B,EAAat5C,MAAM,GAAI,GAAI,CAAEyD,OAAAA,EAAQ29B,SAAAA,EAAU7nC,KAAAA,IAEnD,IAAI+/C,EAAc,CAAE71C,OAAAA,EAAQ29B,SAAAA,EAAU7nC,KAAAA,UAI5DggD,EAAkBD,EAAat5C,MAAM,GAAI,GAG3C,MAAO,IACF+Q,EACHo6B,SAAU,IACLp6B,EAAOo6B,SACVmO,aAAcC,IAKpB,SAASC,EAAoBzoC,EAAqBtN,EAAgBgsC,GAChE,OAAOgK,EAAmB1oC,EAAQtN,EAAQ,CACxC0yB,KAAMsZ,IAoBV,SAASgK,EACP1oC,EAAqBtN,EAAgBjK,GAErC,MAAM6S,EAAU0E,EAAOo6B,SAAS0L,SAASpzC,IAAW,CAAE0yB,KAAM,GAAIujB,YAAa,IAE7E,MAAO,IACF3oC,EACHo6B,SAAU,IACLp6B,EAAOo6B,SACV0L,SAAU,IACL9lC,EAAOo6B,SAAS0L,SACnB,CAACpzC,GAAS,IACL4I,KACA7S,MAON,SAASmgD,EACd5oC,EAAqBtN,EAAgB29B,EAAkBwY,EAAchtB,GAErE,OAvCF,SACE7b,EAAqBtN,EAAgB29B,EAAkByY,GAEvD,MAAMxtC,EAAU0E,EAAOo6B,SAAS0L,SAASpzC,GAEzC,OAAOg2C,EAAmB1oC,EAAQtN,EAAQ,CACxCi2C,YAAa,IACPrtC,MAAAA,OAAJ,EAAIA,EAASqtC,YACb,CAACtY,GAAW,IACN/0B,MAAAA,OAAJ,EAAIA,EAASqtC,YAAYtY,MACtByY,MA6BFC,CAAa/oC,EAAQtN,EAAQ29B,EAAU,CAAE,CAACwY,GAAYhtB,IAGxD,SAASmtB,EACdhpC,EAAqBo6B,GAErB,MAAM6O,EAAgB7O,EAASziC,QAAO,CAACuxC,EAAkB9/C,KAClD8/C,EAAiB9/C,EAAQsJ,UAC5Bw2C,EAAiB9/C,EAAQsJ,QAAU,IAErCw2C,EAAiB9/C,EAAQsJ,QAAQtJ,EAAQkJ,IAAMlJ,EAExC8/C,IACN,IAMH,OAJAz+C,OAAO6rB,KAAK2yB,GAAehzC,SAASvD,IAClCsN,EAASmpC,EAAoBnpC,EAAQtN,EAAQu2C,EAAcv2C,OAGtDsN,EAGF,SAASmpC,EACdnpC,EAAqBtN,EAAgBgsC,GAErC,MAAMtZ,GAAOgkB,EAAAA,EAAAA,IAAmBppC,EAAQtN,GAExC,OAAI0yB,GAAQ36B,OAAO6rB,KAAKooB,GAASiG,OAAOC,GAAUhzC,QAAQwzB,EAAKhE,OAAOwjB,OAC7D5kC,EAGFyoC,EAAoBzoC,EAAQtN,EAAQ,IACtCgsC,KACAtZ,IAIA,SAASikB,EACdrpC,EAAqBtN,EAAgB9J,EAAmB0gD,GAExD,MAAMlkB,GAAOgkB,EAAAA,EAAAA,IAAmBppC,EAAQtN,IAAW,GAE7C62C,EAAiB,IADPnkB,EAAKx8B,MAGhB0gD,GAGL,OAAKC,EAAej3C,GAIbm2C,EAAoBzoC,EAAQtN,EAAQ,IACtC0yB,EACH,CAACx8B,GAAY2gD,IALNvpC,EASJ,SAASwpC,EACdxpC,EAAqBtN,EAAgB9J,EAAmB0gD,GAExD,MAAMlkB,GAAOqkB,EAAAA,EAAAA,IAAwBzpC,EAAQtN,IAAW,GAElD62C,EAAiB,IADPnkB,EAAKx8B,MAGhB0gD,GAGL,OAAKC,EAAej3C,GAIbo3C,EAAyB1pC,EAAQtN,EAAQ,IAC3C0yB,EACH,CAACx8B,GAAY2gD,IALNvpC,EASJ,SAAS2pC,EACd3pC,EACAtN,EACAyoC,GAEA,MAAM/V,GAAOgkB,EAAAA,EAAAA,IAAmBppC,EAAQtN,GACxC,IAAK0yB,EACH,OAAOplB,EAET,MAAM0+B,GAAUW,EAAAA,EAAAA,IAAKja,EAAM+V,GACrByO,EAAwBn/C,OAAO+rB,QAAOqzB,EAAAA,EAAAA,IAAWzkB,EAAM+V,IAAavmC,QACxE,QAAC,YAAE+gC,GAAH,SAAqBA,MAAAA,OAArB,EAAqBA,EAAamU,uBA6CpC,GA1CkBr/C,OAAO6rB,KAAKtW,EAAOo6B,SAAS0L,SAASpzC,GAAQi2C,aAAaj0C,IAAI0sB,QACtEnrB,SAASo6B,IACjB,MAAM0Z,GAAaC,EAAAA,EAAAA,IAAiBhqC,EAAQtN,EAAQ29B,GAEpD,IAAIgK,GAAY4P,EAAAA,EAAAA,IAAgBjqC,EAAQtN,EAAQ29B,GAC5C6Z,GAAcC,EAAAA,EAAAA,IAAkBnqC,EAAQtN,EAAQ29B,GAChD+Z,GAAcC,EAAAA,EAAAA,IAAkBrqC,EAAQtN,EAAQ29B,GAChDia,GAAYC,EAAAA,EAAAA,IAAgBvqC,EAAQtN,GACpC83C,EAAkBT,MAAAA,OAAH,EAAGA,EAAYU,cAElCtP,EAAWllC,SAASrN,IACdyxC,GAAaA,EAAUjmC,SAASxL,KAClCyxC,EAAYA,EAAUzlC,QAAQtC,GAAOA,IAAO1J,SACpBuL,IAApBq2C,IAA+BA,GAAmB,IAGpDN,GAAeA,EAAY91C,SAASxL,KACtCshD,EAAcA,EAAYt1C,QAAQtC,GAAOA,IAAO1J,KAG9CwhD,GAAeA,EAAYh2C,SAASxL,KACtCwhD,EAAcA,EAAYx1C,QAAQtC,GAAOA,IAAO1J,KAG9C0hD,GAAaA,EAAUl2C,SAASxL,KAClC0hD,EAAYA,EAAU11C,QAAQtC,GAAOA,IAAO1J,QAIhDoX,EAAS4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,YAAagK,GACnEr6B,EAAS4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,cAAe6Z,GACrElqC,EAAS4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,cAAe+Z,GACrEpqC,EAAS4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,YAAaia,GAE/DP,QAAkC51C,IAApBq2C,IAChBxqC,EAAS4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,aAAc,IAC/D0Z,EACHU,cAAeD,QAKjBZ,EAAsBh9C,OAAQ,CAChC,MAAM89C,GAAqBC,EAAAA,EAAAA,IAAyB3qC,GAC9C4qC,EAAyBF,GAAsBA,EAAmBh4C,SAAWA,GAClD,WAA5Bg4C,EAAmBliD,KAClBqiD,EAAkBH,MAAAA,OAAH,EAAGA,EAAoBra,SAE5CuZ,EAAsB3zC,SAAS7M,IAC7B,MAAM,WAAE0hD,EAAF,cAAcC,GAAkB3hD,EAAQusC,YACxCqV,GAAeC,EAAAA,EAAAA,IAAkBjrC,EAAQ8qC,EAAaC,GAExDH,GAA0BC,IAAoBE,IAChD/qC,EAASqoC,EAAyBroC,EAAQtN,IAExCs4C,IACFhrC,EAASqpC,EAAkBrpC,EAAQ8qC,EAAaC,EAAgB,CAAEhB,gBAAY51C,QAOpF,OAFA6L,EAASyoC,EAAoBzoC,EAAQtN,EAAQgsC,GAKxC,SAASwM,EACdlrC,EACAtN,EACAyoC,GAEA,MAAM/V,GAAOqkB,EAAAA,EAAAA,IAAwBzpC,EAAQtN,GAC7C,IAAK0yB,EACH,OAAOplB,EAET,MAAM0+B,GAAUW,EAAAA,EAAAA,IAAKja,EAAM+V,GAE3B,IAAIgQ,GAAeC,EAAAA,EAAAA,IAAmBprC,EAAQtN,GAY9C,OAXIy4C,IACFhQ,EAAWllC,SAASrN,IACduiD,EAAc/2C,SAASxL,KACzBuiD,EAAeA,EAAcv2C,QAAQtC,GAAOA,IAAO1J,QAGvDoX,EAAS4oC,EAAmB5oC,EAAQtN,EAAQ/G,EAAAA,GAAgB,eAAgBw/C,IAGrEzB,EAAyB1pC,EAAQtN,EAAQgsC,GAK7C,SAAS2M,EACdrrC,EACAtN,EACA29B,EACAmO,GAEA,MAAMnE,GAAY4P,EAAAA,EAAAA,IAAgBjqC,EAAQtN,EAAQ29B,GAC5CgO,EAAShE,MAAAA,GAAAA,EAAWztC,OACtB4xC,EAAU5pC,QAAQtC,IAAQ+nC,EAAUjmC,SAAS9B,KAC7CksC,EAEJ,OAAInE,IAAcgE,EAAOzxC,OAChBoT,EAGF4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,YAAaib,EAAgB,IAC3EjR,GAAa,MACdgE,KAIA,SAASkN,EACdvrC,EACAtN,EACA29B,EACAmO,GAEA,MAAM0L,GAAcC,EAAAA,EAAAA,IAAkBnqC,EAAQtN,EAAQ29B,GAChDgO,EAAS6L,MAAAA,GAAAA,EAAat9C,OACxB4xC,EAAU5pC,QAAQtC,IAAQ43C,EAAY91C,SAAS9B,KAC/CksC,EAEJ,OAAI0L,IAAgB7L,EAAOzxC,OAClBoT,EAGF4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,cAAeib,EAAgB,IAC7EpB,GAAe,MAChB7L,KAIP,SAASiN,EAAgBjR,GACvB,OAAOA,EAAU8L,MAAK,CAACC,EAAGC,IAAMD,EAAIC,IAG/B,SAASmF,EACdxrC,EACAtN,EACA29B,EACAuU,GAEA,MAAMwF,GAAcC,EAAAA,EAAAA,IAAkBrqC,EAAQtN,EAAQ29B,IAAa,GACnE,OAAI+Z,EAAYh2C,SAASwwC,GAChB5kC,EAYF4oC,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,cATrCib,EAAgB,IAE3BlB,EAAYx9C,OAAS8b,EAAAA,GACjB0hC,EACAA,EAAYn7C,OAAQwZ,EAAAA,GAAqB,GAE/Cm8B,KAMG,SAAS6G,EACdzrC,EACAtN,EACA29B,EACAqb,GAEA,MAAM/J,GAAa0I,EAAAA,EAAAA,IAAkBrqC,EAAQtN,EAAQ29B,IAAa,GAC5DgO,EAASiN,EAAgBI,GAE/B,OAAO9C,EACL5oC,EACAtN,EACA29B,EACA,eACAve,EAAAA,EAAAA,IAAqB6vB,EAAYtD,GAAUsD,EAAatD,GAIrD,SAASsN,EACd3rC,EAAqBtN,EAAgB29B,EAAkB5nC,GAEvD,MAAMmjD,EAAgB,KAChB5B,EAAAA,EAAAA,IAAiBhqC,EAAQtN,EAAQ29B,MAClC5nC,GAGL,OAAKmjD,EAAcvb,SAIZuY,EAAmB5oC,EAAQtN,EAAQ29B,EAAU,aAAcub,GAHzD5rC,EAMJ,SAAS6rC,EACd7rC,EAAqBtN,EAAgBo5C,GAMrC,OAJAA,EAAQ71C,SAASxN,IACfuX,EAAS2rC,EAAiB3rC,EAAQvX,EAAOiK,OAASjK,EAAO4nC,SAAW5nC,MAG/DuX,EAGF,SAAS0pC,EACd1pC,EAAqBtN,EAAgBgsC,GAErC,OAKF,SACE1+B,EAAqBtN,EAAgBjK,GAErC,MAAM6S,EAAU0E,EAAO+rC,kBAAkBjG,SAASpzC,IAAW,CAAE0yB,KAAM,GAAIhW,KAAM,GAE/E,MAAO,IACFpP,EACH+rC,kBAAmB,CACjBjG,SAAU,IACL9lC,EAAO+rC,kBAAkBjG,SAC5B,CAACpzC,GAAS,IACL4I,KACA7S,MAjBJujD,CAAwBhsC,EAAQtN,EAAQ,CAC7C0yB,KAAMsZ,IAuBH,SAASuN,EACdjsC,EAAqBtN,EAAiB9J,GACzB,IAD6CsjD,EAC7C,wDADkEC,EAClE,wDACb,MAAO,IACFnsC,EACHosC,eAAgB,IACXpsC,EAAOosC,eACV15C,OAAAA,EACA9J,UAAAA,EACAsjD,YAAAA,EACAC,oBAAAA,IAKC,SAASE,EACdrsC,EAAqBtN,EAAgBtJ,GAErC,MAAO,IACF4W,EACHo6B,SAAU,IACLp6B,EAAOo6B,SACVkS,kBAAmB,IACdtsC,EAAOo6B,SAASkS,kBACnB,CAAC55C,GAAStJ,KAMX,SAASmjD,EACdvsC,EAAqBwsC,GAErB,MAAO,IACFxsC,EACHosC,eAAgB,IACXpsC,EAAOosC,eACVI,UAAAA,IAKC,SAASC,EACdzsC,EACAtN,EACA9J,GAGA,MAAO,IACFoX,EACH0sC,iBAAkB,CAChBh6C,OAAAA,EACAyoC,WALevyC,EAAYmN,MAAMivC,UAAUhmC,OAAO,GAAIpW,GAAa,KAUlE,SAAS+jD,EACd3sC,EACAtN,EACA29B,EACAuc,EACAhkD,EACA0uC,EACAuV,GAEa,IADbC,EACa,wDACb,MAAQJ,iBAAkBK,GAAwB/sC,EAC9Cs3B,IACFuV,GAAkBG,EAAAA,EAAAA,IAA0BhtC,EAAQtN,EAAQ4kC,IAE9D,MAAM2V,EAAqBJ,GAAmB,CAACjkD,GAC/C,IAAKmkD,EACH,OAAON,EAAuBzsC,EAAQtN,EAAQu6C,GAGhD,MAAM,WAAE9R,GAAe4R,EAEvB,IAAIG,EACJ,MAAMC,EAAwBF,EAAmBr4C,QAAQtC,IAAQ6oC,EAAW/mC,SAAS9B,KACrF,GAAI66C,IAA0BA,EAAsBvgD,OAClDsgD,EAAgB/R,EAAWvmC,QAAQtC,IAAQ26C,EAAmB74C,SAAS9B,UAClE,GAAIw6C,GAAa3R,EAAWvuC,OAAQ,CACzC,MAAMw9C,GAAcgD,EAAAA,EAAAA,IAAwBptC,EAAQtN,EAAQ29B,EAAUuc,GAChES,EAAYjD,EAAY54C,QAAQ2pC,EAAWA,EAAWvuC,OAAS,IAC/D6iB,EAAe26B,EAAY54C,QAAQ5I,GACnC0a,EAAOlX,KAAKuP,IAAI0xC,EAAW59B,GAC3B69B,EAAKlhD,KAAKsP,IAAI2xC,EAAW59B,GACzBxgB,EAAQm7C,EAAYn7C,MAAMqU,EAAMgqC,EAAK,GAC3CJ,GAAgB9K,EAAAA,EAAAA,IAAO,IAAIjH,KAAelsC,SAE1Ci+C,EAAgB,IAAI/R,KAAegS,GAGrC,OAAKD,EAActgD,OAIZ,IACFoT,EACH0sC,iBAAkB,IACbK,EACH5R,WAAY+R,IAPPK,EAAsBvtC,GAY1B,SAASutC,EAAsBvtC,GACpC,MAAO,IACFA,EACH0sC,sBAAkBv4C,GAIf,SAASq5C,EACdxtC,EACAytC,EACA/6C,EACAg7C,EACAC,GAEA,MAAM,cAAEC,EAAF,WAAiB9C,GAAe2C,EAAc9X,aAAe,GACnE,GAAIiY,GAAiB9C,EAAY,CAC/B,MAAM+C,GAAgB7D,EAAAA,EAAAA,IAAiBhqC,EAAQtN,EAAQk7C,GACnDC,IACF7tC,EAAS4oC,EAAmB5oC,EAAQtN,EAAQk7C,EAAe,aAAc,IACpEC,EACHH,cAAAA,EACAjD,cAAeoD,EAAcpD,eAAiBkD,GAAc,EAAI,MAItE,OAAO3tC,I,mNC3iBF,SAAS8tC,EAAW9tC,EAAqBtN,GAC9C,OAAOsN,EAAOslB,MAAMF,KAAK1yB,GAGpB,SAASq7C,EAAe/tC,EAAqBvK,GAClD,MAAMwI,GAASmxB,EAAAA,EAAAA,IAAqB35B,GACpC,QAAKwI,IAIEiC,EAAAA,EAAAA,IAAWF,EAAQ/B,GAGrB,SAAS+vC,EAAqBhuC,EAAqBtN,GACxD,OAAOA,IAAWsN,EAAOikB,cAGpB,SAASgqB,EAAoBjuC,EAAqBvK,GACvD,MAAMd,EAAOo5C,EAAe/tC,EAAQvK,GACpC,OAAOd,IAAQ2oC,EAAAA,EAAAA,IAAU3oC,GAGpB,SAASu5C,EAAkBluC,GAChC,OAAOvV,OAAO+rB,OAAOxW,EAAOslB,MAAMF,MAAMiQ,MAAK,QAAC,UAAE8Y,GAAH,SAA4BA,KAGpE,SAASC,EAAsBpuC,EAAqBvK,GACzD,KAAIiwB,EAAAA,EAAAA,IAASjwB,EAAKnD,OAAO08B,EAAAA,EAAAA,IAAcv5B,IAAUA,EAAK+wB,SAItD,OAAK/wB,EAAK+wB,SAAS6nB,SAAW54C,EAAK+wB,SAAS6nB,QAAQzhD,SAAWsc,EAAAA,GAIxDzT,EAAK+wB,SAAS6nB,QAAQ12C,QAAO,CAAC22C,EAAD,KAA6B,IAAf,OAAErwC,GAAa,EAC/D,OACEA,IAAW+B,EAAOikB,eACfjkB,EAAOmlB,MAAMC,KAAKnnB,KAClBm/B,EAAAA,EAAAA,IAAap9B,EAAOmlB,MAAMC,KAAKnnB,GAAS+B,EAAOmlB,MAAMye,aAAa3lC,IAE9DqwC,EAAc,EAGhBA,IACN,GAbM74C,EAAK+wB,SAAS8nB,YAgBlB,SAASC,EAAcvuC,EAAqBtN,GACjD,MAAM+C,EAAOq4C,EAAW9tC,EAAQtN,GAC1BuL,EAASxI,IAAQ25B,EAAAA,EAAAA,IAAqB35B,GACtCd,EAAOsJ,IAAUiC,EAAAA,EAAAA,IAAWF,EAAQ/B,GAC1C,GAAKtJ,IAAS2oC,EAAAA,EAAAA,IAAU3oC,GAIxB,OAAOA,EAGF,SAAS65C,EAA0BxuC,EAAqBtN,GAC7D,MAAM+C,EAAOq4C,EAAW9tC,EAAQtN,GAC1B+7C,EAAMF,EAAcvuC,EAAQtN,GAClC,IAAK+C,IAASg5C,EACZ,OAAO,EAGT,GAAIh5C,EAAKo6B,cAAeuG,EAAAA,EAAAA,IAAsB3gC,EAAKo6B,aACjD,OAAO,EAGT,MAAM6e,EAAc1uC,EAAOo6B,SAAS0L,SAASpzC,GAC7C,IAAKg8C,EACH,OAAO,EAGT,MAAM,UAAErU,GAAcqU,EAAY/F,YAAYh9C,EAAAA,KAAmB,GACjE,OAAO0uC,IAAcA,EAAUztC,OAG1B,SAAS+hD,EAA2B3uC,GACzC,OAAOpO,QAAQoO,EAAOslB,MAAMgZ,QAAQsQ,QAG/B,SAASC,EAAmB7uC,EAAqBtN,EAAgBlK,GACtE,MAAM,QAAE81C,GAAYt+B,EAAOslB,MAC3B,GAAI98B,EAAM,CACR,MAAMsmD,EAAaxQ,EAAQ91C,GAC3B,OAAOoJ,QAAQk9C,GAAcA,EAAW16C,SAAS1B,IAGnD,OAAOjI,OAAO+rB,OAAO8nB,GAASvnC,MAAMg4C,GAASA,GAAQA,EAAK36C,SAAS1B,KAG9D,SAAS0tC,EAAmBpgC,EAAqBtN,GACtD,MAAM+C,EAAOq4C,EAAW9tC,EAAQtN,GAChC,GAAK+C,GAASo5C,EAAmB7uC,EAAQtN,GAIzC,OAAO+C,EAAKi8B,WAAahlB,EAAAA,GAAqB,WAAa,SAGtD,SAASsiC,EAAiBhvC,EAAqB0xB,GACpD,OAAO1xB,EAAOivC,YAAY7pB,KAAKsM,GAe1B,SAASwd,EAAmBlvC,EAAqBtN,GAAmD,IAAnCg/B,EAAmC,uDAAxBjlB,EAAAA,GACjF,MAAM,OAAEmiC,EAAF,SAAUO,GAAanvC,EAAOslB,MAAMya,iBAE1C,GAAIrO,IAAajlB,EAAAA,GACf,OAAO7a,QAAQg9C,MAAAA,OAAD,EAACA,EAAQx6C,SAAS1B,IAGlC,GAAIg/B,IAAahlB,EAAAA,GACf,OAAO9a,QAAQu9C,MAAAA,OAAD,EAACA,EAAU/6C,SAAS1B,IAGpC,MAAQ0yB,KAAMgqB,GAAoBpvC,EAAOivC,aAEnC,cAAEtc,GAAkByc,EAAgB1d,IAAa,GACvD,OAAO9/B,QAAQ+gC,MAAAA,OAAD,EAACA,EAAev+B,SAAS1B,IAIlC,SAAS28C,EAAqBrvC,EAAqBzF,GACxD,MAAM+0C,EAAkB/0C,EAASZ,cACjC,OAAOlP,OAAO+rB,OAAOxW,EAAOslB,MAAMF,MAAMiQ,MACrC5/B,GAASA,EAAK8E,UAAY9E,EAAK8E,SAASZ,gBAAkB21C,IAIxD,SAASC,EAAyBvvC,GACvC,OAAOpO,QAAQk8C,EAAW9tC,EAAQuM,EAAAA,KAG7B,SAASijC,EAAaxvC,EAAqBtN,GAAgB,MAChE,MAAM+C,EAAOq4C,EAAW9tC,EAAQtN,GAChC,IAAK+C,EAAM,OAEX,MAAMnD,EAAKmD,MAAAA,GAAH,UAAGA,EAAM+wB,gBAAT,aAAG,EAAgBipB,SAC3B,OAAKn9C,GAEE4N,EAAAA,EAAAA,IAAWF,EAAQ1N,IAAOw7C,EAAW9tC,EAAQ1N,QAFpD,I,spCC3JK,SAASo9C,EAA2B1vC,GACzC,OAAOA,EAAO4gC,SAASrxB,OAGlB,SAASogC,EAAuB3vC,GACrC,OAAOA,EAAOyhC,KAAKlyB,OAGd,SAASqgC,EAAiB5vC,EAAqB1N,GACpD,OAAO0N,EAAO4gC,SAASC,SAASvuC,GAG3B,SAASu9C,EAA4B7vC,EAAqB8vC,GAC/D,OAAOrlD,OAAO+rB,OAAOxW,EAAO4gC,SAASC,UAAUxL,MAAM/jB,GAAMA,EAAEw+B,UAAUn2C,gBAAkBm2C,EAAUn2C,gBAG9F,SAASuoC,EAAuBliC,EAAqBhJ,GAC1D,MAAM+4C,EAActlD,OAAO+rB,OAAOxW,EAAO4gC,SAASC,UAClD,IAAImP,EAAiC,GAcrC,OAZAhwC,EAAO4gC,SAASqP,SAASrP,SAAS3qC,SAASu+B,IACrCA,EAAQx9B,QAAUA,GAAOg5C,EAAiBpiD,KAAK4mC,MAIrDub,EAAY95C,SAAQ,IAAe,IAAd,MAAEi6C,GAAY,EAC5BA,IAILF,EAAmBA,EAAiBhxC,OAAOkxC,EAAMl5C,IAAU,GAAIk5C,EAAMC,EAAWn5C,KAAW,QAEtFg5C,EAGT,SAASG,EAAWn5C,GAElB,OAAOA,EAAMnI,QAAQ,IAAU,IAG1B,SAASuhD,EAAoBpwC,EAAqBhJ,GACvD,MAAM,eAAE8qC,GAAmB9hC,EAC3B,IAAK8hC,IAAmBA,EAAelB,SACrC,OAGF,MAAMyP,EAAeF,EAAWn5C,GAEhC,OAAO8qC,EAAelB,SAASvL,MAAMb,GAAYA,EAAQx9B,QAAUA,GAASw9B,EAAQx9B,QAAUq5C,IAGzF,SAASC,EAA0BtwC,EAAqBhJ,GAC7D,MAAM,qBAAEu5C,GAAyBvwC,EACjC,IAAKuwC,IAAyBA,EAAqB3P,SACjD,OAGF,MAAMyP,EAAeF,EAAWn5C,GAEhC,OAAOu5C,EAAqB3P,SAASvL,MAAMb,GAAYA,EAAQx9B,QAAUA,GAASw9B,EAAQx9B,QAAUq5C,IAG/F,SAASG,EAAyBxwC,EAAqBhJ,GAAe,MAC3E,OAAOgJ,MAAAA,GAAP,UAAOA,EAAQwqB,iBAAf,aAAO,EAAmBimB,YAAYN,EAAWn5C,IAG5C,SAAS05C,EAAyB1wC,EAAqBhJ,GAC5D,MAAMq5C,EAAeF,EAAWn5C,GAEhC,MAAwB,OAAjBq5C,EAAwB,QAA4B,OAAjBA,EAAwB,gBAAal8C,EAG1E,SAASw8C,EAA+B35C,GAC7C,MAAiB,aAAVA,EAAuB,eAAY7C,EAGrC,SAASy8C,EAAqC5mD,GACnD,MAAgB,YAATA,EAAqB,UAAOmK,E,uBCxC9B,SAASw2C,EAAyB3qC,GACvC,MAAM,aAAEuoC,GAAiBvoC,EAAOo6B,SAEhC,GAAImO,EAAa37C,OACf,OAAO27C,EAAaA,EAAa37C,OAAS,GAMvC,SAASikD,EAAkB7wC,GAChC,MAAM,OAAEtN,GAAWi4C,EAAyB3qC,IAAW,GAEvD,OAAOtN,GAASo7C,EAAAA,EAAAA,IAAW9tC,EAAQtN,QAAUyB,EAGxC,SAASi1C,EAAmBppC,EAAqBtN,GAAgB,MACtE,iBAAOsN,EAAOo6B,SAAS0L,SAASpzC,UAAhC,aAAO,EAAkC0yB,KAGpC,SAASqkB,EAAwBzpC,EAAqBtN,GAAgB,MAC3E,iBAAOsN,EAAO+rC,kBAAkBjG,SAASpzC,UAAzC,aAAO,EAA2C0yB,KAG7C,SAAS0rB,EACd9wC,EACAtN,EACA29B,EACAtW,GAEA,MAAM20B,EAAc1uC,EAAOo6B,SAAS0L,SAASpzC,GAC7C,IAAKg8C,EACH,OAGF,MAAMqC,EAASrC,EAAY/F,YAAYtY,GACvC,OAAK0gB,EAIEA,EAAOh3B,QAJd,EAOK,SAASkwB,EAAgBjqC,EAAqBtN,EAAgB29B,GACnE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,aAG9C,SAAS8Z,EAAkBnqC,EAAqBtN,EAAgB29B,GACrE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,eAG9C,SAAS+c,EACdptC,EAAqBtN,EAAgB29B,EAAkBuc,GAEvD,OAAQA,GACN,IAAK,SACH,OAAOvC,EAAkBrqC,EAAQtN,EAAQ29B,GAC3C,IAAK,SACH,OAAOka,EAAgBvqC,EAAQtN,GACjC,IAAK,YACH,OAAO04C,EAAmBprC,EAAQtN,IAMjC,SAAS23C,EAAkBrqC,EAAqBtN,EAAgB29B,GACrE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,eAG9C,SAASka,EAAgBvqC,EAAqBtN,GACnD,OAAOo+C,EAAkB9wC,EAAQtN,EAAQ/G,EAAAA,GAAgB,aAGpD,SAASy/C,EAAmBprC,EAAqBtN,GACtD,OAAOo+C,EAAkB9wC,EAAQtN,EAAQ/G,EAAAA,GAAgB,gBAGpD,SAASqlD,EAAmBhxC,EAAqBtN,EAAgB29B,GACtE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,gBAG9C,SAAS4gB,EAAmBjxC,EAAqBtN,EAAgB29B,GACtE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,gBAG9C,SAAS6gB,EAAgBlxC,EAAqBtN,EAAgB29B,GACnE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,aAG9C,SAAS8gB,EAAyBnxC,EAAqBtN,GAC5D,OAAOo+C,EAAkB9wC,EAAQtN,EAAQ/G,EAAAA,GAAgB,sBAGpD,SAASylD,EAAYpxC,EAAqBtN,EAAgB29B,GAC/D,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,SAG9C,SAASghB,EAAgBrxC,EAAqBtN,EAAgB29B,GACnE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,aAG9C,SAAS2Z,EAAiBhqC,EAAqBtN,EAAgB29B,GACpE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,cAG9C,SAASihB,EAAqBtxC,EAAqBtN,EAAgB29B,GACxE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,kBAG9C,SAASkhB,EAAiBvxC,EAAqBtN,EAAgB29B,GACpE,OAAOygB,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,cAG9C,SAASmhB,EAAuBxxC,EAAqBtN,EAAgB29B,GAC1E,GAAIA,IAAa1kC,EAAAA,GACf,OAAOmiD,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAG5B,MAAMq3C,EAAaC,EAAiBhqC,EAAQtN,EAAQ29B,GACpD,OAAK0Z,GAIE+D,EAAAA,EAAAA,IAAW9tC,EAAQ+pC,EAAW0H,iBAAmB/+C,QAJxD,EAOK,SAASg/C,EAAyB1xC,EAAqBtN,EAAgB29B,GAC5E,GAAIA,IAAa1kC,EAAAA,GACf,OAGF,MAAMo+C,EAAaC,EAAiBhqC,EAAQtN,EAAQ29B,GACpD,OAAK0Z,EAIEA,EAAW4H,kBAJlB,EAOK,SAASC,EAAsB5xC,EAAqBtN,EAAgBtJ,GACzE,MAAMslD,EAAc1uC,EAAOo6B,SAAS0L,SAASpzC,GAC7C,IAAKg8C,EACH,OAGF,MAAM,iBAAEjZ,EAAF,oBAAoBoc,GAAwBzoD,EAClD,OAAKqsC,GAAqBoc,EAInBpnD,OAAO+rB,OAAek4B,EAAY/F,aAAatT,MAAM0b,GACnDA,EAAOhH,aACXtU,GAAoBA,IAAqBsb,EAAOhH,WAAW4H,cACxDE,GAAuBA,IAAwBd,EAAOhH,WAAW4H,qBAPzE,EAYK,SAASG,EAA8B9xC,EAAqBtN,EAAgBtJ,GACjF,MAAMshD,EAAqBC,EAAyB3qC,GACpD,IAAK0qC,EACH,OAAO,EAGT,MAAM,WAAEX,GAAe6H,EAAsB5xC,EAAQtN,EAAQtJ,IAAY,GACzE,OACEsJ,IAAWg4C,EAAmBh4C,SAE3Bg4C,EAAmBra,WAAa1kC,EAAAA,IAC7Bo+C,GAAcW,EAAmBra,WAAa0Z,EAAW1Z,UAK5D,SAAS0hB,EAAuB/xC,EAAqBtN,EAAgB29B,GAC1E,MAAM+Z,EAAcC,EAAkBrqC,EAAQtN,EAAQ29B,GACtD,IAAK+Z,IAAgBA,EAAYx9C,OAC/B,OAAO,EAGT,IAAI8gD,EAEJ,GAAIrd,IAAa1kC,EAAAA,GAAgB,CAC/B,MAAM8J,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAChC,IAAK+C,IAASA,EAAKo6B,YACjB,OAAO,EAGT6d,EAAgBj4C,EAAKo6B,YAAYv9B,OAC5B,CACL,MAAMy3C,EAAaC,EAAiBhqC,EAAQtN,EAAQ29B,GACpD,IAAK0Z,IAAeA,EAAW2D,cAC7B,OAGFA,EAAgB3D,EAAW2D,cAI7B,OAAIA,GAAiBnjC,EAAAA,KAA0B0gC,EAAkBjrC,EAAQtN,EAAQg7C,IAI1EtD,EAAYA,EAAYx9C,OAAS,IAAM8gD,EAGzC,SAASzC,EAAkBjrC,EAAqBtN,EAAgB9J,GACrE,MAAMopD,EAAe5I,EAAmBppC,EAAQtN,GAEhD,OAAOs/C,EAAeA,EAAappD,QAAauL,EAG3C,SAAS89C,EAAuBjyC,EAAqBtN,EAAgB9J,GAC1E,MAAMopD,EAAevI,EAAwBzpC,EAAQtN,GAErD,OAAOs/C,EAAeA,EAAappD,QAAauL,EAG3C,SAAS+9C,EACdlyC,EAAqBtN,EAAgB29B,EAAkBuc,GAEvD,GAAwB,cAApBA,EAAiC,CACnC,MAAMhkD,EAAYuoD,EAAyBnxC,EAAQtN,GACnD,OAAO9J,EAAYqpD,EAAuBjyC,EAAQtN,EAAQ9J,QAAauL,EAClE,CACL,MAAMvL,EAAYsoD,EAAgBlxC,EAAQtN,EAAQ29B,GAClD,OAAOznC,EAAYqiD,EAAkBjrC,EAAQtN,EAAQ9J,QAAauL,GAI/D,SAASg+C,EAA0BnyC,EAAqBoyC,GAC7D,IAAIC,EAGJ,IAAK,MAAML,KAAgBvnD,OAAO+rB,OAAOxW,EAAOo6B,SAAS0L,UAAW,CAClE,MAAM,KAAE1gB,GAAS4sB,EAIjB,GAHAK,EAAkB5nD,OAAO+rB,OAAO4O,GAAMiQ,MAAMjsC,GACnCA,EAAQuG,QAAQilC,MAAQxrC,EAAQuG,QAAQilC,KAAKtiC,KAAO8/C,IAEzDC,EACF,MAIJ,OAAOA,EAGF,SAASC,GAAuBtyC,EAAqBtN,GAC1D,MAAQA,OAAQ6/C,EAAV,UAAyB3pD,GAAcoX,EAAOosC,gBAAkB,GAEtE,OAAOmG,IAAkB7/C,EAAS9J,OAAYuL,EAGzC,SAASq+C,GAAuBxyC,EAAqB5W,GAC1D,MAAMqpD,EAAYH,GAAuBtyC,EAAQ5W,EAAQsJ,QAEzD,QAAO+/C,IAAYA,IAAcrpD,EAAQkJ,IAAMmgD,IAAcrpD,EAAQmrC,iBAGhE,SAASme,GAAsB1yC,EAAqB5W,GACzD,MAAM,wBAAEupD,IAA4B7E,EAAAA,EAAAA,IAAW9tC,EAAQ5W,EAAQsJ,SAAW,GAC1E,OAAOyjC,EAAAA,EAAAA,IAAe/sC,KAAaupD,GAA2BA,EAA0BvpD,EAAQkJ,GAG3F,SAASsgD,GACd5yC,EAAqB5W,GACK,IADgBypD,EAChB,wDAC1B,OAAKH,GAAsB1yC,EAAQ5W,IAAaypD,GAIzC5c,EAAAA,EAAAA,IAAgB7sC,GAHd,OAMJ,SAAS0pD,GAAa9yC,EAAqB5W,GAChD,MAAM,SAAE2sC,GAAa3sC,EACrB,GAAK2sC,EAIL,OAAOrQ,EAAAA,EAAAA,IAASqQ,IAAY71B,EAAAA,EAAAA,IAAWF,EAAQ+1B,IAAY+X,EAAAA,EAAAA,IAAW9tC,EAAQ+1B,GAGzE,SAASgd,GAAsB/yC,EAAqB5W,GACzD,MAAM,YAAEusC,GAAgBvsC,EACxB,GAAKusC,EAIL,OAAIA,EAAYqd,eAAiBrd,EAAYmV,YACpCgD,EAAAA,EAAAA,IAAW9tC,EAAQ21B,EAAYmV,YAC7BnV,EAAYsd,cACd/yC,EAAAA,EAAAA,IAAWF,EAAQ21B,EAAYsd,gBAAiBnF,EAAAA,EAAAA,IAAW9tC,EAAQ21B,EAAYsd,mBADjF,EAOF,SAASC,GAA4BlzC,EAAqB5W,EAAqBinC,GAAkB,YACtG,MAAM56B,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQ5W,EAAQsJ,QACxC,IAAK+C,GAAQA,EAAK66B,aAChB,MAAO,GAGT,MAAM6iB,GAAYztB,EAAAA,EAAAA,IAASjwB,EAAKnD,IAC1B8gD,GAAiBpF,EAAAA,EAAAA,IAAqBhuC,EAAQ5W,EAAQsJ,QACtD2gD,GAAevkB,EAAAA,EAAAA,IAAiBr5B,GAChC69C,GAAevkB,EAAAA,EAAAA,IAAiBt5B,GAChC89C,GAAYvkB,EAAAA,EAAAA,IAAcv5B,GAC1B+9C,GAAUrd,EAAAA,EAAAA,IAAe/sC,GACzBqqD,GAAwB5d,EAAAA,EAAAA,IAA6BzsC,GACrDsqD,GAAQpe,EAAAA,EAAAA,IAAalsC,GACrBuqD,GAAW/d,EAAAA,EAAAA,IAAgBxsC,IAC3B,QAAEuG,GAAYvG,EAKdwqD,GAH8BR,GAC9BE,IAAgBtjB,EAAAA,EAAAA,IAAiBv6B,EAAM,gBACvC89C,IAAavjB,EAAAA,EAAAA,IAAiBv6B,EAAM,kBAInCmoC,EAAAA,EAAAA,GAAc59B,EAAOgoB,kBAAoB5+B,EAAQyqC,KApUxB,WAsU5BlkC,EAAQ6kC,SAAW7kC,EAAQmlC,SAAWnlC,EAAQilC,MAAQjlC,EAAQ6D,QAAU7D,EAAQ+kC,OAAhF,UACI/kC,EAAQ8kC,aADZ,OACI,EAAeO,YAEjBU,EAAAA,EAAAA,IAAmBtsC,KACnBA,EAAQyqD,SAGRC,GAAYN,IAAYC,IAAyBrjB,EAAAA,EAAAA,IAAiB36B,EAAM46B,GAExE0jB,EAAmBZ,GACvB19C,EAAKg7B,YACA8iB,KAActjB,EAAAA,EAAAA,IAAkBx6B,EAAM,iBACxCu6B,EAAAA,EAAAA,IAAiBv6B,EAAM,eAG5B,IAAIu+C,GAAUR,IAAYC,IAA0BE,GAAYI,EAC5DE,GAAW,EAEf,MAAMC,EAAmB3J,EAAgBvqC,EAAQvK,EAAKnD,IAElD0hD,IACFC,EAAWriD,QAAQsiD,GAAoBA,EAAiB9/C,SAAShL,EAAQkJ,KACzE0hD,GAAUC,GAGZ,MAAME,GAAaX,IAAYC,IAC7BN,GACGO,GACAL,GACA59C,EAAKg7B,YACLT,EAAAA,EAAAA,IAAiBv6B,EAAM,mBAGtB2+C,GAAajB,IAAcO,EAE3BW,EAAkBF,IACrBhB,IAAcC,GACXC,IACFK,IAAS1jB,EAAAA,EAAAA,IAAiBv6B,EAAM,mBAAqBA,EAAKg7B,YAIxD6jB,GAAWd,IAAYG,GAAYC,IACvCF,GACIH,IAAc99C,EAAKg7B,YAAaT,EAAAA,EAAAA,IAAiBv6B,EAAM,kBAGvD8+C,GAAcf,IAAYG,EAE1Ba,EAAa5iD,QAAQxI,EAAQuG,QAAQ6kC,SACrCigB,EAAqBD,GDhatB,SAAiCx0C,EAAqBw0B,GAC3D,MAAM,SAAEoM,GAAa5gC,EAAO4gC,SAASqP,SACrC,OAAOrP,GAAYA,EAAS7pC,MAAK,QAAC,GAAEzE,GAAH,SAAYA,IAAOkiC,EAAQliC,MC8ZnBoiD,CAAwB10C,EAAQ5W,EAAQuG,QAAQ6kC,SACnFmgB,GAAkBhB,GAAYa,IAAeC,EAC7CG,GAAoBjB,GAAYc,EAChCI,GAAWlB,EACXmB,GAAenB,IAAaJ,GAAaD,GACzCyB,GAAapB,EAEbqB,EAAcpjD,SAAQ,UAAAjC,EAAQklC,eAAR,eAAiBzjC,YAAjB,UAA6BzB,EAAQklC,eAArC,aAA6B,EAAiBJ,SAA9C,UAAuD9kC,EAAQklC,eAA/D,aAAuD,EAAiB7O,QAC/Fr2B,EAAQ+kC,OAAS/kC,EAAQglC,OAAShlC,EAAQq2B,OAASr2B,EAAQ8kC,OAAS9kC,EAAQyB,UAAYzB,EAAQ6kC,SAmBrG,MAAO,CACLygB,UAlBgB,CAChBnB,EACAQ,EACAN,EACAC,EACAG,EACAD,EACAE,EACAE,EACAI,EACAC,EACAC,EACAC,EACAC,EACAC,GACArQ,OAAOuQ,IAAaA,IAIpBpB,SAAAA,EACAQ,QAAAA,EACAN,OAAAA,EACAC,SAAAA,EACAG,UAAAA,EACAD,UAAAA,EACAE,gBAAAA,EACAE,WAAAA,EACAI,eAAAA,EACAC,iBAAAA,EACAC,QAAAA,EACAC,YAAAA,EACAC,UAAAA,EACAC,YAAAA,GAKG,SAASG,GAAgCn1C,GAC9C,MAAQm7B,WAAY8R,GAAuBjtC,EAAO0sC,kBAAoB,IAChE,OAAEh6C,EAAF,SAAU29B,GAAasa,EAAyB3qC,IAAW,GAC3DgyC,EAAet/C,GAAU02C,EAAmBppC,EAAQtN,GAC1D,IAAKs/C,IAAiB/E,IAAuB5c,EAC3C,MAAO,GAGT,MAAM+kB,EAAiBnI,EACpBv4C,KAAKpC,GAAO0/C,EAAa1/C,IAAO4gD,GAA4BlzC,EAAQgyC,EAAa1/C,GAAK+9B,KACtFz7B,OAAOhD,SAEV,MAAO,CACLuiD,UAAWiB,EAAezQ,OAAOvpC,GAAYA,EAAQ+4C,YACrDE,gBAAiBe,EAAezQ,OAAOvpC,GAAYA,EAAQi5C,mBAIxD,SAASgB,GAAgCr1C,GAC9C,MAAQm7B,WAAY8R,GAAuBjtC,EAAO0sC,kBAAoB,IAChE,OAAEh6C,EAAF,SAAU29B,GAAasa,EAAyB3qC,IAAW,GAC3DgyC,EAAet/C,GAAU02C,EAAmBppC,EAAQtN,GAC1D,SAAKs/C,GAAiB/E,GAAuB5c,IAItB4c,EACpBv4C,KAAKpC,GAAO0/C,EAAa1/C,IAAO4gD,GAA4BlzC,EAAQgyC,EAAa1/C,GAAK+9B,KACtFz7B,OAAOhD,SAEY+yC,OAAOvpC,GAAYA,EAAQg5C,YAG5C,SAASkB,GAAkCt1C,GAChD,MAAQm7B,WAAY8R,GAAuBjtC,EAAO0sC,kBAAoB,IAChE,OAAEh6C,EAAF,SAAU29B,GAAasa,EAAyB3qC,IAAW,GAC3DgyC,EAAet/C,GAAU02C,EAAmBppC,EAAQtN,GAC1D,SAAKs/C,GAAiB/E,GAAuB5c,IAItB4c,EACpBv4C,KAAKpC,GAAO0/C,EAAa1/C,IAAO4gD,GAA4BlzC,EAAQgyC,EAAa1/C,GAAK+9B,KACtFz7B,OAAOhD,SAEYmF,MAAMqE,GAAYA,EAAQ45C,cAG3C,SAASO,GAAoBv1C,EAAqB5W,GACvD,MAAMosD,EAAex1C,EAAOy1C,gBAAgB3P,SAAS18C,EAAQsJ,QAC7D,QAAO8iD,GAAeA,EAAaphD,SAAShL,EAAQkJ,IAG/C,SAASojD,GAAwB11C,EAAqBtN,GAC3D,OAAOsN,EAAOy1C,gBAAgB3P,SAASpzC,IAAWwwC,EAAAA,EAG7C,SAASyS,GAAqB31C,EAAqB5W,GAAqB,MAC7E,iBAAO4W,EAAO41C,YAAYC,iBAAiBzsD,EAAQmrC,iBAAmBnrC,EAAQkJ,WAA9E,aAAO,EAA4E8zB,SAG9E,SAAS0vB,GAAqB91C,EAAqBtN,EAAgB29B,GACxE,GAAIA,IAAa1kC,EAAAA,GAAgB,CAC/B,MAAM8J,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAChC,IAAK+C,EACH,OAIF,IAAKA,EAAKsgD,uBACR,OAGF,OAAKtgD,EAAKo6B,aAINsG,EAAAA,EAAAA,IAAe1gC,EAAKo6B,aACfp6B,EAAKo6B,YAAYv9B,GAInBlG,KAAKuP,IAAIlG,EAAKo6B,YAAYv9B,GAAImD,EAAKsgD,wBARjCtgD,EAAKsgD,uBAST,CACL,MAAMhM,EAAaC,EAAiBhqC,EAAQtN,EAAQ29B,GACpD,IAAK0Z,EACH,OAGF,OAAKA,EAAWgM,uBAKT3pD,KAAKuP,IAAIouC,EAAWgM,uBAAwBhM,EAAW2D,eAAiBsI,EAAAA,GAJtEjM,EAAW4H,cAQjB,SAASsE,GAAoBj2C,EAAqBtN,EAAgB29B,GACvE,MAAM56B,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAEhC,GAAI29B,IAAa1kC,EAAAA,IACf,IAAK8J,EACH,WAEG,CACL,MAAMs0C,EAAaC,EAAiBhqC,EAAQtN,EAAQ29B,GACpD,IAAK0Z,QAC8B51C,IAA7B41C,EAAW2D,eAA+B3D,EAAW2D,gBAAkB3D,EAAWgM,uBACtF,OAIJ,MAAM7L,EAAcC,EAAkBnqC,EAAQtN,EAAQ29B,GAChDgK,EAAY4P,EAAgBjqC,EAAQtN,EAAQ29B,GAC5CjL,EAAOgkB,EAAmBppC,EAAQtN,GACxC,IAAK0yB,IAAU8kB,IAAe7P,EAC5B,OAGF,MAAM6b,EAAaJ,GAAqB91C,EAAQtN,EAAQ29B,GACxD,IAAK6lB,GAAczgD,GAAQA,EAAK+6B,YAC9B,OAGF,MAAM2lB,EAAgCzjD,IAAW6Z,EAAAA,GAC7CvM,EAAOo2C,qBAAqBz+C,QAAO,CAAC+D,EAAK26C,KACjCA,EAAaC,UAAYD,EAAa/jD,GAAKoJ,EAAM26C,EAAa/jD,GAAKoJ,IACzE,IACD,EAEL,SAAS66C,EAAoBjY,GAC3B,OAAOA,EAAQjJ,MAAM/iC,KAEf4jD,GAAc5jD,EAAK4jD,IAClB9wB,EAAK9yB,MACH8yB,EAAK9yB,GAAIijC,YAAcnQ,EAAK9yB,GAAIkkD,kBAClClkD,EAAK6jD,IAKd,GAAIjM,EAAa,CACf,MAAMuM,EAAQF,EAAoBrM,GAClC,GAAIuM,EACF,OAAOA,EAIX,GAAIpc,EAAW,CACb,MAAMoc,EAAQF,EAAoBlc,GAClC,GAAIoc,EACF,OAAOA,GAYN,SAASC,GAAyB12C,GACvC,MAAM,gBAAE22C,GAAoB32C,EAC5B,OAAOpO,QAAQ+kD,EAAgBC,cAG1B,SAASC,GAAsB72C,EAAqBpX,GACzD,MAAMkuD,EAAkBrsD,OAAO+rB,OAAOxW,EAAOslB,MAAMF,MAAMiQ,MAAM5/B,IAC7Dw5B,EAAAA,EAAAA,IAAgBx5B,IAASA,EAAKo6B,aAAep6B,EAAKo6B,YAAYv9B,KAAO1J,IAEvE,GAAIkuD,EACF,OAAOA,EAAgBxkD,GAGzB,MAAM,SAAEwzC,GAAa9lC,EAAOo6B,SAC5B,OAAO3vC,OAAO6rB,KAAKwvB,GAAUzQ,MAAM3iC,IACjC,MAAM+C,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAChC,OAAO+C,IAAQw5B,EAAAA,EAAAA,IAAgBx5B,IAASqwC,EAASrwC,EAAKnD,IAAI8yB,KAAKx8B,MAI5D,SAASmuD,GAAqB/2C,GACnC,MAAM,iBAAE0sC,GAAqB1sC,EAE7B,OAAOpO,QAAQ86C,GAGV,SAASsK,GAAwBh3C,EAAqBpX,GAC3D,MAAM,WAAEuyC,GAAen7B,EAAO0sC,kBAAoB,GAClD,QAAKvR,GAIEA,EAAW/mC,SAASxL,GAGtB,SAASquD,GAAmCj3C,EAAqBtN,EAAgB4kC,GACtF,MAAM0a,EAAe5I,EAAmBppC,EAAQtN,GAChD,GAAKs/C,EAIL,OAAOvnD,OAAO+rB,OAAOw7B,GAClBp9C,QAAQxL,GAAYA,EAAQkuC,YAAcA,GAAaluC,EAAQusC,cAC/DjhC,KAAI,QAAC,YAAEihC,GAAH,SAAqBA,EAAaoV,iBAGpC,SAASiC,GAA0BhtC,EAAqBtN,EAAgB4kC,GAC7E,MAAM0a,EAAe5I,EAAmBppC,EAAQtN,GAChD,GAAKs/C,EAIL,OAAOvnD,OAAO6rB,KAAK07B,GAChBt9C,IAAI0sB,QACJxsB,QAAQtC,GAAO0/C,EAAa1/C,GAAIglC,YAAcA,IAG5C,SAAS4f,GAA8Bl3C,EAAqBtN,EAAgB4kC,GACjF,MAAQ6D,WAAYgc,GAAgBn3C,EAAO0sC,kBAAoB,GAC/D,IAAKyK,EACH,OAAO,EAGT,MAAMC,EAAWpK,GAA0BhtC,EAAQtN,EAAQ4kC,GAC3D,OAAO8f,GAAYA,EAASzS,OAAOryC,GAAO6kD,EAAY/iD,SAAS9B,KAG1D,SAAS+kD,GAA4Br3C,GAC1C,MAAM,WAAEm7B,GAAen7B,EAAO0sC,kBAAoB,GAElD,OAAOvR,EAAaA,EAAWvuC,OAAS,EAGnC,SAAS0qD,GACdt3C,EAAqBtN,GAErB,MAAM+C,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAChC,IAAK+C,EACH,OAGF,KAAKw4C,EAAAA,EAAAA,IAAoBjuC,EAAQvK,GAC/B,OAGF,MAAMu8C,EAAe5I,EAAmBppC,EAAQtN,GAC1C03C,EAAcC,EAAkBrqC,EAAQtN,EAAQ/G,EAAAA,IACtD,IAAKqmD,IAAiB5H,EACpB,OAGF,MAAMxhD,GAAY2uD,EAAAA,EAAAA,IAASnN,GAAc93C,IAC/B0/C,EAAa1/C,GAAIijC,YAAc3jC,QAAQogD,EAAa1/C,GAAIklD,mBAG5DC,GAAqBF,EAAAA,EAAAA,IAASnN,GAAc93C,GACzCV,QAAQogD,EAAa1/C,GAAIolD,6BAGlC,OAAI9uD,GAAa6uD,GAAsBA,EAAqB7uD,OAA5D,EAIOA,EAAYopD,EAAappD,QAAauL,EAGxC,SAASwjD,GAAuB33C,EAAqB5W,GAC1D,MAAMqM,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQ5W,EAAQsJ,QACxC,IAAK+C,EACH,OAGF,MAAMrD,EAAS0gD,GAAa9yC,EAAQ5W,GAE9BwuD,EAAUhmD,SAAQkmC,EAAAA,EAAAA,IAAgB1uC,KAAYyvC,EAAAA,EAAAA,IAAuBzvC,IACrEyuD,EAAUjmD,SAAQmmC,EAAAA,EAAAA,IAAgB3uC,KAAY0vC,EAAAA,EAAAA,IAAuB1vC,IACrE0uD,EAASlmD,SAAQymC,EAAAA,EAAAA,IAAgBjvC,KAAYkvC,EAAAA,EAAAA,IAAgBlvC,KAAY4uC,EAAAA,EAAAA,IAAmB5uC,KAE5F,6BACJ2uD,EADI,+BAEJC,EAFI,yBAGJC,EAHI,2BAIJC,EAJI,6BAKJC,EALI,+BAMJC,EANI,yBAOJC,EAPI,2BAQJC,EARI,4BASJC,EATI,8BAUJC,EAVI,wBAWJC,EAXI,0BAYJC,GACE14C,EAAO0mB,SAAS+B,MAEpB,OAAImvB,EACKe,GAAiB,CACtB34C,OAAAA,EACAvK,KAAAA,EACArD,OAAAA,EACAwmD,6BAA8Bb,EAC9Bc,+BAAgCb,EAChCc,yBAA0Bb,EAC1Bc,2BAA4Bb,IAI5BL,EACKc,GAAiB,CACtB34C,OAAAA,EACAvK,KAAAA,EACArD,OAAAA,EACAwmD,6BAA8BT,EAC9BU,+BAAgCT,EAChCU,yBAA0BT,EAC1BU,2BAA4BT,KAI5BR,GACKa,GAAiB,CACtB34C,OAAAA,EACAvK,KAAAA,EACArD,OAAAA,EACAwmD,6BAA8BL,EAC9BM,+BAAgCL,EAChCM,yBAA0BL,EAC1BM,2BAA4BL,IAOlC,SAASC,GAAT,GAgBG,IAhBuB,OACxB34C,EADwB,KAExBvK,EAFwB,OAGxBrD,EAHwB,6BAIxBwmD,EAJwB,+BAKxBC,EALwB,yBAMxBC,EANwB,2BAOxBC,GASC,EACD,MAAMC,EAAqBpnD,QAAQQ,IACjCA,EAAOE,KAAO0N,EAAOikB,gBAAiBg1B,EAAAA,EAAAA,IAA0Bj5C,EAAQ5N,KAG1E,OAAOR,QACJonD,GAAsBJ,IAClBI,GAAsBH,IAAkCnzB,EAAAA,EAAAA,IAASjwB,EAAKnD,KACvEwmD,IAA4BjqB,EAAAA,EAAAA,IAAYp5B,IACxCsjD,IAA8B/pB,EAAAA,EAAAA,IAAcv5B,IAI7C,SAASyjD,GAAuBl5C,EAAqB5W,GAC1D,MAAMqrC,GAAQsD,EAAAA,EAAAA,IAAgB3uC,KAAY0vC,EAAAA,EAAAA,IAAuB1vC,GACjE,IAAKqrC,EACH,OAGF,MAAM,kBACJ0kB,EADI,gBAEJC,GACEp5C,EAAO0mB,SAAS+B,MAEd4wB,EAAQ5kB,EAAM8B,OAAS9B,EAAMO,QAEnC,OAAQmkB,IAAsBE,GAAWD,GAAmBC,EAGvD,SAASC,GAAyBt5C,GACvC,OAAOA,EAAO0mB,SAAS+B,MAAM8wB,mBAGxB,SAASC,GAA8Bx5C,GAC5C,MAAM,qBAAEo2C,GAAyBp2C,EAC3By5C,EAAQrtD,KAAKsP,OAAO06C,EAAqB1hD,KAAI,QAAC,GAAEpC,GAAH,SAAYA,MAE/D,OAAO8jD,EAAqB/gB,MAAK,QAAC,GAAE/iC,GAAH,SAAYA,IAAOmnD,KAG/C,SAASC,GAAyB15C,EAAqB5W,GAAsB,MAClF,QAAOA,IAAUA,EAAQuwD,cAAR,WAAuB7L,EAAAA,EAAAA,IAAW9tC,EAAQ5W,EAAQsJ,eAAlD,aAAuB,EAAoCinD,cAGvE,SAASC,GAA0B55C,EAAqBtN,EAAgByoC,GAAuB,MACpG,cAAI2S,EAAAA,EAAAA,IAAW9tC,EAAQtN,UAAvB,OAAI,EAA4BinD,YAC9B,OAAO,EAGT,IAAKxe,EACH,OAAO,EAGT,MAAMf,EAAWgP,EAAmBppC,EAAQtN,GAE5C,OAAOyoC,EAAWpkC,MAAMnO,IAAD,uBAAewxC,EAASxxC,UAAxB,aAAe,EAAqB+wD,eAGtD,SAASE,GAAuB75C,EAAqBtN,GAC1D,MAAM+C,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAC1BtJ,EAAUqM,IAAQu5B,EAAAA,EAAAA,IAAcv5B,GAAQuK,EAAOo6B,SAASkS,kBAAkB55C,QAAUyB,EAE1F,OAAO/K,GAAWA,EAAQ0wD,WAAa1tD,KAAKoP,MAAMvQ,KAAKC,MAAQ,KAAQ9B,OAAU+K,EAG5E,SAAS4lD,GAAsB/5C,EAAqBtN,GAAgB,UACzE,GAAIA,IAAW6Z,EAAAA,GAA+B,OAE9C,MAAM4mC,GAAYztB,EAAAA,EAAAA,IAAShzB,GACrBsnD,EAAe,UAAGh6C,EAAOwqB,iBAAV,aAAG,EAAkBwvB,iBACpC,mBAAEC,GAAuBj6C,EAC/B,IAAKg6C,GAAoBC,MAAAA,IAAAA,EAAoBljD,MAC1Cua,GAAMA,EAAE4oC,WAAaF,IAAoB1oC,EAAE6oC,aAE5C,OAGF,GAAIhH,EACF,OAAO6G,EAGT,MAAMI,EAAgB,WAAGtM,EAAAA,EAAAA,IAAW9tC,EAAQtN,UAAtB,iBAAG,EAA4B8zB,gBAA/B,aAAG,EAAsC4zB,iBAC/D,OAAKA,MAAAA,GAAAA,EAAkBhmD,SAAS4lD,GAIzBA,OAJP,EAQK,SAASK,GAAmBr6C,GACjC,MAAM,OAAEtN,EAAF,SAAU29B,GAAasa,EAAyB3qC,IAAW,GACjE,IAAKtN,IAAW29B,EACd,OAGF,MAAM8K,EAAa2V,EAAkB9wC,EAAQtN,EAAQ29B,EAAU,eAC/D,OAAK8K,EAIEA,EAAWzmC,KAAK9L,IACrB,MAAM,SAAEmtC,GAAakV,EAAkBjrC,EAAQtN,EAAQ9J,IAAc,GACrE,OAAOmtC,GAAW71B,EAAAA,EAAAA,IAAWF,EAAQ+1B,QAAY5hC,KAChDS,OAAOhD,cAPV,EC/4BK,SAAS0oD,GAAwBt6C,GACtC,MAAM,OAAEtN,EAAF,SAAU29B,GAAasa,EAAyB3qC,IAAW,GACjE,IAAKtN,IAAW29B,EACd,OAGF,MAAM+U,GAAgB5J,EAAAA,EAAAA,IAAmB9oC,EAAQ29B,GAC3CkqB,EAAgBv6C,EAAOslC,gBAAgBC,gBAAgBH,GAC7D,OAAKmV,GAAkBA,EAAcvqC,SAI9BuqC,OAJP,EAOK,SAASC,GAAyBx6C,GACvC,MAAM,OAAEtN,GAAWi4C,EAAyB3qC,IAAW,GACvD,GAAKtN,EAIL,OAAOsN,EAAO6lC,iBAAiBC,SAASpzC,GCnBnC,SAAS+nD,GAAiBz6C,EAAqBtN,GACpD,OAAOsN,EAAOumC,WAAWT,SAASpzC,GAiB7B,SAASgoD,GAA4B16C,GAC1C,MAAM,OAAEtN,EAAF,SAAU29B,GAAasa,EAAyB3qC,IAAW,GACjE,IAAKtN,IAAW29B,EACd,OAGF,IAAI3K,EAAAA,EAAAA,IAAShzB,GACX,MAAO,OAGT,MAAM+C,GAAOq4C,EAAAA,EAAAA,IAAW9tC,EAAQtN,GAChC,OAAK+C,GAIDo5B,EAAAA,EAAAA,IAAYp5B,GACP,QAGF,eARP,EC1BK,SAASklD,GAAwB36C,GACtC,MAAM,YAAE46C,GAAgB56C,EACxB,OAAOpO,QAAQgpD,EAAYhyD,WAAagyD,EAAYC,eAG/C,SAASC,GAA4B96C,GAC1C,OHkmBK,SAAiCA,GACtC,MAAM,YAAE+6C,GAAgB/6C,EACxB,OAAOpO,QAAQmpD,EAAYnyD,WGpmBpBoyD,CAAwBh7C,GAC7Bi7C,EAAAA,GAAAA,aACGC,EAAAA,IAA2BZ,GAAwBt6C,GACtDi7C,EAAAA,GAAAA,ODRG,SAAiCj7C,GACtC,MAAM,OAAEtN,EAAF,SAAU29B,GAAasa,EAAyB3qC,IAAW,GACjE,IAAKtN,IAAW29B,EACd,OAGF,MAAM8qB,EAAoBn7C,EAAOumC,WAAWT,SAASpzC,GACrD,OAAKyoD,GAAsBA,EAAkBnrC,SAItCmrC,OAJP,ECEIC,CAAwBp7C,GAC1Bi7C,EAAAA,GAAAA,gBAC+C9mD,IAA7Cu7C,EAA2B1vC,GAAQT,MACrC07C,EAAAA,GAAAA,mBAC2C9mD,IAAzCw7C,EAAuB3vC,GAAQT,MACjC07C,EAAAA,GAAAA,UACEj7C,EAAOq7C,yBAA2BC,EAAAA,GAAAA,OACpCL,EAAAA,GAAAA,cACEj7C,EAAOu7C,iBAAmB5Q,EAAyB3qC,GACrDi7C,EAAAA,GAAAA,cACE9mD,EAGC,SAASqnD,GAAyBx7C,GACvC,YAA+C7L,IAAxC2mD,GAA4B96C,GAG9B,SAASmtB,GAAYntB,GAC1B,MAAM,MAAE2tB,EAAF,qBAAS8tB,GAAyBz7C,EAAO0mB,SAAS+B,MAExD,OAAOgzB,GAAuBC,EAAAA,EAAAA,MAAmB/tB,ECrC5C,SAASguB,GAA+B37C,GAC7C,OAAOA,EAAOikC,aAAa1kC,MCDtB,SAASq8C,GAAoB57C,GAClC,OAAOA,EAAOknC,QAAQx0C,OAGjB,SAASmpD,GAAuB77C,GACrC,OAAOA,EAAOknC,QAAQt+C,UAGjB,SAASkzD,GAAoB97C,GAClC,OAAOA,EAAOknC,QAAQ6U,OAGjB,SAASC,GAAuBh8C,GACrC,OAAOA,EAAOknC,QAAQE,UAGjB,SAAS6U,GAA6Bj8C,GAC3C,OAAOA,EAAOknC,QAAQgV,aAAel8C,EAAOknC,QAAQgV,aAAaC,oBAAiBhoD,EAG7E,SAASioD,GAAwBp8C,GACtC,OAAOA,EAAOknC,QAAQU,kBCrBjB,SAASnd,GAAqBzqB,GACnC,OAAOA,EAAO0mB,SAAS+B,MAGlB,SAAS4zB,GAAuBr8C,GACrC,OAAOA,EAAO0mB,SAASmL,mB,eCJlB,SAAS3xB,EAAWF,EAAqB/B,GAC9C,OAAO+B,EAAOmlB,MAAMC,KAAKnnB,GAGpB,SAASq+C,EAAiBt8C,EAAqB/B,GACpD,OAAO+B,EAAOmlB,MAAMye,aAAa3lC,GAG5B,SAASs+C,EAAoBv8C,EAAqB/B,GAAgB,MACvE,MAAMtJ,EAAOuL,EAAWF,EAAQ/B,GAEhC,OAAOtJ,MAAAA,GAAP,UAAOA,EAAM6xB,gBAAb,aAAO,EAAgBkd,UAWlB,SAASuV,EAA0Bj5C,EAAqBC,GAC7D,OAAOD,EAAO2iC,aAAe3iC,EAAO2iC,YAAYjF,QAAQtpC,SAAS6L,EAAW3N,I,6DCnBvE,IAAKkqD,EAMAC,EA8IAC,EA0DAC,EAYAC,EASA3B,EAUA4B,EAYAC,EAMAC,EAOA12B,EAOA22B,EAsBA1B,EAWA2B,EAMAC,E,kKApTAV,GAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,OAAAA,GAAAA,S,CAAAA,IAAAA,EAAAA,K,SAMAC,GAAAA,EAAAA,EAAAA,GAAAA,GAAAA,KAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,OAAAA,GAAAA,S,CAAAA,IAAAA,EAAAA,K,SA8IAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,cAAAA,GAAAA,gBAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,wBAAAA,EAAAA,EAAAA,2BAAAA,GAAAA,6BAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,gBAAAA,IAAAA,kBAAAA,EAAAA,EAAAA,oBAAAA,IAAAA,sBAAAA,EAAAA,EAAAA,kBAAAA,IAAAA,oBAAAA,EAAAA,EAAAA,kBAAAA,IAAAA,oBAAAA,EAAAA,EAAAA,kCAAAA,IAAAA,oCAAAA,EAAAA,EAAAA,iCAAAA,IAAAA,mCAAAA,EAAAA,EAAAA,+BAAAA,IAAAA,iCAAAA,EAAAA,EAAAA,8BAAAA,IAAAA,gCAAAA,EAAAA,EAAAA,mCAAAA,IAAAA,qCAAAA,EAAAA,EAAAA,kCAAAA,IAAAA,oCAAAA,EAAAA,EAAAA,iCAAAA,IAAAA,mCAAAA,EAAAA,EAAAA,gCAAAA,IAAAA,kCAAAA,EAAAA,EAAAA,iCAAAA,IAAAA,mCAAAA,EAAAA,EAAAA,gCAAAA,IAAAA,kCAAAA,EAAAA,EAAAA,sBAAAA,IAAAA,wBAAAA,EAAAA,EAAAA,oBAAAA,IAAAA,sBAAAA,EAAAA,EAAAA,QAAAA,IAAAA,UAAAA,EAAAA,EAAAA,oBAAAA,IAAAA,sBAAAA,EAAAA,EAAAA,kBAAAA,IAAAA,oBAAAA,EAAAA,EAAAA,8BAAAA,IAAAA,gCAAAA,EAAAA,EAAAA,qBAAAA,IAAAA,uBAAAA,EAAAA,EAAAA,iCAAAA,IAAAA,mCAAAA,EAAAA,EAAAA,qBAAAA,IAAAA,uBAAAA,EAAAA,EAAAA,iCAAAA,IAAAA,mCAAAA,EAAAA,EAAAA,cAAAA,IAAAA,gBAAAA,EAAAA,EAAAA,iBAAAA,IAAAA,mBAAAA,EAAAA,EAAAA,wBAAAA,IAAAA,0BAAAA,EAAAA,EAAAA,qBAAAA,IAAAA,uBAAAA,EAAAA,EAAAA,sBAAAA,IAAAA,wBAAAA,EAAAA,EAAAA,0BAAAA,IAAAA,4BAAAA,EAAAA,EAAAA,aAAAA,IAAAA,eAAAA,EAAAA,EAAAA,2BAAAA,IAAAA,6BAAAA,EAAAA,EAAAA,uBAAAA,IAAAA,yBAAAA,EAAAA,EAAAA,2BAAAA,IAAAA,6BAAAA,EAAAA,EAAAA,wBAAAA,IAAAA,0BAAAA,EAAAA,EAAAA,aAAAA,IAAAA,eAAAA,EAAAA,EAAAA,kCAAAA,IAAAA,oCAAAA,EAAAA,EAAAA,mBAAAA,IAAAA,qBAAAA,EAAAA,EAAAA,uBAAAA,IAAAA,yBAAAA,EAAAA,EAAAA,qBAAAA,IAAAA,uBAAAA,EAAAA,EAAAA,cAAAA,IAAAA,gB,CAAAA,IAAAA,EAAAA,K,SA0DAC,GAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,aAAAA,GAAAA,eAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,gBAAAA,GAAAA,kBAAAA,EAAAA,EAAAA,gBAAAA,GAAAA,kBAAAA,EAAAA,EAAAA,cAAAA,GAAAA,gBAAAA,EAAAA,EAAAA,cAAAA,GAAAA,gB,CAAAA,IAAAA,EAAAA,K,SAYAC,GAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,MAAAA,GAAAA,Q,CAAAA,IAAAA,EAAAA,K,SASA3B,GAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,cAAAA,GAAAA,gBAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,cAAAA,GAAAA,gB,CAAAA,IAAAA,EAAAA,K,SAUA4B,GAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,gBAAAA,GAAAA,kBAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,cAAAA,GAAAA,gBAAAA,EAAAA,EAAAA,eAAAA,GAAAA,iBAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,eAAAA,GAAAA,iBAAAA,EAAAA,EAAAA,aAAAA,GAAAA,e,CAAAA,IAAAA,EAAAA,K,SAYAC,GAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,OAAAA,GAAAA,S,CAAAA,IAAAA,EAAAA,K,SAMAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,MAAAA,GAAAA,Q,CAAAA,IAAAA,EAAAA,K,SAOA12B,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,MAAAA,GAAAA,Q,CAAAA,IAAAA,EAAAA,K,SAOA22B,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,MAAAA,GAAAA,Q,CAAAA,IAAAA,EAAAA,K,SAsBA1B,GAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,QAAAA,GAAAA,U,CAAAA,IAAAA,EAAAA,K,SAWA2B,GAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,WAAAA,GAAAA,a,CAAAA,IAAAA,EAAAA,K,SAMAC,GAAAA,EAAAA,EAAAA,aAAAA,GAAAA,eAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,EAAAA,EAAAA,YAAAA,GAAAA,cAAAA,EAAAA,EAAAA,SAAAA,GAAAA,W,CAAAA,IAAAA,EAAAA,KAOL,MAAMn2B,EAA2B,2BAEjC,IAAKo2B,G,SAAAA,GAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,gBAAAA,GAAAA,kBAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,iBAAAA,GAAAA,mBAAAA,EAAAA,EAAAA,kBAAAA,GAAAA,oBAAAA,EAAAA,EAAAA,2BAAAA,GAAAA,6BAAAA,EAAAA,EAAAA,qBAAAA,GAAAA,uBAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,mBAAAA,IAAAA,qBAAAA,EAAAA,EAAAA,gBAAAA,IAAAA,kBAAAA,EAAAA,EAAAA,mBAAAA,IAAAA,qBAAAA,EAAAA,EAAAA,aAAAA,IAAAA,eAAAA,EAAAA,EAAAA,eAAAA,IAAAA,iBAAAA,EAAAA,EAAAA,QAAAA,IAAAA,UAAAA,EAAAA,EAAAA,WAAAA,IAAAA,aAAAA,EAAAA,EAAAA,UAAAA,IAAAA,YAAAA,EAAAA,EAAAA,WAAAA,IAAAA,aAAAA,EAAAA,EAAAA,aAAAA,IAAAA,e,CAAAA,IAAAA,EAAAA,M,0EC9TZ,IAAIC,EAEG,SAASC,EAAcC,EAAgBC,GACvCA,IACCH,IAAoBA,EAAgBI,cACtCJ,EAAgBI,aAAc,GAIhCJ,EADAG,EAAW,CAAEC,aAAa,KAIvBD,EAAUC,aAAeF,MAC5Bx9B,EAAAA,EAAAA,KAAQ,KACNu9B,EAAcC,EAAMC,MAKnB,SAASE,EAAQH,GAClBA,MACFx9B,EAAAA,EAAAA,KAAQ,KACN29B,EAAQH,MAgBP,MAAMI,EAAkB,CAC7BC,OAASpwD,GAAcA,EACvBqwD,OAASrwD,GAAcA,GAAK,MAC5BswD,QAAUtwD,GAAc,GAAK,EAAIA,GAAK,OACtCuwD,UAAYvwD,GAAc,IAAOnB,KAAK2xD,KAAKxwD,EAAI,IAAOnB,KAAK4xD,IAAM,GACjEC,WAAa1wD,GAAcA,EAAIA,EAC/B2wD,YAAc3wD,GAAcA,GAAK,EAAIA,GACrC4wD,cAAgB5wD,GAAeA,EAAI,GAAM,EAAIA,EAAIA,GAAU,EAAI,EAAIA,GAAKA,EAAlB,EACtD6wD,YAAc7wD,GAAcA,EAAIA,EAAIA,EACpC8wD,aAAe9wD,KAAiBA,EAAKA,EAAIA,EAAI,EAC7C+wD,eAAiB/wD,GAAeA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,EAChGgxD,YAAchxD,GAAcA,EAAIA,EAAIA,EAAIA,EACxCixD,aAAejxD,GAAc,KAAOA,EAAKA,EAAIA,EAAIA,EACjDkxD,eAAiBlxD,GAAeA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,IAAOA,EAAKA,EAAIA,EAAIA,EACtFmxD,YAAcnxD,GAAcA,EAAIA,EAAIA,EAAIA,EAAIA,EAC5CoxD,aAAepxD,GAAc,IAAOA,EAAKA,EAAIA,EAAIA,EAAIA,EACrDqxD,eAAiBrxD,GAAeA,EAAI,GAAM,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAQA,EAAKA,EAAIA,EAAIA,EAAIA,GAG3F,SAASsxD,EAAT,GAOgB,IAPO,OAC5BC,EAASpB,EAAgBC,OADG,SAE5B51D,EAF4B,SAG5B2mB,EAH4B,MAI5BC,EAJ4B,KAK5BrL,EAL4B,GAM5BgqC,GACqB,EACrB,MAAMyR,EAAK9zD,KAAKC,MAChB,IAAI8zD,GAAW,EAkBf,OAhBAvB,GAAQ,KACN,GAAIuB,EAAU,OAAO,EAErB,IAAIzxD,GADOtC,KAAKC,MACF6zD,GAAMrwC,EAChBnhB,EAAI,IAAGA,EAAI,GACf,MAAM64B,EAAW04B,EAAOvxD,GACxB,GAAoB,iBAAT+V,GAAmC,iBAAPgqC,EACrCvlD,EAASub,GAASgqC,EAAKhqC,GAAQ8iB,QAC1B,GAAIrwB,MAAMC,QAAQsN,IAASvN,MAAMC,QAAQs3C,GAAK,CACnD,MAAMh1C,EAASgL,EAAK5O,KAAI,CAACuqD,EAAGlyD,IAAMkyD,GAAM3R,EAAGvgD,GAAKkyD,GAAK74B,IACrDr+B,EAASuQ,GAGX,OADU,IAAN/K,GAAWohB,GAAOA,IACfphB,EAAI,KAGN,KACLyxD,GAAW,EACPrwC,GAAOA,O,8CC1FR,SAAS8V,EAAey6B,GACe,mBAAjC31D,OAAOw5B,UAAUo8B,aAI5B51D,OAAOw5B,UAAUo8B,YAAYD,GAAar0D,OAAOZ,IAC3ChC,EAAAA,IAEFC,QAAQW,MAAMoB,Q,cCVL,SAASs2B,EAAqB6+B,EAA0BC,GACrE,GAAID,IAAiBC,EACnB,OAAO,EAGT,MAAMC,EAAc70D,OAAO6rB,KAAK8oC,GAC1BG,EAAoBD,EAAY1yD,OAGtC,GAAI2yD,IAFkB90D,OAAO6rB,KAAK+oC,GAAUzyD,OAG1C,OAAO,EAGT,GAA0B,IAAtB2yD,EACF,OAAO,EAGT,IAAK,IAAIxyD,EAAI,EAAGA,EAAIwyD,EAAmBxyD,IAAK,CAC1C,MAAMyyD,EAAOF,EAAYvyD,GACzB,GAAIqyD,EAAaI,KAAUH,EAASG,GAClC,OAAO,EAIX,OAAO,EAGF,SAASp/B,EAAgBg/B,EAA0BC,GACxD,MAAMC,EAAc70D,OAAO6rB,KAAK8oC,GAIhC,OAH0BE,EAAY1yD,SAChBnC,OAAO6rB,KAAK+oC,GAAUzyD,OAGnC,CAAC,YAGH0yD,EAAY3nD,QAAO,CAACioB,EAAK4/B,KAC1BJ,EAAaI,KAAUH,EAASG,IAClC5/B,EAAIhyB,KAAM,GAAE4xD,MAASJ,EAAaI,SAAYH,EAASG,MAGlD5/B,IACN,I,yCCvCU,SAASpvB,IAAgC,2BAAdmI,EAAc,yBAAdA,EAAc,gBACtD,OAAOA,EAAM/D,OAAOhD,SAASzD,KAAK,KAG7B,SAASyM,EAAuBojB,GACrC,OAAO,SAACyhC,GACN,MAAMC,EAA2B,MAAhBD,EAAsBzhC,EAAiB,GAAEA,MAAkByhC,IADd,2BAAhCE,EAAgC,iCAAhCA,EAAgC,kBAG9D,OAAOA,EAAUhoD,QAAiB,CAAC8e,EAAKmpC,KAClCA,IAEE7pD,MAAMC,QAAQ4pD,GAChBnpC,EAAI7oB,QAAQgyD,GAEZnpC,EAAI7oB,KAAM,GAAE8xD,MAAaE,MAItBnpC,IACN,CAACipC,IAAWvxD,KAAK,M,gGCrBxB,MAAMm2B,EAAWu7B,KAAKC,OAEf,IAAKC,EAML50D,eAAe60D,EACpBC,EAAmBlmC,EAAavxB,GAChC,IAD4C03D,EAC5C,wDACA,GAAK57B,EAIL,IAEE,MAAM67B,EAAU,IAAIC,QAAQrmC,EAAIlrB,QAAQ,KAAM,MACxCwxD,QAAc/7B,EAASg8B,KAAKL,GAC5Bj3D,QAAiBq3D,EAAM1xD,MAAMwxD,GACnC,IAAKn3D,EACH,OAGF,MAAMoyC,EAAcpyC,EAASu3D,QAAQ53D,IAAI,gBAEzC,OAAQH,GACN,KAAKu3D,EAAKpjC,KACR,aAAa3zB,EAASoG,OACxB,KAAK2wD,EAAKS,KAAM,CAEd,GAAIzmC,EAAIzf,WAAW,WAAa8gC,GAAeA,EAAY9gC,WAAW,QACpE,OAGF,MAAMmmD,QAAaz3D,EAASy3D,OACtBC,GAAkBD,EAAKj4D,OAAU03D,GAAiBO,EAAKj4D,KAAK4L,SAAS,QAE3E,IAAIusD,EAAeF,EAAKj4D,MAAQ4yC,EAEhC,OAAMslB,GAAkBC,GAKnBT,IACHS,EAAeA,EAAa9xD,QAAQ,SAAU,KAGzC,IAAI2xD,KAAK,CAACC,GAAO,CAAEj4D,KAAMm4D,KARvBF,EAUX,KAAKV,EAAKa,KACR,aAAa53D,EAAS63D,OACxB,QACE,QAEJ,MAAO52D,GAGP,YADA/B,QAAQ4B,KAAKG,IAKVkB,eAAe21D,EAAKb,EAAmBlmC,EAAaxxB,GACzD,GAAK+7B,EAIL,IACE,MAAMy8B,EAA4B,iBAATx4D,GAAqBA,aAAgBi4D,KAAOj4D,EAAO6jC,KAAKG,UAAUhkC,GAErF43D,EAAU,IAAIC,QAAQrmC,EAAIlrB,QAAQ,KAAM,MACxC7F,EAAW,IAAIg4D,SAASD,GACxBV,QAAc/7B,EAASg8B,KAAKL,GAClC,aAAaI,EAAMY,IAAId,EAASn3D,GAChC,MAAOiB,GAGP,YADA/B,QAAQ4B,KAAKG,IAKVkB,eAAe+1D,EAAMjB,GAC1B,IACE,IAAK37B,EACH,OAGF,aAAaA,EAASv5B,OAAOk1D,GAC7B,MAAOh2D,GAGP,YADA/B,QAAQ4B,KAAKG,K,SAzFL81D,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,KAAAA,GAAAA,O,CAAAA,IAAAA,EAAAA,M,eCHL,SAASoB,IACd,MAAMrgC,EAAiC,GAUvC,SAASwB,EAAe3U,GACtB,MAAMzX,EAAQ4qB,EAAUtvB,QAAQmc,IACjB,IAAXzX,GACF4qB,EAAUhzB,OAAOoI,EAAO,GAc5B,MAAO,CACL0rB,aAXF,WAAsC,2BAAbj4B,EAAa,yBAAbA,EAAa,gBACpCm3B,EAAU7qB,SAAShN,IACjBA,KAAYU,OAUd04B,YA3BF,SAAqB1U,GAGnB,OAFAmT,EAAUlzB,KAAK+f,GAER,KACL2U,EAAe3U,KAwBjB2U,eAAAA,EACA8+B,aARF,WACE,OAAOxvD,QAAQkvB,EAAUl0B,U,+DCrBd,SAASoY,EAAsB8P,GAC5C,OAAOusC,EAAAA,EAAAA,GAAwB,CAAEC,MAAOxsC,M,+BCA1C,MAAMysC,EAAgD,CACpDC,MAAO,UACPC,UAAW,cACXC,OAAQ,WACRC,IAAK,QACLC,OAAQ,QACRC,QAAS,OACTC,UAAW,SACXC,UAAW,SACXC,WAAY,UACZC,IAAK,SAGDC,EAA2C,CAC/CC,QAAS,GACTC,SAAU,GACVC,YAAa,GACbf,MAAO,GACPgB,KAAM,GACNC,OAAQ,GACRC,OAAQ,GACRC,QAAS,GACTC,MAAO,IAGM,SAASC,EAAyBpvD,GAiB/C,OAhBKqvD,KACHxxD,SAAS9I,iBAAiB,UAAW+c,GAAe,GAGrD5a,OAAO6rB,KAAK/iB,GAAgC0C,SAAS4sD,IACpD,MAAM/tC,EAAUvhB,EAAQsvD,GACxB,IAAK/tC,EACH,OAGF,MAAMguC,EAAuBZ,EAASW,GAClCC,GACFA,EAAqBl1D,KAAKknB,MAIvB,MAyBT,SAAiCvhB,GAC9B9I,OAAO6rB,KAAK/iB,GAAgC0C,SAAS4sD,IACpD,MAAM/tC,EAAUvhB,EAAQsvD,GAClBC,EAAuBZ,EAASW,GACtC,GAAIC,EAAsB,CACxB,MAAM5sD,EAAQ4sD,EAAqBzxC,WAAW1D,GAAOA,IAAOmH,KAC7C,IAAX5e,GACF4sD,EAAqBh1D,OAAOoI,EAAO,OAKpC0sD,KACHxxD,SAAS8d,oBAAoB,UAAW7J,GAAe,GArCvD09C,CAAwBxvD,IAI5B,SAASqvD,IACP,OAAOn4D,OAAO+rB,OAAO0rC,GAAUnrD,MAAMisD,GAAgBpxD,QAAQoxD,EAAYp2D,UAG3E,SAASyY,EAActV,GACrB,MAAM8yD,EAActB,EAAiBxxD,EAAEgqB,KACvC,IAAK8oC,EACH,OAGF,MAAM,OAAEj2D,GAAWs1D,EAASW,GACvBj2D,IAGLmD,EAAEoL,mBAGF2Z,EADgBotC,EAASW,GAAaj2D,EAAS,IACtCmD,M,wLCnEX,MAAMkzD,EAAgB,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YACnFC,EAAc,CAClB,UAAW,WAAY,QAAS,QAAS,MAAO,OAChD,OAAQ,SAAU,YAAa,UAAW,WAAY,YAGlDC,EAAwBD,EAAYxuD,KAAK0uD,GAAUA,EAAMzpD,gBAIlD0pD,EAAsB,MAE5B,SAASC,EAAQzvB,GACtB,OAAO0vB,EAAY,IAAIt4D,QAAYs4D,EAAY1vB,GAG1C,SAAS0vB,EAAYC,GAC1B,MAAM3vB,EAAO,IAAI5oC,KAAKu4D,GAEtB,OADA3vB,EAAKkJ,SAAS,EAAG,EAAG,EAAG,GAChBlJ,EAGF,SAAS4vB,EAAcD,GAC5B,OAAOD,EAAYC,GAAU7mB,UAGxB,SAAS+mB,EAAYC,GAC1B,MAAM9vB,EAAO,IAAI5oC,KAAiB,IAAZ04D,GACtB,MAAQ,GAAE9vB,EAAK+vB,iBAAiB/vB,EAAKgwB,aAGvC,SAASC,EAAYjwB,GACnB,MAAQ,GAAEA,EAAK+vB,iBAAiB/vB,EAAKgwB,WAAa,KAAKhwB,EAAKqJ,YAIvD,SAAS5L,EAAWr+B,EAAcuwD,GACvC,MAAM3vB,EAA2B,iBAAb2vB,EAAwB,IAAIv4D,KAAKu4D,GAAYA,EAC3Dr5B,EAAal3B,EAAKk3B,YAAc,MAEtC,IAAI45B,EAAQlwB,EAAKmwB,WACbC,EAAS,GAMb,MALmB,QAAf95B,IACF85B,EAASF,GAAS,GAAK,MAAQ,MAC/BA,EAAQA,EAAQ,GAAKA,EAAQ,GAAKA,GAG5B,GAAEh2D,OAAOg2D,GAAOG,SAAS,EAAG,QAAQn2D,OAAO8lC,EAAKswB,cAAcD,SAAS,EAAG,OAAOD,IAGpF,SAASG,EAAoBnxD,EAAcuwD,GAChD,MAAM3vB,EAA2B,iBAAb2vB,EAAwB,IAAIv4D,KAAKu4D,GAAYA,EAE3D1mB,EAAQymB,EAAY,IAAIt4D,MAC9B,GAAI4oC,GAAQiJ,EACV,OAAOxL,EAAWr+B,EAAM4gC,GAG1B,MAAMwwB,EAAU,IAAIp5D,KAAK6xC,GAEzB,GADAunB,EAAQpnB,QAAQH,EAAMI,UAAY,GAC9BrJ,GAAQwwB,EACV,OAAOpxD,EAAM,gBAAegwD,EAAcpvB,EAAKywB,aAGjD,MAAMC,EAAW1wB,EAAK+vB,gBAAkB9mB,EAAM8mB,cACxCY,EACJvxD,EAAKsxD,EAAW,yBAA2B,wBACvCA,EAAW,aAAe,SAGhC,OAAOE,EAAWxxD,EAAM4gC,EAAM2wB,GAGzB,SAASrnB,EAAelqC,EAAcuwD,GAC3C,MAAM3vB,EAA2B,iBAAb2vB,EAAwB,IAAIv4D,KAAKu4D,GAAYA,EAC3DgB,EAASvxD,EAAK,qBAAuB,aAE3C,OAAOwxD,EAAWxxD,EAAM4gC,EAAM2wB,GAGzB,SAASE,EAAmBzxD,EAAc4gC,GAA6B,IAAjB8wB,EAAiB,wDAC5E,MAAMH,EAASvxD,EAAK0xD,EAAU,sBAAwB,uBAAyB,WAE/E,OAAOF,EAAWxxD,EAAM4gC,EAAM2wB,GAGzB,SAASI,EACd3xD,EACA4xD,GAEA,MAAMC,EAAO14D,KAAKC,MAAMw4D,EAASxB,GACjC,OAAIwB,EAAS,EACJ,EACEC,EAAO,EACTC,EAAoBF,EAAS,KAC3BC,EAAO,EACT7xD,EAAK,OAAQ6xD,GACXA,EAAO,GACT7xD,EAAK,QAAS7G,KAAKC,MAAMy4D,EAAO,IAC9BA,EAAO,IACT7xD,EAAK,SAAU7G,KAAKC,MAAMy4D,EAAO,KAEjC7xD,EAAK,QAAS7G,KAAKC,MAAMy4D,EAAO,MAIpC,SAASE,EACd/xD,EACAuwD,GAIA,IAHAmB,EAGA,wDAFAM,EAEA,wDADAC,EACA,uCACA,MAAMrxB,EAA2B,iBAAb2vB,EAAwB,IAAIv4D,KAAKu4D,GAAYA,EAE3D1mB,EAAQymB,EAAY,IAAIt4D,MAE9B,IAAKg6D,EAAY,CACf,GAAInB,EAAYjwB,KAAUiwB,EAAYhnB,GACpC,OAAQooB,IAAiBP,EAAUQ,EAAaC,GAAYnyD,EAAK,kBAGnE,MAAM+pC,EAAY,IAAI/xC,KAAK6xC,GAE3B,GADAE,EAAUC,QAAQH,EAAMI,UAAY,GAChC4mB,EAAYjwB,KAAUiwB,EAAY9mB,GACpC,OAAQkoB,IAAiBP,EAAUQ,EAAaC,GAAYnyD,EAAK,sBAGnE,MAAMoxD,EAAU,IAAIp5D,KAAK6xC,GACnBuoB,EAAY,IAAIp6D,KAAK6xC,GAG3B,GAFAunB,EAAQpnB,QAAQH,EAAMI,UAAY,GAClCmoB,EAAUpoB,QAAQH,EAAMI,UAAY,GAChCrJ,GAAQwwB,GAAWxwB,GAAQwxB,EAAW,CACxC,MAAMC,EAAUrC,EAAcpvB,EAAKywB,UAGnC,OAAQY,IAAiBP,EAAUQ,EAAaC,GAFhBnyD,EAAV0xD,EAAgB,gBAAeW,IAAmB,WAAUA,OAMtF,MAAMf,EAAW1wB,EAAK+vB,gBAAkB9mB,EAAM8mB,cACxC2B,EAAYZ,EACbJ,EAAW,yBAA2B,qBACtCA,EAAW,eAAiB,WAC3BC,EAASvxD,EAAKsyD,IAAc,cAElC,OAAQL,IAAiBP,EAAUQ,EAAaC,GAAYX,EAAWxxD,EAAM4gC,EAAM2wB,IAGrF,SAASC,EAAWxxD,EAAc4gC,EAAY2wB,GAC5C,MAAMgB,EAAM3xB,EAAKqJ,UACXuoB,EAAa5xB,EAAKgwB,WAExB,OAAOW,EACJ31D,QAAQ,OAAQoE,EAAKiwD,EAAYuC,KACjC52D,QAAQ,OAAQoE,EAAM,YAAWiwD,EAAYuC,OAC7C52D,QAAQ,MAAOoE,EAAM,cAAaiwD,EAAYuC,OAC9C52D,QAAQ,KAAMd,OAAO03D,EAAa,GAAGvB,SAAS,EAAG,MACjDr1D,QAAQ,KAAMd,OAAOy3D,GAAKtB,SAAS,EAAG,MACtCr1D,QAAQ,IAAKd,OAAOy3D,IACpB32D,QAAQ,OAAQd,OAAO8lC,EAAK+vB,gBAE5B/0D,QAAQ,QAAS,MAGf,SAAS62D,EACdzyD,EACAuwD,EACA0B,GAEA,MAAMrxB,EAA2B,iBAAb2vB,EAAwB,IAAIv4D,KAAKu4D,GAAYA,EAEjE,MAAQ,GAAEwB,EAAgB/xD,EAAM4gC,GAAM,OAAM1/B,EAAW+wD,OAAkB5zB,EAAWr+B,EAAM4gC,KAGrF,SAASkxB,EAAoBr2C,EAAkBi3C,GACpD,MAAM5B,EAAQ33D,KAAKC,MAAMqiB,EAAW,MAC9Bk3C,EAAUx5D,KAAKC,MAAOqiB,EAAW,KAAQ,IACzCm3C,EAAUz5D,KAAKC,MAAMqiB,EAAW,KAAO,IAEvCo3C,EAAWH,EAAWv5D,KAAKC,MAAMs5D,EAAW,MAAQ,EACpDI,EAAaJ,EAAWv5D,KAAKC,MAAOs5D,EAAW,KAAQ,IAAM,EACnE,IAAIK,EAAS,GAWb,OAVIjC,EAAQ,GAAK+B,EAAW,GAC1BE,GAAW,GAAEj4D,OAAOg2D,GAAOG,SAAS,EAAG,QACvC8B,GAAW,GAAEj4D,OAAO63D,GAAS1B,SAAS,EAAG,SAEzC8B,GADSD,GAAc,GACZ,GAAEh4D,OAAO63D,GAAS1B,SAAS,EAAG,QAE9B,GAAEn2D,OAAO63D,MAEtBI,GAAUj4D,OAAO83D,GAAS3B,SAAS,EAAG,KAE/B8B,EAGF,SAASC,EAA0BC,GACxC,MAAMvtD,EAAQ,GAEd,IAAIwtD,EAAeD,EAAe,IAClCA,GAAgBC,EAChBA,EAAe/5D,KAAKC,MAAM85D,EAAe,IAGzC,MAAMN,GADNK,EAAe95D,KAAKC,MAAM65D,EAAe,MACV,GAC/BA,GAAgBL,EAGhB,MAAMD,GADNM,EAAe95D,KAAKC,MAAM65D,EAAe,KACV,GAC/BA,GAAgBN,EAGhB,MAAM7B,GADNmC,EAAe95D,KAAKC,MAAM65D,EAAe,KACZ,GAQ7B,OANInC,EAAQ,GACVprD,EAAM/K,KAAKG,OAAOg2D,GAAOG,SAAS,EAAG,MAEvCvrD,EAAM/K,KAAKG,OAAO63D,GAAS1B,SAASH,EAAQ,EAAI,EAAI,EAAG,MACvDprD,EAAM/K,KAAKG,OAAO83D,GAAS3B,SAAS,EAAG,MAE/B,GAAEvrD,EAAMxK,KAAK,QAAQJ,OAAOo4D,GAAcjC,SAAS,EAAG,OAGzD,SAAS7yB,EAAmBmyB,GAA2C,IAAlB4C,EAAkB,uDAAT,QACnE,MAAMvyB,EAA2B,iBAAb2vB,EAAwB,IAAIv4D,KAAKu4D,GAAYA,EACjE,OAAO3vB,EAAKwyB,eACVD,EACA,CACEE,KAAM,UACNlD,MAAO,QACPoC,IAAK,YAKJ,SAASe,EAAuB/C,GAA2C,IAAlB4C,EAAkB,uDAAT,QACvE,MAAMvyB,EAA2B,iBAAb2vB,EAAwB,IAAIv4D,KAAKu4D,GAAYA,EACjE,OAAO3vB,EAAKwyB,eACVD,EACA,CACEE,KAAM,UACNlD,MAAO,QACPoC,IAAK,UACLgB,KAAM,UACNC,OAAQ,UACRC,OAAQ,YAKd,SAASC,EAAYnB,EAAapC,GAAqC,IAAtBkD,EAAsB,uDAAf,KACtD,GAAIlD,EAASwD,IAA0BpB,EAnPhB,GAoPrB,OAAO,EAET,MAAM3xB,EAAO,IAAI5oC,KAAKq7D,EAAMlD,EAAOoC,GACnC,OAAQpkC,OAAOC,MAAMwS,EAAK8I,YAAc9I,EAAKqJ,YAAcsoB,EAGtD,SAASqB,IAAgD,IAAhCtnD,EAAgC,uDAAxB,GACtC,MAAMunD,EAAkBvnD,EAAM5Q,MAAM,yBAC9Bo4D,EAAwBxnD,EAAM5Q,MAAM,yBACpCq4D,EAAkBznD,EAAM5Q,MAAM,sCACpC,IAAKm4D,IAAoBE,IAAoBD,EAC3C,OAGF,GAAIC,EAAiB,CACnB,MAAOnzB,EAAMuvB,EAAOkD,GAAQ/mD,EAAMxQ,MAAM,SAAS2F,IAAI0sB,QACrD,OAASklC,GAAQA,EArQG,OAqQwBK,EAAY9yB,EAAMuvB,EAAQ,EAAGkD,QAAQnyD,QAE7EA,EADC,GAAEmyD,EAAQ,GAAEA,KAAU,KAAKv4D,OAAOq1D,GAAOc,SAAS,EAAG,QAAQn2D,OAAO8lC,GAAMqwB,SAAS,EAAG,OAI7F,MAAM+C,EAAY1nD,EAAMxQ,MAAM,KACxB8kC,EAAOizB,EAAkBG,EAAU,GAAKA,EAAU,GAClD7D,GAAS0D,EAAkBG,EAAU,GAAKA,EAAU,IAAIttD,cACxD8rD,EAAatC,EAAsB9xC,WAAWsB,GAASA,EAAKrY,WAAW8oD,KAE7E,OAAuB,IAAhBqC,GAAqBkB,EAAYvlC,OAAOyS,GAAO4xB,GACjD,GAAE13D,OAAO03D,EAAa,GAAGvB,SAAS,EAAG,QAAQn2D,OAAO8lC,GAAMqwB,SAAS,EAAG,YACvE/vD,EAGC,SAAS+yD,EAAiBvD,GAC/B,OAAOA,EAAYN,EAAsB,IAG3C,SAAS+B,EAAW+B,GAClB,MAAQ,GAAEA,EAAI,GAAGxtD,gBAAgBwtD,EAAIl4D,MAAM,KAG7C,SAASk2D,EAAWgC,GAClB,MAAQ,GAAEA,EAAI,GAAGl5D,gBAAgBk5D,EAAIl4D,MAAM,O,0EClS7C,MAAMm4D,EAAiB,CAAC,cAAe,YAAa,kBAa9CC,EAAgD,CACpD,CAAC,6BAA8B,UAC/B,CAAC,gCAAiC,UAClC,CAAC,mCAAoC,UAGvC,SAASC,EAAgBC,GACvB,MACMC,EADWD,EAAQx4D,MAAM,KACH2F,KAAK3H,GAAM06D,SAAS16D,EAAG,MAEnD,OAAOgB,OAAO25D,iBAAiBF,GAG1B,SAAS5uD,EAAoBxJ,GAElC,IAAKA,EAAKT,MAAMkJ,EAAAA,GAAc,OAAOzI,EAErC,IAAK,MAAOu4D,EAAOC,KAAgBP,EACjCj4D,EAAOA,EAAKP,QAAQ84D,EAAOC,GAG7B,OAAOx4D,EAGF,SAAS2J,EAAgB/B,GAC9B,IAAIzC,EAEJ,GAAqB,IAAjByC,EAAMpK,OACR2H,EAAOyC,EAAMtJ,WAAW,GAAGmgC,SAAS,IAAIq2B,SAAS,EAAG,SAC/C,CACL,MAAM2D,EAAQ,GACd,IAAK,IAAI96D,EAAI,EAAGA,EAAIiK,EAAMpK,OAAQG,IAC5BiK,EAAMtJ,WAAWX,IAAM,OAAUiK,EAAMtJ,WAAWX,IAAM,MACtDiK,EAAMtJ,WAAWX,EAAI,IAAM,OAAUiK,EAAMtJ,WAAWX,EAAI,IAAM,OAClE86D,EAAMj6D,KAC6B,MAAhCoJ,EAAMtJ,WAAWX,GAAK,QAClBiK,EAAMtJ,WAAWX,EAAI,GAAK,OAAU,QAGpCiK,EAAMtJ,WAAWX,GAAK,OAAUiK,EAAMtJ,WAAWX,GAAK,QAC/D86D,EAAMj6D,KAAKoJ,EAAMtJ,WAAWX,IAIhCwH,EAAOszD,EAAMnzD,KAAKiS,GAAMA,EAAEknB,SAAS,IAAIq2B,SAAS,EAAG,OAAM/1D,KAAK,KAGhE,OAAOoG,EAGF,SAASuzD,EAAgBv/D,GAC9B,MAAMw/D,EAAuB,CAAEC,WAAY,GAAInvD,OAAQ,IAEvD,IAAK,IAAI9L,EAAI,EAAGA,EAAIxE,EAAKqE,OAAQG,GAAK,EAAG,CACvC,MAAMwzC,EAAW,CACfjuC,GAAI/J,EAAKwE,GAAG,GACZ/C,KAAMzB,EAAKwE,GAAG,GACd8L,OAAQ,IAGV,IAAK,IAAI3L,EAAI,EAAGA,EAAI3E,EAAKwE,EAAI,GAAGH,OAAQM,IAAK,CAC3C,MAAM+6D,EAAW1/D,EAAKwE,EAAI,GAAGG,GACxBk6D,EAAehzD,SAAS6zD,EAAS,GAAG,MACvC1nB,EAAS1nC,OAAOjL,KAAKq6D,EAAS,GAAG,IACjCF,EAAUlvD,OAAOovD,EAAS,GAAG,IAAM,CACjC31D,GAAI21D,EAAS,GAAG,GAChBC,MAAOD,EAAS,GAChBE,OAAQb,EAAgBW,EAAS,IACjCG,MAAQH,EAAS,GAActuD,gBAKrCouD,EAAUC,WAAWp6D,KAAK2yC,GAG5B,OAAOwnB,EAGF,SAASM,EAAWC,GACzB,MAAM/zD,EAAO+zD,EAAIr6D,cAEjB,IAAK,aAAas6D,KAAKh0D,GAAO,OAAO+zD,EACrC,MAAMd,EAAa,IAAIjzD,GAAMG,KAAKqK,GAAMA,EAAEypD,YAAY,GA9F/B,SA+FvB,OAAOz6D,OAAO25D,iBAAiBF,K,eCrG1B,SAASh5D,EAAeF,GAC7B,GAAKA,EAML,OAAOA,EAAI8F,SAAS,OAAS9F,EAAO,UAASA,I,kSCP/C,IAAIm6D,EAEG,SAASjyB,IACd,OAAO5kC,QAAQ62D,G,QAIR,IAAIj+D,SAASzB,IAClB,MAAM2/D,EAAO,IAAIC,MAEjBD,EAAKzvD,IAAM,kHACX,MAAM2vD,EAAoB,KACxB7/D,EAAwB,IAAhB2/D,EAAK7tB,SAEf6tB,EAAKG,OAASD,EACdF,EAAKI,QAAUF,KAIRt9D,MAAMy9D,IACfN,EAAuBM,KClBzB,IAAIC,EAA6B,QAAC,GAChC,EAAAz/D,QAAOgkC,kBADwB,OAC/B,SAAoB,gCAAgC07B,QAClD,OAAS,QAEN,SAASvN,IACd,OAAOsN,EAGT,SAASl8B,EAAwB/8B,GAC/Bi5D,EAAmBj5D,EAAEk5D,QAAU,OAAS,QAG1C,MAAM37B,EAAM/jC,OAAOgkC,WAAW,gCACM,mBAAzBD,EAAIhlC,iBACbglC,EAAIhlC,iBAAiB,SAAUwkC,GACK,mBAApBQ,EAAIE,aACpBF,EAAIE,YAAYV,GCkBX,MAAM9J,EAtBN,WACL,MAAM,UAAEF,EAAF,SAAax5B,GAAaC,OAAOw5B,UAIvC,IAAImmC,EAcJ,OAZ0C,IALnB,CAAC,YAAa,WAAY,SAAU,UAKxC13D,QAAQlI,GACzB4/D,EAAK,SACwC,IAL1B,CAAC,SAAU,OAAQ,QAKhB13D,QAAQlI,GAC9B4/D,EAAK,OAC4C,IAR1B,CAAC,QAAS,QAAS,UAAW,SAQ3B13D,QAAQlI,GAClC4/D,EAAK,UACI,UAAUX,KAAKzlC,GACxBomC,EAAK,UACI,QAAQX,KAAKj/D,KACtB4/D,EAAK,SAGAA,EAGmBC,GACfj7B,EAA6B,UAAjBlL,EACZrjB,EAA0B,QAAjBqjB,EACTiL,EAA8B,YAAjBjL,EACbmL,EAAY,iCAAiCo6B,KAAKxlC,UAAUD,WAC5DsmC,EACX7/D,OAAOgkC,WAAW,8BAA8B07B,SAC5C1/D,OAAOw5B,UAAkBsmC,YAC1Bj4D,SAASk4D,SAASl1D,SAAS,kBAGnB05B,EAAevkC,OAAOgkC,WAAW,qBAAqB07B,QAEtD/N,EAA0B3xD,OAAO2oB,YAAc9H,EAAAA,IAC1D7gB,OAAO2oB,YAAc7H,EAAAA,IAAqC9gB,OAAOgf,aAAe+B,EAAAA,GAGrEi/C,GAA2BrO,GACtC3xD,OAAO2oB,YAAc/H,EAAAA,GAEVq/C,EAA+B53D,QAC1CmxB,UAAU0mC,cAAgB,iBAAkB1mC,UAAU0mC,eACpDlgE,OAAOmgE,cAAiBngE,OAAeogE,qBAI9BjxD,GADiDtH,SAAS47B,gBAAgBprB,MACrDohB,IAAiBkL,GAAavuB,IACnDiqD,EAA8B,kBAAmB7mC,UAEjD6W,EAA2BgwB,EAE3BlzB,GAD0CntC,OACtBqI,SAAS,IAAIi4D,OAASC,YAAY,4BACtDC,GACVziD,EAAAA,IAAW,WAAalW,SAASiH,cAAc,UAAU2xD,WAAW,OAAS,IAEnEC,EAAkC,sBAAuB74D,SAASiH,cAAc,OAChF6xD,GAAuBnnC,UAAUD,UAAU1uB,SAAS,WACpD+1D,EAAwBl8B,EAAa,aAAetuB,EAAS,eAAiB,aAErFyqD,EAAah5D,SAASiH,cAAc,SAE7BgrB,GAAmB,EAE5BA,GAAkBlX,EAAAA,GAAAA,IAAkCF,EAAAA,IAEjD,MAAMsX,EAAoB3xB,QAAQw4D,EAAWN,YAAY,4BAA4Bj7D,QAAQ,KAAM,QACnGq/B,GAAaC,GAEPk8B,EAAM9gE,OAAO+gE,kBAAoB,EAEjCC,GAAsB,EAEtBC,GAA0Bt8B,IAAcvuB,IAAWsuB,EAGnDw8B,EAA8BD,EAAyB,IAAM,K,+OCrEnE,SAASE,EAAcxxB,GAC5B,MAAMyxB,EAAMzxB,EAAQnqC,MAAM,KACpB67D,EAAOD,EAAI,GAAGh8D,MAAM,WAAY,GAChCk8D,EAAOC,KAAKH,EAAI,IACtB,IAAI99D,EAAIg+D,EAAKj+D,OACb,MAAMm+D,EAAQ,IAAIC,WAAWn+D,GAE7B,KAAOA,KACLk+D,EAAMl+D,GAAKg+D,EAAKn9D,WAAWb,GAG7B,OAAO,IAAI2zD,KAAK,CAACuK,GAAQ,CAAEviE,KAAMoiE,IAG5B,SAASK,EAAcxK,GAC5B,OAAO,IAAIj2D,SAAQ,CAACzB,EAASD,KAC3B,MAAMoiE,EAAS,IAAIC,WAEnBD,EAAOrC,OAAU94D,IACf,MAAM,OAAEuI,GAAWvI,EAAEW,QAAU,GACT,iBAAX4H,GACTvP,EAAQuP,GAGVxP,EAAO,IAAIK,MAAM,yBAGnB+hE,EAAOpC,QAAUhgE,EACjBoiE,EAAOE,cAAc3K,MAIlB,SAAS4K,EAAW5K,EAAYpvD,GACrC,OAAO,IAAIi6D,KAAK,CAAC7K,GAAOpvD,EAAU,CAChCk6D,aAActgE,KAAKC,MACnB1C,KAAMi4D,EAAKj4D,OAIR,SAASgjE,EAAal9D,GAC3B,OAAO,IAAI9D,SAAQ,CAACzB,EAASD,KAC3B,MAAM2iE,EAAM,IAAI9C,MAChB8C,EAAI5C,OAAS,IAAM9/D,EAAQ0iE,GAC3BA,EAAI3C,QAAUhgE,EACd2iE,EAAIxyD,IAAM3K,KAIP,SAASo9D,EAAap9D,GAC3B,OAAO,IAAI9D,SAAQ,CAACzB,EAASD,KAC3B,MAAM2rC,EAAQrjC,SAASiH,cAAc,SACrCo8B,EAAMk3B,OAAS,EACfl3B,EAAMm3B,iBAAmB,IAAM7iE,EAAQ0rC,GACvCA,EAAMq0B,QAAUhgE,EAChB2rC,EAAMx7B,IAAM3K,KAITnD,eAAe0gE,EAAqBv9D,GACzC,MAAMmmC,QAAci3B,EAAap9D,GAEjC,OAAO9D,QAAQY,KAAK,EAClBC,EAAAA,EAAAA,IAAM,KACN,IAAIb,SAA4B,CAACzB,EAASD,KACxC2rC,EAAMq3B,SAAW,KACVr3B,EAAMs3B,YAAet3B,EAAMu3B,aAC9BjjE,OAAQoL,GAGV,MAAM83D,EAAS76D,SAASiH,cAAc,UACtC4zD,EAAOrxB,MAAQnG,EAAMs3B,WACrBE,EAAOpxB,OAASpG,EAAMu3B,YACVC,EAAOjC,WAAW,MAC1BkC,UAAUz3B,EAAO,EAAG,GACxB1rC,EAAQkjE,EAAOE,UAAU,gBAE3B13B,EAAMq0B,QAAUhgE,EAChB2rC,EAAM23B,YAAchgE,KAAKuP,IAAI84B,EAAM/lB,SAAU,QAK5CvjB,eAAekhE,EAAUnyB,GAE9B,aADuB8lB,MAAM9lB,IACbumB,OAGXt1D,eAAemhE,EAAUpyB,EAAiB7oC,GAE/C,OAAOg6D,QADYgB,EAAUnyB,GACL7oC,GAGnB,SAASk7D,EAAYd,GAC1B,MAAMQ,EAAS76D,SAASiH,cAAc,UAOtC,OANA4zD,EAAOrxB,MAAQ6wB,EAAI7wB,MACnBqxB,EAAOpxB,OAAS4wB,EAAI5wB,OAERoxB,EAAOjC,WAAW,MAC1BkC,UAAUT,EAAK,EAAG,GAEfQ,EAvHW,oBAATX,OAETzL,KAAKyL,KAAO,cAAc9K,KAGxBgM,YAAYC,EAAsBp7D,EAAkBkC,GAClD,GAAIA,EAAS,CACX,MAAM,KAAE/K,KAASkkE,GAASn5D,EAC1Bo5D,MAAMF,EAAU,CAAEjkE,KAAAA,IAFP,sBAGXiC,OAAOC,OAAOkiE,KAAMF,QAEpBC,MAAMF,GADD,sBAIPG,KAAK5iE,KAAOqH,M,2LC4BlB,MAGMw7D,EAAWC,IAEjB,IAAIC,EAYAF,EAASE,WAETC,EAMAH,EAASG,SAETn2B,EAQAg2B,EAASh2B,QAET/V,EAIA+rC,EAAS/rC,UAEb,MAAMmsC,GAA+BC,EAAAA,EAAAA,KAAS,MAC5CC,EAAAA,EAAAA,KAAO,KACLC,GAAoBnrC,EAAAA,EAAAA,YA7CA,KAiDxB,IAAIorC,GAAS,EAIN,SAAS3oC,IACd2oC,GAAS,GAEThrC,EAAAA,EAAAA,IAAY4qC,IACZ/qC,EAAAA,EAAAA,IAAW,QAASmC,GAEpB+oC,GAAoBnrC,EAAAA,EAAAA,OAGf,SAASqrC,EAAc57B,GAG5B,OAFK27B,GAAQ3oC,IAENmS,EAAQ02B,qBAAqB77B,GAG/B,SAAS87B,EAAoB97B,GAGlC,OAFK27B,GAAQ3oC,IAENmS,EAAQ42B,sBAAsB/7B,IAAa,EAG7C,SAASg8B,IAGd,OAFKL,GAAQ3oC,IAENmS,EAAQ82B,qBAGV,SAASC,IAGd,OAFKP,GAAQ3oC,IAENmS,EAAQg3B,yBAGV,SAASC,IAA2B,MACzC,OAAO,UAAAF,IAAoBnhD,EAAAA,WAApB,eAAoCshD,qBAAsB,EAK5D,SAASC,EAAsBt8B,EAAkBzoC,GAKtD,OAJK63B,EAAUysC,qBAAqB77B,KAClC5Q,EAAUysC,qBAAqB77B,IAAYyvB,EAAAA,EAAAA,MAGtCrgC,EAAUysC,qBAAqB77B,GAAUrP,YAAYp5B,GAGvD,SAASglE,EAAsBhlE,GACpC,OAAO63B,EAAU6sC,qBAAqBtrC,YAAYp5B,GAG7C,SAASilE,EAA0BjlE,GACxC,OAAO63B,EAAU+sC,yBAAyBxrC,YAAYp5B,GAKxD,SAASmkE,EAAoBptD,GAE3B,IAAImuD,EACAlmE,EAAAA,KACFkmE,EAAkBhwC,YAAYjzB,OAGhC,MAAMkjE,EAAqBx8D,QACzBoO,EAAOslB,MAAMgZ,QAAQsQ,QAClByf,EAAoB5hD,EAAAA,GAAezM,EAAOslB,MAAMgZ,QAAQsQ,OAAQ5uC,EAAOslB,MAAMya,iBAAiB6O,SAE7F0f,EAA0B18D,QAC9BoO,EAAOslB,MAAMgZ,QAAQ6Q,UAClBkf,EAAoB3hD,EAAAA,GAAoB1M,EAAOslB,MAAMgZ,QAAQ6Q,SAAUnvC,EAAOslB,MAAMya,iBAAiBoP,WAEpGof,EAA0BvuD,EAAOslB,MAAM2a,cAAc2O,SAAWme,EAAWyB,uBAC3EC,EAA+BzuD,EAAOslB,MAAM2a,cAAckP,WAAa4d,EAAW2B,4BAElFC,EAAoB3uD,EAAOivC,YAAY7pB,OAAS2nC,EAAW6B,YAC3DC,EAAkB7uD,EAAOslB,MAAMF,OAAS2nC,EAAWxnC,UACnDupC,EAAkB9uD,EAAOmlB,MAAMC,OAAS2nC,EAAW1nC,UACnD0pC,GAA2BtkC,EAAAA,EAAAA,IAAqBzqB,KAAY+sD,EAAWn7B,eACvEo9B,GAA6B3S,EAAAA,EAAAA,IAAuBr8C,KAAY+sD,EAAWl7B,iBAEjF,IAAIo9B,EAA8B,GAQlC,IANIV,GAA2BE,KAC7BQ,EAAoBA,EAAkBjwD,OAkD1C,SACEgB,GAEA,IADAyuD,EACA,wDACIQ,EAAoB,GAEpBR,GACFQ,EAAkBrhE,KAAK8e,EAAAA,IAGzB,MAAM8hD,EAAyBxuD,EAAOslB,MAAM2a,cAAc2O,OACpD8f,EAA8B1uD,EAAOslB,MAAM2a,cAAckP,SAE/D,GAAIqf,GAA0BE,EAA6B,CACzD,MAAMQ,EAAiBzkE,OAAO6rB,KAAK02C,EAASmC,qBACzCv6D,QAAQ88B,IAAcmF,EAAQ02B,qBAAqB77B,KACnDh9B,IAAI0sB,QAEP6tC,EAAoBA,EAAkBjwD,OAAOkwD,GAM/C,OAHAnC,EAAWyB,uBAAyBA,EACpCzB,EAAW2B,4BAA8BA,EAElCO,EAzEHG,CAAkBpvD,EAAQyuD,OAK5BL,GAAsBE,GAA2BK,GAC9CE,GAAmBC,GAAmBC,GAA4BC,GAOrE,YAJIC,EAAkBriE,QACpByiE,EAAcJ,IAMlB,MAAMK,EAAuBvC,EAAWwC,iBAClCC,EAA4BzC,EAAW0C,sBAY7C,GA+CF,SACEzvD,EAAqBouD,EAA6BE,EAAkCK,GAEpF,MAAMe,EAAiB,GAEvB,GAAItB,EAAoB,CACtB,MAAMuB,EAAa3vD,EAAOslB,MAAMgZ,QAAQsQ,OAClCghB,EAAe5vD,EAAOslB,MAAMya,iBAAiB6O,OAEnDoe,EAASmC,oBAAoB1iD,EAAAA,IAAiBojD,EAC5CpjD,EAAAA,GAAekjD,EAAYC,GAG7B7C,EAAWwC,iBAAmBI,EAC9B5C,EAAW+C,mBAAqBF,EAEhCF,EAAe9hE,KAAK6e,EAAAA,IAGtB,GAAI6hD,EAAyB,CAC3B,MAAMqB,EAAa3vD,EAAOslB,MAAMgZ,QAAQ6Q,SAClCygB,EAAe5vD,EAAOslB,MAAMya,iBAAiBoP,SAEnD6d,EAASmC,oBAAoBziD,EAAAA,IAAsBmjD,EACjDnjD,EAAAA,GAAoBijD,EAAYC,GAGlC7C,EAAW0C,sBAAwBE,EACnC5C,EAAWgD,wBAA0BH,EAErCF,EAAe9hE,KAAK8e,EAAAA,IAGtB,GAAIiiD,EAAmB,CACrB,MAAMqB,EAAiBhwD,EAAOivC,YAAY7pB,KAE1C36B,OAAO+rB,OAAOw5C,GAAgB/5D,SAASu8B,IACjCA,IAAWu6B,EAAW6B,YAAYp8B,EAAOlgC,MAI7C06D,EAASmC,oBAAoB38B,EAAOlgC,IAsB1C,SAA4BkgC,GAC1B,MAAO,IACFA,EACHuN,iBAAkBvN,EAAOG,cACzBC,gBAAiBJ,EAAOI,gBAAkB,IAAIx2B,IAAIo2B,EAAOI,sBAAmBz+B,EAC5E0+B,gBAAiBL,EAAOI,gBAAkB,IAAIx2B,IAAIo2B,EAAOK,sBAAmB1+B,EAC5Ew+B,cAAeH,EAAOI,gBAAkB,IAAIx2B,IAAIo2B,EAAOG,oBAAiBx+B,GA5B5B87D,CAAmBz9B,GAE7Dk9B,EAAe9hE,KAAK4kC,EAAOlgC,QAG7By6D,EAAW6B,YAAcoB,GAvG3BE,CAAclwD,EAAQouD,EAAoBE,EAAyBK,GAEnEM,EAAoBA,EAAkBjwD,OAgIxC,SACEgB,EACA2uD,EACAI,EACAC,EACAM,EACAE,GAEA,MAAMW,EAAenwD,EAAOslB,MAAMF,KAC5BgrC,EAAepwD,EAAOmlB,MAAMC,KAC5BirC,GAAoB5lC,EAAAA,EAAAA,IAAqBzqB,GACzCswD,GAAsBjU,EAAAA,EAAAA,IAAuBr8C,GAC7CuwD,EAAkB9lE,OAAO+rB,OAAOw2C,EAASmC,qBACzCF,EAAoB,IAAI7yD,IAExBo0D,EAAsBxwD,EAAOslB,MAAMgZ,QAAQsQ,OAC3C6hB,EAA2BzwD,EAAOslB,MAAMgZ,QAAQ6Q,SACtD,IAAIuhB,EAAS,IAAIF,GAAuB,MAAOC,GAA4B,IAqD3E,OApDID,IAAwBlB,GAAwBmB,IAA6BjB,IAC/EkB,GAAStuB,EAAAA,EAAAA,IAAOsuB,EAAO1xD,OAAOswD,GAAwB,GAAIE,GAA6B,MAGzFkB,EAAOz6D,SAASvD,IACd,MAAM+C,EAAO06D,EAAaz9D,GAE1B,IACGi8D,IACGI,IACAC,GACDv5D,IAASs3D,EAAWxnC,UAAU7yB,IAC9B09D,EAAa19D,KAAYq6D,EAAW1nC,UAAU3yB,GAEjD,OAGF,IAAIi+D,EACJ,GAAIl7D,EAAM,CACR,MAAMm7D,EAAiB5D,EAAS6D,kBAAkBloE,IAAI+J,GAChDo+D,EAmCZ,SACEr7D,EACAm8B,EACAC,EACAl9B,GAEA,MAAM,GACJrC,EADI,KACA9J,EADA,YACMqnC,EADN,aACmBS,EADnB,YACiCE,EADjC,SAC8CkB,EAD9C,YAEJwtB,EAFI,oBAES6R,EAFT,cAE8BC,EAF9B,SAGJC,EAHI,UAGMC,GACRz7D,EAEE07D,EAAoB,oBAAT3oE,GAA8BmM,EAE/C,MAAO,CACLrC,GAAAA,EACA9J,KAAAA,EACA4oE,SAAUx/D,QAAQi+B,IAAgBS,IAAiBE,GACnD6gC,WAAY3/B,IAAahlB,EAAAA,GACzBolB,SAASH,EAAAA,EAAAA,IAAkBl8B,EAAMm8B,EAAgBC,GACjDykB,SAAU1kD,QAAQstD,GAAe6R,GAAuBC,GACxD9R,YAAAA,EACA6R,oBAAAA,EACAp2C,MAAOvuB,KAAKsP,IAAIu1D,GAAY,EAAGC,GAAa,GAAGrhC,MAAAA,OAAA,EAAAA,EAAagE,OAAQ,GACpEyJ,UAAW6zB,EAA6B,gBAAlBA,EAAS3oE,UAAyB2L,EACxDm9D,cAAeH,EAAWA,EAAS3zB,eAAYrpC,GA5D1Bo9D,CAAiB97D,EAAM46D,EAAmBC,EAAqBF,EAAa19D,IAC/F,IAAKi8D,GAAqBiC,IAAkBrwC,EAAAA,EAAAA,GAAqBuwC,EAAYF,GAC3E,OAGF5D,EAAS6D,kBAAkBjmE,IAAI8H,EAAQo+D,GAEvCH,EAyDN,SAA4Ba,EAA0BjB,GACpD,OAAOA,EAAgB54D,QAAiB,CAAC8e,EAAKg7C,KAShD,SACED,EACAC,GACA,UACA,IAAKD,EAAYJ,SACf,OAAO,EAGT,MAAQ9+D,GAAII,EAAN,KAAclK,GAASgpE,EAE7B,GAAIC,EAAcnzB,QAChB,QACGkzB,EAAYH,YAAcI,EAAcn/D,KAAOma,EAAAA,KAC3C+kD,EAAYH,YAAcI,EAAcn/D,KAAOoa,EAAAA,KAK/C+kD,EAAcnzB,QAAQziC,IAAInJ,GAGnC,aAAI++D,EAAc7+B,uBAAlB,OAAI,EAA+B/2B,IAAInJ,GACrC,OAAO,EAGT,aAAI++D,EAAc5+B,uBAAlB,OAAI,EAA+Bh3B,IAAInJ,GACrC,OAAO,EAGT,aAAI++D,EAAc9+B,qBAAlB,OAAI,EAA6B92B,IAAInJ,GACnC,OAAO,EAGT,GAAI++D,EAAc3+B,iBAAmB0+B,EAAYH,WAC/C,OAAO,EAGT,GAAII,EAAcz+B,cAAgBw+B,EAAYlb,SAC5C,OAAO,EAGT,GAAImb,EAAc1+B,cAAgBy+B,EAAY1/B,UAAY0/B,EAAYT,oBACpE,OAAO,EAGT,GAAa,oBAATvoE,EACF,GAAIgpE,EAAYl0B,WACd,GAAIm0B,EAAcx+B,KAChB,OAAO,MAEJ,CACL,GAAIw+B,EAAcr+B,UAAYo+B,EAAYF,cACxC,OAAO,EAGT,GAAIG,EAAcp+B,cAAgBm+B,EAAYF,cAC5C,OAAO,MAGN,IAAa,oBAAT9oE,EACT,OAAOoJ,QAAQ6/D,EAAct+B,UACxB,GAAa,uBAAT3qC,GAA0C,uBAATA,EAC1C,OAAOoJ,QAAQ6/D,EAAcv+B,QAG/B,OAAO,EAzEDw+B,CAAeF,EAAaC,IAC9Bh7C,EAAI7oB,KAAK6jE,EAAcn/D,IAGlBmkB,IACN,IAAI0vB,OAhEYwrB,CAAmBb,EAAYP,GAC9CI,EAAa16D,SAASy7B,IACpBu9B,EAAkBxyD,IAAIi1B,WAGxBs7B,EAAS6D,kBAAkB9lE,OAAO2H,GAClCi+D,EAAe,GAGjB,MAAMiB,EAAmB5E,EAAS6E,kBAAkBn/D,IAAW,GAC/D,IAAIof,EAAAA,EAAAA,IAAqB6+C,EAAciB,GACrC,OAGF,MAAME,EAyHV,SAA4Bp/D,EAAgBk/D,EAA4BjB,GACtE,MAAMoB,EAAsB,IAAI31D,IAAIw1D,GAC9BI,EAAkB,IAAI51D,IAAIu0D,GAC1BmB,EAA6B,GAgCnC,OA9BA1vB,EAAAA,EAAAA,IAAO,IAAIwvB,KAAqBjB,IAAe16D,SAASy7B,IACtD,IAAIugC,EAA0Bp7B,EAAQ02B,qBAAqB77B,GAEvDqgC,EAAoBl2D,IAAI61B,KAAcsgC,EAAgBn2D,IAAI61B,IAC5Ds7B,EAASkF,kBAAkBxgC,GAAW3mC,OAAO2H,GAE7Co/D,EAAiBlkE,KAAK8jC,GAElBugC,IACFA,EAA0BA,EAAwBr9D,QAAQtC,GAAOA,IAAOI,IACxEs6D,EAASmF,yBAAyBzgC,IAAY,KAEtCqgC,EAAoBl2D,IAAI61B,IAAasgC,EAAgBn2D,IAAI61B,KAC9Ds7B,EAASkF,kBAAkBxgC,KAC9Bs7B,EAASkF,kBAAkBxgC,GAAY,IAAIt1B,KAG7C4wD,EAASkF,kBAAkBxgC,GAAWj1B,IAAI/J,GAEtCu/D,IACFA,EAAwBrkE,KAAK8E,GAC7Bs6D,EAASmF,yBAAyBzgC,IAAY,IAIlDmF,EAAQ02B,qBAAqB77B,GAAYugC,KAG3CjF,EAAS6E,kBAAkBn/D,GAAUi+D,EAE9BmB,EA5JoBM,CAAmB1/D,EAAQk/D,EAAkBjB,GACtEmB,EAAiB77D,SAASy7B,IACxBu9B,EAAkBxyD,IAAIi1B,SAI1Bq7B,EAAWxnC,UAAY4qC,EACvBpD,EAAW1nC,UAAY+qC,EACvBrD,EAAWn7B,eAAiBy+B,EAC5BtD,EAAWl7B,iBAAmBy+B,EAEvBv6D,MAAMuN,KAAK2rD,GAtM2B5nC,CAC3CrnB,EAAQ2uD,GAAqBP,GAAsBE,EACnDS,EAA0BC,EAC1BM,EAAsBE,IAGxBH,GAAcjtB,EAAAA,EAAAA,IAAO6sB,IAEjBhnE,EAAAA,GAAO,CACT,MAAMymB,EAAWyP,YAAYjzB,MAAQijE,EACjCz/C,EAxKqB,GA0KvBxmB,QAAQ4B,KAAM,iCAAgCsC,KAAKoP,MAAMkT,UAK/D,SAAS2/C,EAAoB38B,EAAkBi+B,EAAuBC,GACpE,MAAMnwB,EAAiB/N,IAAajlB,EAAAA,GAChCsgD,EAAWwC,iBACXxC,EAAW0C,sBACT4C,EAAmB3gC,IAAajlB,EAAAA,GAClCsgD,EAAW+C,mBACX/C,EAAWgD,wBAEf,OAAOtwB,IAAmBkwB,GAAc0C,IAAqBzC,EAkF/D,SAASC,EACPn+B,EAAkB4M,EAAmByB,GAErC,MAAO,CACLztC,GAAIo/B,EACJ4M,QAAS,IAAIliC,IAAIkiC,GACjByB,iBAAkBA,EAClBpN,cAAe,IAAIv2B,IAAI2jC,IAwO3B,SAASsvB,EAAcJ,GACrB,IAAIqD,GAA2B,EAC3BC,GAAuB,EAyC3B,GAvCAx8D,MAAMuN,KAAK2rD,GAAmBh5D,SAASy7B,IACrC,MAAQ8gC,YAAaC,EAAgBC,WAAYC,GAqDrD,SAA+BjhC,GAC7B,MAAM+/B,EAAgBzE,EAASmC,oBAAoBz9B,GACnD,IAAK+/B,EACH,MAAO,GAGT,MAAM,iBAAE1xB,EAAF,cAAoBpN,GAAkB8+B,GACtC,kBACJZ,EACAqB,mBAAqB,CAACxgC,GAAW+B,IAC/Bu5B,GAEFO,sBAAwB,CAAC77B,GAAWkhC,IAClC/7B,EAEEg8B,EAAkBp/B,EAAUsM,MAAAA,OAAH,EAAGA,EAAkBnrC,QAAQtC,GAAOmhC,EAAQ53B,IAAIvJ,KAAOytC,EAChF+yB,EAAaF,GAAmBn/B,GAAW19B,MAAMuN,KAAKmwB,IAAa,GAEnEs/B,GADepgC,EAAgBmgC,EAAWl+D,QAAQtC,IAAQqgC,EAAc92B,IAAIvJ,KAAOwgE,GACjD3sB,MAAK,CAAC6sB,EAAiBC,IACtDpC,EAAkBloE,IAAIsqE,GAAUt4C,MAAQk2C,EAAkBloE,IAAIqqE,GAAUr4C,QAGjF,MAAO,CACL63C,aAAaK,MAAAA,OAAA,EAAAA,EAAiBjmE,SAAU,EACxC8lE,WAAY,IACNG,GAAmB,MACpBE,IA/E8DG,CAAsBxhC,GAEzF,IAAKihC,EACH,OAGF,MAAMQ,EAAoBt8B,EAAQ02B,qBAAqB77B,GACjD0hC,EAAqBv8B,EAAQ42B,sBAAsB/7B,GAO/B,MALvByhC,QACyBh/D,IAAvBi/D,GAAoCA,IAAuBX,IAC3DzF,EAASmF,yBAAyBzgC,KACjC5f,EAAAA,EAAAA,IAAqB6gD,EAAeQ,KAGxCnG,EAASmF,yBAAyBzgC,IAAY,EAC9CmF,EAAQ02B,qBAAqB77B,GAAYihC,EACzC97B,EAAQ42B,sBAAsB/7B,GAAY+gC,EAC1C,UAAA3xC,EAAUysC,qBAAqB77B,UAA/B,SAA0C9P,aAAa+wC,IAGzD,MAAMU,EAAoBx8B,EAAQ82B,qBAAqBj8B,GACjD4hC,EAAgBX,EAAc/lE,OAC/B2lE,IACHA,EAAuBc,IAAsBC,GAE/Cz8B,EAAQ82B,qBAAqBj8B,GAAY4hC,EAEzC,MAAMC,EAAwB18B,EAAQg3B,yBAAyBn8B,GACzD8hC,EAuDV,SAAmC9hC,GACjC,MAAM,kBACJm/B,GACE7D,GAEFO,sBAAwB,CAAC77B,GAAWghC,IAClC77B,EAEJ,OAAO67B,EAAY/6D,QAAO,CAAC67D,EAAmB9gE,KAC5C,MAAM8+D,EAAcX,EAAkBloE,IAAI+J,GAC1C,OAAK8+D,GAIDA,EAAYlb,WACdkd,EAAkB/gC,aAEd++B,EAAYT,sBACdyC,EAAkBzF,oBAAsByD,EAAYT,qBAGjDS,EAAY1/B,UACX0/B,EAAYtS,YACdsU,EAAkBzF,oBAAsByD,EAAYtS,YAC1CsS,EAAYT,sBACtByC,EAAkBzF,oBAAsB,KAKvCyF,GAnBEA,IAoBR,CACD/gC,WAAY,EACZs7B,mBAAoB,IAxFM0F,CAA0B/hC,GAC/C4gC,IACHA,GACGiB,KAA0BhzC,EAAAA,EAAAA,GAAqBizC,EAAmBD,IAGvE18B,EAAQg3B,yBAAyBn8B,GAAY8hC,KAG3CjB,EAAsB,CAExB,MAAM12C,EAAW,IAAKgb,EAAQ82B,sBAC9B92B,EAAQ82B,qBAAuB9xC,EAC/BiF,EAAU6sC,qBAAqB/rC,aAAa/F,GAG9C,GAAIy2C,EAA0B,CAE5B,MAAMz2C,EAAW,IAAKgb,EAAQg3B,0BAC9Bh3B,EAAQg3B,yBAA2BhyC,EACnCiF,EAAU+sC,yBAAyBjsC,aAAa/F,IAwEpD,SAASixC,IACP,MAAO,CACLC,WAAY,CACV6B,YAAa,GACbrpC,UAAW,GACXF,UAAW,GACXuM,eAAgB,GAChBC,iBAAkB,IAGpBm7B,SAAU,CACRmC,oBAAqB,GACrB0B,kBAAmB,IAAIjpE,IACvBiqE,kBAAmB,GACnBK,kBAAmB,GACnBC,yBAA0B,IAG5Bt7B,QAAS,CACP02B,qBAAsB,GACtBE,sBAAuB,GACvBE,qBAAsB,GACtBE,yBAA0B,IAG5B/sC,UAAW,CACTysC,qBAAsB,GACtBI,sBAAsBxM,EAAAA,EAAAA,KACtB0M,0BAA0B1M,EAAAA,EAAAA,OAKhC,SAAS98B,IACP,MAAMqvC,EAAc5G,IAEpBC,EAAa2G,EAAY3G,WACzBC,EAAW0G,EAAY1G,SACvBn2B,EAAU68B,EAAY78B,QACtB/V,EAAY4yC,EAAY5yC,Y,eCzsBnB,SAASxsB,EAAeq/D,EAAoBhgE,GAA4C,IAAzByyD,EAAyB,uDAAN,KACvF,OAAO,IAAIwN,KAAKC,aAAazN,EAAQ,CACnCxkD,MAAO,WACPjO,SAAAA,IACC6wD,OAAoB,QAAb7wD,EAAqBggE,EAAaA,EAAa,K,kDCN3D,MAUA,EAVuBG,IACrB,IAAIxhE,EAEJ,GACEA,EAAKvE,OAAO3B,KAAKgrC,UAAUvoC,QAAQ,KAAM,YAClCilE,EAAMC,eAAezhE,IAE9B,OAAOA,I,0CCLT,MAAM0hE,EAAkD,CACtDC,gBAAiB,4DACjBC,qBAAsB,+BACtBC,yBAA0B,sCAC1BC,6BAA8B,uCAC9BC,yBAA0B,mCAC1BC,0BAA2B,oCAC3BC,iBAAkB,8DAElBC,gBAAiB,kIACjBC,uBAAwB,gEACxBC,gBAAiB,gCACjBC,iBAAkB,wBAClBC,qBAAsB,iCACtBC,YAAa,uCACbC,cAAe,gBACfC,kBAAmB,wCACnBC,yBAA0B,mCAC1BC,wBAAyB,mCAEzBC,yBAA0B,yGAC1BC,oBAAqB,cACrBC,0BAA2B,uCAC3BC,oBAAqB,+CACrBC,wBAAyB,6CACzBC,wBAAyB,6CACzBC,gBAAiB,0BACjBC,uBAAwB,mCACxBC,6BAA8B,wCAC9BC,6BAA8B,wCAC9BC,qBAAsB,qCACtBC,wBAAyB,wCACzBC,yBAA0B,yCAC1BC,sBAAuB,sCACvBC,sBAAuB,qCACvBC,uBAAwB,sCACxBC,uBAAwB,sCAGxBC,kBAAmB,mDACnBC,iBAAkB,sBAIlBC,wBAAyB,uHAEzBC,0CAA2C,2FAE3CC,oCAAqC,4GAErCC,cAAe,+CACfC,mBAAoB,oCACpBC,eAAgB,gDAChBC,uBAAwB,gFACxBC,YAAa,oDACbC,wBAAyB,4CACzBC,wBAAyB,0DACzBC,kBAAmB,2BACnBC,oBAAqB,8BACrBC,oBAAqB,6BACrBC,kBAAmB,gDACnBC,yBAA0B,2BAC1BC,sBAAuB,iCACvBC,6BAA8B,mEAC9BC,gBAAiB,4BACjBC,6BAA8B,sCAC9BC,mBAAoB,sCACpBC,8BAA+B,wEAC/BC,uBAAwB,kCAGbC,EAAiD,CAC5DjC,6BAA8B,CAC5B/5B,MAAO,cACPvyC,QAAS,4BAEXusE,6BAA8B,CAC5Bh6B,MAAO,cACPvyC,QAAS,4BAEXwsE,qBAAsB,CACpBj6B,MAAO,OACPvyC,QAAS,kBAEXysE,wBAAyB,CACvBl6B,MAAO,cACPvyC,QAAS,qBAEX0sE,yBAA0B,CACxBn6B,MAAO,WACPvyC,QAAS,uBAEX2sE,sBAAuB,CACrBp6B,MAAO,QACPvyC,QAAS,mBAEX4sE,sBAAuB,CACrBr6B,MAAO,WACPvyC,QAAS,kBAEX6sE,uBAAwB,CACtBt6B,MAAO,QACPvyC,QAAS,mBAEX8sE,uBAAwB,CACtBv6B,MAAO,QACPvyC,QAAS,oBAIE,SAASwuE,EAAqB/uE,GAC3C,MAAM,QAAEO,EAAF,WAAWyuE,EAAX,WAAuBC,GAAejvE,EAE5C,GAAIgvE,EAAY,CACd,MAAME,EAAiB3uE,EAAQoI,QAAQ,eACvC,OAAOumE,EAAiB,EAAI3uE,EAAQ0M,UAAU,EAAGiiE,GAAkB3uE,EAErE,IAAI4uE,EAAehE,EAAwB5qE,GAM3C,OALI4uE,GAAgBF,IAClBE,EAAevtE,OAAO6rB,KAAKwhD,GAAYngE,QAAO,CAAC8e,EAAKnb,IAC3Cmb,EAAI5nB,QAAQyM,EAASw8D,EAAWx8D,KACtC08D,IAEEA,EAGF,SAASrrC,EAAiB9jC,GAC/B,OAAO8uE,EAAgB9uE,EAAMO,W,sDCxH/B,SAAS6uE,EAAiBloE,GACxBA,EAAEO,iBAEF8tB,EAAYruB,aAAamoE,WAAanoE,EAAElH,MAAQkH,EAAEooE,QAK7C,SAAS/5C,EAAYn0B,GAE1B/B,QAAQW,MAAMoB,GAhBhBV,OAAOjB,iBAAiB,QAAS2vE,GACjC1uE,OAAOjB,iBAAiB,qBAAsB2vE,IAWvB/K,EAAAA,EAAAA,IAAS3jE,OAAO6uE,MAAO,M,cCLvC,SAAShxC,EAA2CixC,EAAiBt+C,GAC1E,OAAOs+C,EAAW1gE,QAAO,CAAC8wB,EAA2B6vC,KACnD7vC,EAAM6vC,EAAOv+C,IAAQu+C,EAEd7vC,IACN,IAGE,SAAS8vC,EACd9vC,EACAx/B,GAEA,OAAOwB,OAAO6rB,KAAKmS,GAAO9wB,QAAO,CAAC6gE,EAA8Bz+C,EAAK7jB,KACnEsiE,EAASz+C,GAAO9wB,EAASw/B,EAAM1O,GAAMA,EAAK7jB,EAAOuyB,GAC1C+vC,IACN,IAGE,SAAS10B,EAA2B20B,EAAWniD,GACpD,OAAOA,EAAK3e,QAAO,CAACW,EAAQyhB,KAC1BzhB,EAAOyhB,GAAO0+C,EAAO1+C,GACdzhB,IACN,IAGE,SAASuxC,EAAiC4uB,EAAWniD,GAC1D,OAAOA,EAAK3e,QAAO,CAACW,EAAQyhB,KACtB0+C,EAAO1+C,KACTzhB,EAAOyhB,GAAO0+C,EAAO1+C,IAGhBzhB,IACN,IAGE,SAAS+mC,EAA2Bo5B,EAAWniD,GACpD,MAAMoiD,EAAa,IAAIt8D,IAAIka,EAAK5hB,IAAI3G,SAIpC,OAAO+1C,EAAK20B,EAHMhuE,OAAO6rB,KAAKmiD,GAC3B7jE,QAAQmlB,IAAS2+C,EAAW78D,IAAIke,MAK9B,SAAS2G,EACd23C,EACAM,GAEK,IADLC,EACK,uDADqD,MAE1D,SAASC,EAAczyB,EAAMC,EAAMyyB,EAAgDC,GACjF,MAAMC,GAAsC,mBAArBF,EAAkCA,EAAiB1yB,GAAKA,EAAE0yB,KAAsB,EACjGG,GAAsC,mBAArBH,EAAkCA,EAAiBzyB,GAAKA,EAAEyyB,KAAsB,EAEvG,OAAOC,EAAQC,EAASC,EAASA,EAASD,EAG5C,GAAIjjE,MAAMC,QAAQ2iE,GAAY,CAC5B,MAAOO,EAAOC,GAASpjE,MAAMC,QAAQ4iE,GAAQA,EAAO,CAACA,EAAMA,IACpDQ,EAAYC,GAAcV,EAC3BW,EAAmB,QAAVJ,EACTK,EAAmB,QAAVJ,EAEf,OAAOd,EAAWlyB,MAAK,CAACC,EAAGC,IAClBwyB,EAAczyB,EAAGC,EAAG+yB,EAAYE,IAAWT,EAAczyB,EAAGC,EAAGgzB,EAAYE,KAItF,MAAMR,EAAiB,QAATH,EACd,OAAOP,EAAWlyB,MAAK,CAACC,EAAGC,IAClBwyB,EAAczyB,EAAGC,EAAGsyB,EAAWI,KAInC,SAASh8C,EAAQy8C,GACtB,OAAOA,EAAM7hE,QAAO,CAACW,EAAQggE,IACvBviE,MAAMC,QAAQsiE,GACThgE,EAAO0G,OAAOs5D,IAErBhgE,EAAO1K,KAAK0qE,GACLhgE,IAER,IAGE,SAAS8pC,EAAsBo3B,GACpC,OAAOzjE,MAAMuN,KAAK,IAAIlH,IAAIo9D,IAGrB,SAAS9hE,EAAuB8hE,GACrC,OAAOA,EAAM5kE,OAAOhD,SAGf,SAASkgB,EAAqB2nD,EAAeC,GAClD,OAAID,EAAO7sE,SAAW8sE,EAAO9sE,QAItB6sE,EAAO90B,OAAM,CAAChyB,EAAM5lB,IAAM4lB,IAAS+mD,EAAO3sE,KAG5C,SAAS4sE,EAA4BF,EAAeC,GACzD,OAAOD,EAAO,IAAMC,EAAOA,EAAO9sE,OAAS,IAAM6sE,EAAOA,EAAO7sE,OAAS,IAAM8sE,EAAO,GAGhF,SAASE,EAA2BJ,EAAY5uE,GACrD,OAAO4uE,EAAM5kE,QAAQwxC,GAAMx7C,EAAIiR,IAAIuqC,KAG9B,SAASr3C,EAAMyqE,EAAcK,GAClC,MAAMvhE,EAAS,GACf,IAAK,IAAIvL,EAAI,EAAGA,EAAIysE,EAAM5sE,OAAQG,GAAK8sE,EACrCvhE,EAAO1K,KAAK4rE,EAAMvqE,MAAMlC,EAAGA,EAAI8sE,IAGjC,OAAOvhE,EAGF,SAASwhE,EAAa5rE,GAC3B,MAAqB,iBAAVA,EACFA,EAGL6H,MAAMC,QAAQ9H,GACTA,EAAMwG,IAAIolE,GAGZrvE,OAAO6rB,KAAKpoB,GAAOyJ,QAAO,CAAC8e,EAAKsD,KACrCtD,EAAIsD,GAAkB+/C,EAAU5rE,EAAM6rB,IAC/BtD,IACN,IAGE,SAAS8gC,EAAYiiB,EAAiBO,GAC3C,IAAI38C,EAASo8C,EAAM5sE,OAEnB,KAAOwwB,KACL,GAAI28C,EAAUP,EAAMp8C,GAASA,EAAQo8C,GACnC,OAAOA,EAAMp8C,G,qRC7HnB,MAAM48C,EAAqB,iBACrBC,EAAiB,CAAC,QAAS,YAAa,WAAY,WAAY,WAAY,YAAa,cACzFC,EAAe,CAEnBC,GAAKttE,GAAqB,IAANA,EAAU,EAAI,EAClCutE,GAAKvtE,GAAqB,IAANA,EAAU,EAAU,IAANA,EAAU,EAAU,IAANA,EAAU,EAAIA,EAAI,KAAO,GAAKA,EAAI,KAAO,GAAK,EAAIA,EAAI,KAAO,GAAK,EAAI,EACtHwtE,GAAKxtE,GAAqB,IAANA,EAAU,EAAI,EAClCytE,GAAKztE,GAAqB,IAANA,EAAU,EAAI,EAClC0tE,GAAK1tE,GAAqB,IAANA,EAAU,EAAI,EAClC2tE,GAAK3tE,GAAeA,EAAI,EAAI,EAAI,EAChC4tE,GAAK5tE,GAAeA,EAAI,EAAI,EAAI,EAChCyF,GAAI,IAAM,EACVooE,GAAK7tE,GAAqB,IAANA,EAAU,EAAI,EAClC8tE,GAAI,IAAM,EACVC,GAAI,IAAM,EACVC,GAAKhuE,GAAqB,IAANA,EAAU,EAAI,EAClCiuE,GAAKjuE,GAAqB,IAANA,EAAU,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EACtGkuE,MAAQluE,GAAeA,EAAI,EAAI,EAAI,EACnCmuE,GAAKnuE,GAAeA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAK,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EAC7HouE,GAAKpuE,GAAeA,EAAI,EAAI,EAAI,EAChCquE,GAAKruE,GAAeA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAK,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EAC7HsuE,GAAKtuE,GAAeA,EAAI,EAAI,EAAI,GAI5BwzD,EAAQ,IAAIz4D,IAElB,IAAIwzE,EACAC,EAEJ,MAAM,YACJh5C,EADI,eAEJC,EAFI,aAGJV,IACEu/B,EAAAA,EAAAA,KAIJ,IAAIma,EACAC,EAEG,MAAMC,EAAyB,CAACzhD,EAAa7rB,EAAas2D,KAAiB,QAChF,QAAcrwD,IAAVjG,EAAqB,CACvB,MAAMutE,EAAa1lE,MAAMC,QAAQ9H,GAASk+B,KAAKG,UAAUr+B,GAASA,EAC5DwtE,EAASrb,EAAM13D,IAAK,GAAEoxB,KAAO0hD,KAAcjX,KACjD,GAAIkX,EACF,OAAOA,EAIX,IAAKN,IAAaC,EAChB,OAAOthD,EAGT,MAAM4hD,GAAa,UAACP,SAAD,aAAC,EAAWrhD,MAAZ,UAAsBshD,SAAtB,aAAsB,EAAmBthD,IAC5D,OAAK4hD,EAQEC,EAAmBD,EAAY5hD,EAAK7rB,EAAOs2D,IAP3C6W,GACEQ,IAGA9hD,IAMJ5uB,eAAe2wE,EAA4B9xC,EAAkBjQ,GAClE,IAAIgiD,QAAmDz3C,EAAAA,MACrDlc,EAAAA,GACC,GAAE2E,EAAAA,MAAqBid,KAAYjQ,IACpCuK,EAAAA,KAAAA,MAOF,OAJKy3C,IACHA,QA4EJ5wE,eACE6wE,EAA2ChyC,EAAkBjQ,GAE7D,MAAMkiD,QAAeryE,EAAAA,EAAAA,IAAQ,mBAAoB,CAC/CwxE,SAAUY,EACVhyC,SAAAA,EACA1T,KAAM,CAACyD,KAGT,GAAIkiD,MAAAA,GAAAA,EAAQrvE,OAGV,aAFM03B,EAAAA,KAAclc,EAAAA,GAAkB,GAAE4zD,KAAkBhyC,KAAYjQ,IAAOkiD,EAAO,IAE7EA,EAAO,GAxFUC,CAAkBnvD,EAAAA,GAAmBid,EAAUjQ,IAGlE6hD,EAAmBG,EAAiBhiD,GAGtC5uB,eAAeu/B,EAAYV,EAAoB/gC,GAAqD,IAAtBkzE,EAAsB,wDACzG,GAAIf,GAAYpxC,IAAasxC,EAK3B,YAJIryE,GACFA,KAMJ,IAAImzE,QAAoB93C,EAAAA,MAAelc,EAAAA,GAAiB4hB,EAAU1F,EAAAA,KAAAA,MAClE,IAAK83C,IACCD,SACIN,IAGRO,QAAoBC,EAAYryC,IAC3BoyC,GACH,OAIJ/b,EAAMa,QAENoa,EAAkBtxC,EAClBoxC,EAAWgB,EACXhrE,SAAS47B,gBAAgB/5B,KAAO+2B,EAEhC,MAAM,UAAEpB,EAAF,WAAauB,IAAelI,EAAAA,EAAAA,MAAYyE,SAAS+B,MACjD6zC,EAAW1zC,MAAAA,OAAH,EAAGA,EAAWyM,MAAM/jB,GAAMA,EAAE0Y,WAAaA,IACvDwxC,EAAejsE,MAAQqC,QAAQ0qE,MAAAA,OAAD,EAACA,EAAUC,KACzCf,EAAejnE,KAAOy1B,EACtBwxC,EAAerxC,WAAaA,EAExBlhC,GACFA,IAGF24B,IAGK,SAASyI,EAAcF,GACxBA,GAAcA,IAAeoxC,IAIjCA,EAAoBpxC,EACpBqxC,EAAerxC,WAAaA,EAE5BvI,KAGFz2B,eAAe0wE,IACTR,IAIJA,SAA0B,+BAA8BmB,QACxD56C,KAGFz2B,eAAekxE,EAAYryC,GACzB,MAAMiyC,QAAeryE,EAAAA,EAAAA,IAAQ,gBAAiB,CAAE6yE,gBAAiBzvD,EAAAA,GAAYgd,SAAAA,IAC7E,GAAIiyC,EAEF,aADM33C,EAAAA,KAAclc,EAAAA,GAAiB4hB,EAAUiyC,EAAOb,UAC/Ca,EAAOb,SA2ClB,SAASQ,EAAmBD,EAAuC5hD,EAAa7rB,EAAas2D,GAC3F,MAAMkY,EAAWf,EAAaA,EAA4B,iBAAVztE,EApBlD,SAAyBwF,GACvB,MAAMs2B,EAAWsxC,GAAmBxuD,EAAAA,GAC9B6vD,EAAczC,EAAalwC,GAC7BkwC,EAAalwC,GAAuCt2B,GACpD,EAEJ,OAAOumE,EAAe0C,GAc+CC,CAAgB1uE,GAAS,cAAWiG,EACzG,IAAKuoE,IAAaA,EAAS1nE,OAAQ,CACjC,MAAM2D,EAAQohB,EAAIhrB,MAAM,KAExB,OAAO4J,EAAMA,EAAM/L,OAAS,GAG9B,QAAcuH,IAAVjG,EAAqB,CACvB,MACMoK,EApBV,SAAyBokE,EAAkBxuE,GACzCA,EAAQ6H,MAAMC,QAAQ9H,GAASA,EAAQ,CAACA,GACxC,MAAM2uE,EAAoBH,EAAS3tE,MAAMirE,GACnC8C,EAAeD,EAAkBziE,QAEvC,OAAOyiE,EAAkBllE,QAAO,CAACW,EAAQ6uD,EAAKjxD,IACpC,GAAEoC,IAASvK,OAAOG,EAAMgI,IAAU,MAAMixD,KAC/C2V,GAAgB,IAaFC,CAAgBL,EADG,MAAXlY,GAAiBwY,EAAAA,EAAAA,IAAc9uE,GAASA,GAEzDutE,EAAa1lE,MAAMC,QAAQ9H,GAASk+B,KAAKG,UAAUr+B,GAASA,EAElE,OADAmyD,EAAMz1D,IAAK,GAAEmvB,KAAO0hD,KAAcjX,IAAUlsD,GACrCA,EAGT,OAAOokE,I,2HChOT,MAAMO,EAAc,KAGb9xE,eAAe+xE,EAASC,GAC7B,MAAMC,QAAoB,IAAIpc,SAASmc,GAAUC,cAEjD,OAAO,IAAI5yE,SAASzB,IAClB,MAAMs0E,EAAa,IAAIrS,WAAWoS,GAElC,IAAIE,EAAoC,IAAIl1E,OAC1C,IAAIC,IAAI,mBAENk1E,EAAgC,IAAIn1E,OAAO,IAAIC,IAAI,mBAEvDi1E,EAAcE,UAAaztE,IAEV,OAAXA,EAAExH,KAEJg1E,EAAWlzE,YAAY,CAAE+U,QAAS,SAGlCm+D,EAAWlzE,YACT,CACE+U,QAAS,SACTq+D,QAAS1tE,EAAExH,MAEbwH,EAAExH,KAAKmM,KAAI,QAAC,OAAEgpE,GAAH,SAA8BA,OAK/CH,EAAUC,UAAaztE,IACE,SAAnBA,EAAExH,KAAKa,UACTL,EAAQ,IAAIy3D,KAAK,CAACzwD,EAAExH,KAAKo1E,MAAO,CAAEn1E,KAAM,eAExC80E,EAAeM,YACfN,OAAgBnpE,EAChBopE,EAAWK,YACXL,OAAYppE,IAIhBopE,EAAUlzE,YAAY,CACpB+U,QAAS,OACTy+D,YA3CY,GA4CZC,cAAeb,IAGjBK,EAAcjzE,YAAY,CACxB+U,QAAS,OACT2+D,kBAAmBd,EACnBe,uBAAwBf,IAG1BK,EAAcjzE,YAAY,CACxB+U,QAAS,SACT6+D,MAAOZ,GACN,CAACA,EAAWK,Y,aCxCnB,MAAMQ,EAAiB,CACrB,CAACzyE,EAAAA,GAAAA,SAAyB64B,EAASy7B,KAAKS,KACxC,CAAC/0D,EAAAA,GAAAA,QAAwB64B,EAASy7B,KAAKS,KACvC,CAAC/0D,EAAAA,GAAAA,kBAA6B0I,EAC9B,CAAC1I,EAAAA,GAAAA,aAAwB0I,GAKrBgqE,EAAc,IAAIv2E,IAClBw2E,EAAgB,IAAIx2E,IACpBy2E,EAAoB,IAAIz2E,IACxB02E,EAAuB,IAAI12E,IAE1B,SAASo4D,EACd1xD,EACAiwE,GAI2B,IAH3Bre,EAG2B,wDAF3Bse,EAE2B,uCAD3BC,EAC2B,uCAC3B,GAAIF,IAAgB9yE,EAAAA,GAAAA,YAClB,OACEmuC,EAAAA,GACI8kC,EAAepwE,GACf0xD,EAAM1xD,EAAK7C,EAAAA,GAAAA,QAAwBy0D,EAAese,EAAYC,GAItE,IAAKL,EAAcviE,IAAIvN,GAAM,CAC3B,MAAMvE,EAAU40E,EAAuBrwE,EAAKiwE,EAAare,GACtDr1D,OAAOZ,IACFhC,EAAAA,IAEFC,QAAQ4B,KAAKG,MAKhBa,SAAQ,KACPszE,EAAcrzE,OAAOuD,GACrB+vE,EAAkBtzE,OAAOuD,GACzBgwE,EAAqBvzE,OAAOuD,MAGhC8vE,EAAcxzE,IAAI0D,EAAKvE,GAGzB,GAAIy0E,GAAcC,EAAkB,CAClC,IAAIG,EAAkBP,EAAkB11E,IAAI2F,GACvCswE,IACHA,EAAkB,IAAIh3E,IACtBy2E,EAAkBzzE,IAAI0D,EAAKswE,IAE7BA,EAAgBh0E,IAAI6zE,EAAkBD,GAGxC,OAAOJ,EAAcz1E,IAAI2F,GAGpB,SAASuwE,EAAcvwE,GAC5B,OAAO6vE,EAAYx1E,IAAI2F,GAGlB,SAASwwE,EAAe30E,GAC7Bk0E,EAAkBpoE,SAAQ,CAACvB,EAAKpG,KAC9BoG,EAAIuB,SAAShN,IACX,GAAIA,IAAakB,EAAkB,CACjC,MAAM40E,EAAiBT,EAAqB31E,IAAI2F,GAChD,IAAKywE,EAAgB,QAErB70E,EAAAA,EAAAA,IAAkB60E,GAClBT,EAAqBvzE,OAAOuD,GAC5B+vE,EAAkBtzE,OAAOuD,UAM1B,SAASg0B,EAAeh0B,EAAamwE,GAC1C,MAAM39C,EAAYu9C,EAAkB11E,IAAI2F,GACnCwyB,GACLA,EAAU/1B,OAAO0zE,GAGnB,SAASC,EAAepwE,GACtB,MAAM0wE,EAAkB,iBAA2B1wE,IAInD,OAFA6vE,EAAYvzE,IAAI0D,EAAK0wE,GAEdx0E,QAAQzB,QAAQi2E,GAGzB7zE,eAAewzE,EACbrwE,EAAaiwE,EAA6Bre,GAE1C,IAAKn4C,EAAAA,GAAsB,CACzB,MAAMk4C,EAAY3xD,EAAIgM,WAAW,UAAY2N,EAAAA,GAA2BD,EAAAA,GAClE0zD,QAAep3C,EAAS07B,MAAMC,EAAW3xD,EAAK4vE,EAAeK,GAAere,GAElF,GAAIwb,EAAQ,CACV,IAAI1iC,EAAQ0iC,EAMZ,GAJoB,cAAhBA,EAAOlzE,MAAyBkuC,EAAAA,KAClCsC,QAAckkC,EAASlkC,IAGL,eAAhB0iC,EAAOlzE,QAA0BguC,EAAAA,EAAAA,OAAqBwC,EAAO,CAC/D,MAAMimC,QAAiBC,EAAAA,EAAAA,IAAU5wE,EAAK0qC,GAClCimC,IACFjmC,EAAQimC,GAIZ,MAAMjS,EAAWmS,EAAanmC,GAI9B,OAFAmlC,EAAYvzE,IAAI0D,EAAK0+D,GAEdA,GAIX,GAAIuR,IAAgB9yE,EAAAA,GAAAA,OAAuB,CACzC,MAAM2zE,EAAc,IAAIC,YAClBC,EAAYj3E,IAAIw+B,gBAAgBu4C,GACtC,IAAIr8D,GAAS,EAiBb,OAfAq8D,EAAY92E,iBAAiB,cAAc,KACzC,GAAIya,EACF,OAEFA,GAAS,EAET,MAAMw8D,EAAeH,EAAYI,gBAAgB,cAE3ChB,EAAaiB,EAAenxE,EAAK8wE,EAAaG,GACpDjB,EAAqB1zE,IAAI0D,EAAKkwE,IAEzB50E,EAAAA,EAAAA,IAAQ,gBAAiB,CAAE0E,IAAAA,EAAKiwE,YAAAA,GAAeC,MAGtDL,EAAYvzE,IAAI0D,EAAKgxE,GACdA,EAGT,MAAMd,EAAaiB,EAAenxE,GAClCgwE,EAAqB1zE,IAAI0D,EAAKkwE,GAE9B,MAAMvC,QAAeryE,EAAAA,EAAAA,IAAQ,gBAAiB,CAAE0E,IAAAA,EAAKiwE,YAAAA,EAAare,cAAAA,GAAiBse,GACnF,IAAKvC,EACH,MAAM,IAAI9yE,MAAO,yBAAwBmF,KAG3C,IAAI,SAAE0+D,EAAF,SAAY17D,GAAa2qE,EAE7B,GAAiB,cAAb3qE,IAA6BolC,EAAAA,GAAmB,CAClD,MAAM+pB,QAAa4L,EAAAA,EAAAA,IAAUW,GAC7B3kE,IAAIq3E,gBAAgB1S,GACpB,MAAMh0B,QAAckkC,EAASzc,GAC7BuM,EAAWmS,EAAanmC,GACxB1nC,EAAW0nC,EAAMxwC,KAGnB,GAAiB,eAAb8I,KAA8BklC,EAAAA,EAAAA,MAAmB,CACnD,MAAMiqB,QAAa4L,EAAAA,EAAAA,IAAUW,GAC7B3kE,IAAIq3E,gBAAgB1S,GACpB,MAAMh0B,QAAckmC,EAAAA,EAAAA,IAAU5wE,EAAKmyD,GAC/BznB,IACFg0B,EAAWmS,EAAanmC,IAM5B,OAFAmlC,EAAYvzE,IAAI0D,EAAK0+D,GAEdA,EAGT,SAASyS,EAAenxE,EAAa8wE,EAA2BG,GAC9D,MAAMf,EAA4B,CAACp4C,EAAkBg3C,KAA6B,MAChF,UAAAiB,EAAkB11E,IAAI2F,UAAtB,SAA4B2H,SAAShN,IACnCA,EAASm9B,GACLn9B,EAASmB,aAAYo0E,EAAWp0E,YAAa,MAGlC,IAAbg8B,IACFg5C,MAAAA,GAAAA,EAAaO,eAGVvC,IAILmC,MAAAA,GAAAA,EAAcK,aAAaxC,KAG7B,OAAOoB,EAGT,SAASW,EAAaU,GACpB,OAAIA,aAAqBrf,KAChBn4D,IAAIw+B,gBAAgBg5C,GAGtBA,EAGLjmC,EAAAA,IACF7W,UAAU+8C,cAAcx3E,iBAAiB,WAAW6C,MAAAA,IAClD,MAAM,KAAE3C,EAAF,UAAQI,EAAR,OAAmB6O,GAAW1H,EAAExH,KAMtC,GAAa,gBAATC,EACF,OAGF,MAAM8P,QAAe1O,EAAAA,EAAAA,IAAQ,gBAAiB,CAAE20E,YAAa9yE,EAAAA,GAAAA,eAA+BgM,IAC5F,IAAKa,EACH,OAGF,MAAM,YAAE8kE,EAAF,SAAe9rE,EAAf,SAAyByuE,GAAaznE,EAE5CyqB,UAAU+8C,cAAcE,WAAY31E,YAAY,CAC9C7B,KAAM,eACNI,UAAAA,EACA0P,OAAQ,CACN8kE,YAAAA,EACA9rE,SAAAA,EACAyuE,SAAAA,IAED,CAAC3C,Q,+BC1PD,MAAMl6B,EAAmB,I,oFCGzB,IAAK+8B,G,SAAAA,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,MAAAA,GAAAA,Q,CAAAA,IAAAA,EAAAA,KAoBZ,MAAMC,EAAyC,GACzCC,EAAyC,IAEzC,YAAE99C,EAAF,aAAeT,IAAiBu/B,EAAAA,EAAAA,KAE/Bh2D,eAAeooB,EAA0DP,EAAeC,GAC7F,IAAKitD,EAAcltD,GAAa,CAC9B,OAAQA,GACN,KAAKitD,EAAQG,KACXF,EAAcD,EAAQG,MAAQ,8BAC9B,MACF,KAAKH,EAAQI,KACPp4E,EAAAA,IAEFC,QAAQC,IAAI,8BAGd+3E,EAAcD,EAAQI,MAAQ,wEAC9B,MACF,KAAKJ,EAAQK,MACXJ,EAAcD,EAAQK,OAAS,+DAC/B,MACF,KAAKL,EAAQM,MACXL,EAAcD,EAAQM,OAAS,8DAIlCL,EAAcltD,GAA4C1nB,KAAKs2B,GAGlE,MAAM4+C,QAAgBN,EAAcltD,GAMpC,OAJKmtD,EAAantD,KAChBmtD,EAAantD,GAAcwtD,GAGtBntD,EAAoBL,EAAYC,GAGlC,SAASI,EAAmEL,EAAeC,GAChG,MAAMutD,EAASL,EAAantD,GAE5B,GAAKwtD,EAIL,OAAOA,EAAOvtD,GAGT,MAAMK,EAAkB+O,G,iNC7C/B,SAASo+C,EAAeC,GACtB,MAAMn4E,EAAOm4E,EAAaC,SAC1B,OAAOv0C,KAAKG,UAAU,CACpBq0C,SAAUr4E,EAAKq4E,SACftqD,KAAM/tB,EAAK+tB,OAIf,SAASuqD,IACP,QAAKjX,EAAAA,KACC,qBAAsBkX,0BAA0B97B,UAWtB,WAA5B+7B,aAAaC,YACX/4E,EAAAA,IAEFC,QAAQ4B,KAAK,oDAER,GAIH,gBAAiBP,SACjBtB,EAAAA,IAEFC,QAAQ4B,KAAK,2CAER,IAxBH7B,EAAAA,IAEFC,QAAQ4B,KAAK,gDAER,IA6CX,MAGMm3E,EAAiB,IAAI7kE,IAEpBjR,eAAe+1E,EAAgB5uE,EAAaq5D,GACjD,QAAWx3D,IAAP7B,GAAoB2uE,EAAeplE,IAAIvJ,GAAK,OAChD,MAAM,wBAAE6uE,IAA4B12C,EAAAA,EAAAA,KAAqBxI,EAAAA,EAAAA,OACnDm/C,EAAgBzV,EAASA,EAAS,GAAKwV,EAA0B,GACvE,GAAsB,IAAlBC,EAAqB,OAEzB,MAAM1sC,EAAQ,IAAIm1B,MAAM,sBACxBn1B,EAAMi3B,OAASyV,EACf1sC,EAAM1a,aAAa,kBAAmB,qBAC3B7lB,IAAP7B,IACFoiC,EAAMpsC,iBAAiB,SAAS,KAC9B24E,EAAexkE,IAAInK,KAClB,CAAE+uE,MAAM,IAEX53E,YAAW,KACTw3E,EAAel2E,OAAOuH,KAlBH,MAsBvB,UACQoiC,EAAM4sC,OACZ,MAAOz4E,GACHZ,EAAAA,IAEFC,QAAQ4B,KAAK,6CAKZ,MAAMy3E,GAA2Bn7D,EAAAA,EAAAA,IAAS86D,EAAiB,KAAM,GAAM,GAS9E/1E,eAAeq2E,IACP,iBAAkBj4E,SACnB,CAAC,UAAW,UAAU6K,SAAS2sE,aAAaC,mBACzCD,aAAaS,qBAIvBr2E,eAAes2E,EAAoBf,GACjC,MAAM1gE,GAASiiB,EAAAA,EAAAA,MACTy/C,GAAWhyE,EAAAA,EAAAA,MACjB,GAAIgxE,EACF,IACE,MAAM77C,EAAc47C,EAAeC,GAInC,aAHM92E,EAAAA,EAAAA,IAAQ,mBAAoBi7B,SAC5B67C,EAAav8C,mBACnBu9C,EAASC,oBAET,MAAO94E,GACHZ,EAAAA,IAEFC,QAAQC,IAAI,0CAA2CU,GAIzDmX,EAAOpS,aACHhE,EAAAA,EAAAA,IAAQ,mBAAoBoW,EAAOpS,KAAKi3B,aAC9C68C,EAASC,qBAINx2E,eAAeg5B,IACpB,IAAK08C,IAAwB,OAC7B,MAAMe,QAAkC7+C,UAAU+8C,cAAc+B,MAC1DnB,QAAqBkB,EAA0BE,YAAYC,wBAC3DN,EAAoBf,GAI5B,IAAIsB,GAAoB,EAwBjB72E,eAAeu9B,IACpB,IAAKm4C,IAIH,kBADMW,IAGR,MAAMI,QAAkC7+C,UAAU+8C,cAAc+B,MAChE,IAAInB,QAAqBkB,EAA0BE,YAAYC,kBAC/D,GA9EF,SAAkCrB,GAChC,MAAM1gE,GAASiiB,EAAAA,EAAAA,MACf,OAAKjiB,EAAOpS,OAAS8yE,GACjBD,EAAeC,KAAkB1gE,EAAOpS,KAAKi3B,aAC1C55B,KAAKC,MAAQ8U,EAAOpS,KAAKk3B,aAxCX,MAkHhBm9C,CAAyBvB,GAA9B,OACMe,EAAoBf,GAC1B,IACEA,QAAqBkB,EAA0BE,YAAYp5C,UAAU,CACnEw5C,iBAAiB,IAEnB,MAAMr9C,EAAc47C,EAAeC,GAC/Bz4E,EAAAA,IAEFC,QAAQC,IAAI,sCAAuC08B,SAE/Cj7B,EAAAA,EAAAA,IAAQ,iBAAkBi7B,IAChCn1B,EAAAA,EAAAA,MACGyyE,eAAet9C,GAClB,MAAOh8B,GACyB,WAA5Bk4E,aAAaC,WAKX/4E,EAAAA,IAEFC,QAAQ4B,KAAK,mDAEN7B,EAAAA,KAKTC,QAAQC,IAAI,sCAAuCU,GAI/CA,EAAM0L,OAAS6tE,aAAaC,iBACxBb,OAmFPr2E,eAAem3E,EAAf,GAG6C,IAHR,KAC1C7sE,EAD0C,QAE1CrM,GACkD,EAClD,MAAM,oBAAEo/B,SAvJVr9B,iBACE,GAAI62E,EAAmB,OAAOv3C,EAAAA,EAAAA,KAAqBxI,EAAAA,EAAAA,OACnD,MAAOsgD,EAAgBC,SAA0Bh4E,QAAQ0+B,IAAI,EAC3Dt/B,EAAAA,EAAAA,IAAQ,4BAA6B,CACnCo+B,kBAAkB/F,EAAAA,EAAAA,MAAY+F,oBAEhCp+B,EAAAA,EAAAA,IAAQ,8BAA+B,CACrCo+B,kBAAkB/F,EAAAA,EAAAA,MAAY+F,qBAGlC,IAAKu6C,EAAgB,OAAO93C,EAAAA,EAAAA,KAAqBxI,EAAAA,EAAAA,OAEjD,IAAIjiB,GAASkoB,EAAAA,EAAAA,KAAgBjG,EAAAA,EAAAA,MAAasgD,GAM1C,OALIC,IACFxiE,GAASioB,EAAAA,EAAAA,IAAoBjoB,EAAQwiE,KAEvC1gD,EAAAA,EAAAA,IAAU9hB,GACVgiE,GAAoB,GACbv3C,EAAAA,EAAAA,IAAqBzqB,GAqIUyiE,GACtC,IAlFF,SAA6BhtE,GAC3B,IAAKusE,EAAmB,OAAO,EAC/B,MAAMhiE,GAASiiB,EAAAA,EAAAA,MAEf,SADgB0P,EAAAA,EAAAA,IAAkBl8B,GAAMg1B,EAAAA,EAAAA,IAAqBzqB,IAASq8C,EAAAA,EAAAA,IAAuBr8C,KAC9EvK,EAAK+6B,cAAgB/6B,EAAK27D,UAIjChgE,SAASsxE,YA0EZC,CAAoBltE,GAAO,OAChC,MAAMmtE,EA/PA,iBAAkBr5E,OAQQ,WAA5Bw3E,aAAaC,aACX/4E,EAAAA,IAEFC,QAAQ4B,KAAK,oDAER,IAZH7B,EAAAA,IAEFC,QAAQ4B,KAAK,8DAER,GA2PT,IAAK0+B,IAAwBo6C,EAG3B,YADArB,EAAyBxzE,OAAO3E,EAAQkJ,KAAOmD,EAAKnD,IAGtD,IAAKswE,EAA2B,OAChC,IAAKx5E,EAAQkJ,GAAI,OAEjB,MAAM,MACJ7B,EADI,KAEJ0lB,GAnFJ,SAAgC1gB,EAAerM,GAC7C,MAAM4W,GAASiiB,EAAAA,EAAAA,OACT,SACJ8T,EADI,iBAEJN,GACErsC,EAEEy5E,EAAgB9sC,GAAW71B,EAAAA,EAAAA,IAAWF,EAAQ+1B,QAAY5hC,EAC1D2uE,GAAgB1qC,EAAAA,EAAAA,IAAiBhvC,GACjC25E,EAAsBD,GAAiBrtC,GACzCwV,EAAAA,EAAAA,IAAkBjrC,EAAQvK,EAAKnD,GAAImjC,QACnCthC,GAEF6uE,cAAeC,EACf3vE,aAAc4vE,GACZJ,GAAiB,GAEfK,EAAoBF,EACtBA,EAAoBvuE,KAAKuJ,IAAWiC,EAAAA,EAAAA,IAAWF,EAAQ/B,KACtDrJ,OAAgBhD,cACjBuC,EACEivE,GAAoBh0C,EAAAA,EAAAA,IAAqB35B,GACzC4tE,EAAkBD,GAAoBljE,EAAAA,EAAAA,IAAWF,EAAQojE,QAAqBjvE,EAEpF,IAAIgiB,EACJ,IAAI+b,EAAAA,EAAAA,IAA+Bz8B,GAAMg1B,EAAAA,EAAAA,IAAqBzqB,IAASq8C,EAAAA,EAAAA,IAAuBr8C,IAC5F,IAAI41B,EAAAA,EAAAA,IAAgBxsC,GAAU,CAC5B,MAAMk6E,EAAS7tE,KAASu5B,EAAAA,EAAAA,IAAcv5B,IAASrM,EAAQ2sC,WAAa3sC,EAAQsJ,QAE5EyjB,GAAOnjB,EAAAA,EAAAA,GACLwoE,EAAAA,GACApyE,EACCk6E,OAAyBnvE,EAAhB0uE,EACVS,EAAS7tE,OAAOtB,EAChBgvE,EACAJ,EACAG,EACA,CAAEpvE,aAAa,QAEZ,CACL,MAAMyvE,GAAajwC,EAAAA,EAAAA,IAAqBkoC,EAAAA,GAAgB/lE,EAAKnD,GAAIuwE,GAC3DnrC,GAAUviC,EAAAA,EAAAA,IAAsBqmE,EAAAA,GAAgBpyE,GAEtD+sB,EAAOotD,EAAc,GAAEA,MAAe7rC,IAAYA,OAGpDvhB,EAAO,cAGT,MAAO,CACL1lB,OAAOiF,EAAAA,EAAAA,GAAa8lE,EAAAA,GAAgB/lE,EAAM4tE,GAC1CltD,KAAAA,GAiCEqtD,CAAuB/tE,EAAMrM,GAE3Bwc,QA/BRza,eAAyBsK,GACvB,MAAMguE,GAAYh0C,EAAAA,EAAAA,IAAkBh6B,GACpC,IAAKguE,EAAW,OAChB,IAAI5D,EAAY6D,EAAAA,GAA0BD,GAK1C,OAJK5D,UACG6D,EAAAA,GAAkBD,EAAWh4E,EAAAA,GAAAA,SACnCo0E,EAAY6D,EAAAA,GAA0BD,IAEjC5D,EAuBY8D,CAAUluE,GAE7B,GAAIorE,IAAwB,OAC1B,UAAI99C,UAAU+8C,qBAAd,OAAI,EAAyBE,YAE3Bj9C,UAAU+8C,cAAcE,WAAW31E,YAAY,CAC7C7B,KAAM,yBACN+B,QAAS,CACPkG,MAAAA,EACA0lB,KAAAA,EACAvQ,KAAAA,EACAlT,OAAQ+C,EAAKnD,GACb1J,UAAWQ,EAAQkJ,UAIpB,CACL,MAAMovE,GAAWhyE,EAAAA,EAAAA,MACX6D,EAA+B,CACnC4iB,KAAAA,EACAvQ,KAAAA,EACAg+D,MAAOh+D,EACPiU,IAAK9rB,OAAO3E,EAAQkJ,KAGlB,YAAaywB,YACfxvB,EAAQswE,QAAU,CAAC,IAAK,IAAK,MAG/B,MAAMxtB,EAAe,IAAI0qB,aAAatwE,EAAO8C,GAE7C8iD,EAAaytB,QAAU,KACrBztB,EAAa0tB,QACbrC,EAASlvE,aAAa,CACpBE,OAAQ+C,EAAKnD,GACb1J,UAAWQ,EAAQkJ,KAEjB/I,OAAOga,OACTha,OAAOga,SAKX8yC,EAAa2tB,OAAS,KACpBzC,EAAyBxzE,OAAO3E,EAAQkJ,KAAOmD,EAAKnD,MAKnD,SAAS2xE,EAA0B15E,GAA8D,OAClG+c,EAAAA,IAAW,UAACyb,UAAU+8C,qBAAX,OAAC,EAAyBE,YACzCj9C,UAAU+8C,cAAcE,WAAW31E,YAAY,CAC7C7B,KAAM,4BACN+B,QAAAA,IAKG,SAAS25E,IAAoB,MAC9B,UAACnhD,UAAU+8C,qBAAX,OAAC,EAAyBE,YAC9Bj9C,UAAU+8C,cAAcE,WAAW31E,YAAY,CAC7C7B,KAAM,kB,wCC/YV,MAAM27E,EAAwB,aACxBC,EAAqB,CAAC,IAAK,KAG1B,SAASC,EAAuBC,GACrCr4C,aAAaK,QAAQ63C,EAAuB/3C,KAAKG,UAAU+3C,IAGtD,SAASv2C,KAMhB,WACE,MAAM8yB,EAAO50B,aAAaC,QAAQi4C,GAClC,IAAKtjB,EACH,OAAO,EAGT,IACE,MAAMyjB,EAAUl4C,KAAKC,MAAMw0B,GAC3B,OAAOujB,EAAmBhwE,SAASkwE,GACnC,MAAOr6E,GACP,OAAO,IAfJs6E,IACHF,EARoB,O,yECCxB,MAAMG,EAAsB,IACtBC,EAAkB,kBAEjB,SAASC,EAAqBC,EAAiCrc,GACpE,OAAOqc,EAAc/vE,QAAQgwE,GAAYA,EAAQC,OAASvc,IAGrD,SAASwc,EAA0BH,GAA6C,UAAZp4E,EAAY,uDAAJ,GAC7Ei3B,EAAcj3B,EAAMsC,QAAQ,WAAY,IACxC20B,EAAYlpB,WAAW,OACzBkpB,EAAcA,EAAYpmB,OAAO,IAGnC,MAAM2nE,EAAoBJ,EACvB/vE,QAAQgwE,GAAYphD,EAAYlpB,WAAWsqE,EAAQI,eAChDC,GAA+DloD,EAAAA,EAAAA,IAAQgoD,EAC1ErwE,KAAKkwE,IAAaA,EAAQM,UAAY,CAAC,KAAKxwE,KAAKywE,IACzC,CACL5wE,KAAO,GAAEqwE,EAAQI,cAAcG,IAC/BP,QAAAA,SAIAQ,EAAcH,EACjBrwE,QAAO,QAAC,KAAEL,GAAH,SAAcivB,EAAYlpB,WAAW/F,MAC5C4xC,MAAK,CAACC,EAAGC,IAAMD,EAAE7xC,KAAK3H,OAASy5C,EAAE9xC,KAAK3H,SAEzC,iBAAOw4E,EAAYA,EAAYx4E,OAAS,UAAxC,aAAO,EAAqCg4E,QAGvC,SAASS,EAAkB94E,EAAeq4E,GAC/C,IAAIphD,EAAcj3B,EAAMsC,QAAQ,UAAW,IAC3C,GAAI+1E,EACFphD,EAAcA,EAAYpmB,OAAOwnE,EAAQI,YAAYp4E,aAChD,GAAIL,EAAM+N,WAAW,KAC1B,OAAO/N,EAET,MAAM+4E,EAqBR,SAAwBC,EAA2BC,GACjD,IAAKA,GAAgC,IAApBA,EAAS54E,OAAc,OAAO63E,EAC/C,GAAwB,IAApBe,EAAS54E,OAAc,OAAO44E,EAAS,GAE3C,MAAMC,EAAiBD,EAASnwC,MAAMiwC,GAAYA,EAAQhrE,WAAWkqE,MAAyBC,EAExFW,EAAcI,EAAS5wE,QAAQ0wE,IACnC,MAAMI,EAAWJ,EAAQz2E,QAAQ,WAAY,IAC7C,GAAI62E,EAASprE,WAAWkqE,GAAsB,OAAO,EACrD,IAAK,IAAIz3E,EAAI,EAAGA,EAAIw4E,EAAkB34E,OAAQG,IAC5C,GAAIA,EAAI24E,EAAS94E,OAAS,GAAM84E,EAAS34E,KAAOy3E,GAAuBkB,EAAS34E,KAAOw4E,EAAkBx4E,GACvG,OAAO,EAGX,OAAO,KAIT,OAA8B,IAAvBq4E,EAAYx4E,OAAew4E,EAAY,GAAKK,EAvCnCE,CAAeniD,EAAaohD,MAAAA,OAAd,EAAcA,EAASY,UAE/CltE,EAAmB,GACzB,IAAIpL,EAAI,EACR,IAAK,IAAIH,EAAI,EAAGA,EAAIy2B,EAAY52B,OAAQG,IAAK,CAC3C,KAAOu4E,EAAQp4E,KAAOs3E,GAAuBt3E,EAAIo4E,EAAQ14E,SACvD0L,EAAO1K,KAAK03E,EAAQp4E,IAChBo4E,EAAQp4E,KAAOs2B,EAAYz2B,KAC7BA,IACIA,IAAMy2B,EAAY52B,UAExBM,IAGFoL,EAAO1K,KAAK41B,EAAYz2B,IACxBG,IAGF,OAAOoL,EAAOnK,KAAK,IAwBd,SAASy3E,EAA0BjB,EAAiCnhD,GACzE,MAAMqiD,EAAiBriD,EAAYlpB,WAAW,KAAOkpB,EAAe,IAAGA,IACjEohD,EAAUE,EAA0BH,EAAekB,GACzD,OAAKjB,EAGG,IAAGA,EAAQI,eAAeK,EAAkBQ,EAAgBjB,KAF3DiB,I,gECjFJ,SAASC,EAAkBC,GAChC,MAAMC,EAAsC,WAArBD,EAAYv9E,KAChC,IAAGu9E,EAAYv9E,QACY,IAA1Bu9E,EAAY11C,SACb,IAAG01C,EAAY11C,WACd,GAEJ,MAAQ,GAAE01C,EAAYrzE,SAASszE,IAG1B,SAASC,IACd,IAAK92D,EAAAA,GAAe,OAEpB,MAAOzc,EAAQszE,GAAkB72D,EAAAA,GAAAA,QAAsB,KAAM,IAAIpgB,MAAM,KACvE,GAAK2D,MAAAA,IAAAA,EAAQ/D,MAAM,WAAY,OAE/B,MAAMu3E,EAAS,CAAC,SAAU,SAAU,aAAa9xE,SAAS4xE,GAE1D,MAAO,CACLtzE,OAAAA,EACAlK,KAAMoJ,QAAQo0E,IAAmBE,EAAUF,EAAqC,SAChF31C,SAAUz+B,QAAQo0E,KAAoBE,EAAS9kD,OAAO4kD,GAAkBr6E,EAAAA,M,eCrBrE,SAASya,EACd+/D,EACAvL,GAGA,IACIwL,EAHJC,IAEA,yDADAC,IACA,yDAGA,OAAO,WAA4B,2BAAxB38E,EAAwB,yBAAxBA,EAAwB,gBAC7By8E,GACFx3D,aAAaw3D,GACbA,OAAiBjyE,GACRkyE,GACTF,KAAMx8E,GAIRy8E,EAAiBvmB,KAAKp2D,YAAW,KAC3B68E,GACFH,KAAMx8E,GAGRy8E,OAAiBjyE,IAChBymE,IAIA,SAAS1N,EACdiZ,EACAvL,GAEA,IACI2L,EACAC,EACA78E,EAJJ08E,IACA,yDAKA,OAAO,WACLG,GAAY,EADsB,2BAAzBC,EAAyB,yBAAzBA,EAAyB,gBAElC98E,EAAO88E,EAEFF,IACCF,IACFG,GAAY,EACZL,KAAMx8E,IAIR48E,EAAW1mB,KAAK6mB,aAAY,KAC1B,IAAKF,EAIH,OAFA3mB,KAAK8mB,cAAcJ,QACnBA,OAAWpyE,GAIbqyE,GAAY,EACZL,KAAMx8E,KACLixE,KAKF,SAAS17C,EAA6CinD,GAC3D,OAAOS,EAAa9mD,EAASqmD,GAGxB,SAASlnD,EAAoDknD,GAClE,OAAOS,EAAa7mD,EAAgBomD,GAG/B,SAASxkD,EAAiDwkD,GAC/D,OAAOS,EAAa3mD,EAAWkmD,GAO1B,SAASS,EAA0CrnD,EAAwB4mD,GAChF,IACIx8E,EADAk9E,GAAU,EAGd,OAAO,WAA6B,2BAAzBJ,EAAyB,yBAAzBA,EAAyB,gBAClC98E,EAAO88E,EAEFI,IACHA,GAAU,EAEVtnD,GAAY,KACVsnD,GAAU,EACVV,KAAMx8E,QAMP,SAASwjE,EAAOx/C,EAAwBY,GAEzCsxC,KAAKinB,oBAEPjnB,KAAKinB,oBAAoBn5D,EAAI,CAAEY,QAAAA,IAE/B0R,EAAUtS,G,8HAQP,MAAMtiB,EAASuvE,GAAe,IAAIpwE,SAAezB,IACtDU,YAAW,IAAMV,KAAW6xE,MAGvB,SAASmM,IACd,OAAO,IAAIv8E,SAAezB,IACxB+2B,EAAQ/2B,MAIZ,IAAIi+E,EACAC,EA2BAC,EACAC,EA0BAC,EAnDG,SAAStnD,EAAQ72B,GAAiD,IAAnBo+E,EAAmB,wDAClEL,EAYMK,EACTJ,EAAyBr5E,KAAK3E,GAE9B+9E,EAAiBp5E,KAAK3E,IAdtB+9E,EAAmBK,EAAY,GAAK,CAACp+E,GACrCg+E,EAA0BI,EAAY,CAACp+E,GAAY,GAEnD8d,uBAAsB,KACpB,MAAMugE,EAAmBN,EACnBO,EAA0BN,EAChCD,OAAmB7yE,EACnB8yE,OAA0B9yE,EAC1BozE,EAAwBtxE,SAAS0X,GAAOA,MACxC25D,EAAiBrxE,SAAS0X,GAAOA,UAShC,SAASoS,EAAe92B,GAC7B62B,EAAQ72B,GAAU,GAMb,SAASg3B,EAAUh3B,GAAiD,IAAnBo+E,EAAmB,wDACpEH,EAYMG,EACTF,EAA2Bv5E,KAAK3E,GAEhCi+E,EAAmBt5E,KAAK3E,IAdxBi+E,EAAqBG,EAAY,GAAK,CAACp+E,GACvCk+E,EAA4BE,EAAY,CAACp+E,GAAY,GAErDuB,QAAQzB,UAAUuC,MAAK,KACrB,MAAMg8E,EAAmBJ,EACnBK,EAA0BJ,EAChCD,OAAqB/yE,EACrBgzE,OAA4BhzE,EAC5BozE,EAAwBtxE,SAAS0X,GAAOA,MACxC25D,EAAiBrxE,SAAS0X,GAAOA,UAShC,SAASuS,EAAiBj3B,GAC/Bg3B,EAAUh3B,GAAU,GAKf,SAASu+E,EAAev+E,GAA8C,IAAhBw+E,EAAgB,wDAe3E,OAdKL,IACHA,EAAwB,GAExBvnB,KAAKv3D,iBAAiB,gBAAgB,KACpC8+E,EAAuBnxE,SAAS0X,GAAOA,UAIvC85D,EACFL,EAAsBx5E,KAAK3E,GAE3Bm+E,EAAsBM,QAAQz+E,GAGzB,KACLm+E,EAAwBA,EAAuBxyE,QAAQ+Y,GAAOA,IAAO1kB,O,eCtMzE,IAAI0+E,E,yBAEJ,IACEA,EAAgB,IAAI31E,OAAO,mBAAoB,MAC/C,MAAOjC,GAEP43E,EAAgB,IAAI31E,OAAO,cAAe,KAG7B,SAASgiC,EAAY4zC,EAAkBC,GACpD,IAAKD,IAAaC,EAChB,OAAO,EAGT,MAAMC,EAAgC,iBAAXD,EAAsBA,EAAOluE,cAAc5K,MAAM44E,GAAiBE,EACvFE,EAAgBH,EAASjuE,cAG/B,GAA2B,IAAvBmuE,EAAYl7E,SAAiBm7E,EAAc3zE,SAAS0zE,EAAY,IAClE,OAAO,EAGT,IAAIE,EAEJ,OAAOF,EAAYnjC,OAAOsjC,KACnBF,EAAc3zE,SAAS6zE,KAIvBD,IACHA,EAAgBD,EAAch5E,MAAM44E,IAG/BK,EAAcjxE,MAAMmxE,GAAiBA,EAAa5tE,WAAW2tE,QAIjE,SAASh0C,EAA4B4zC,GAC1C,MAAMC,EAAcD,EAAOluE,cAAc5K,MAAM44E,GAE/C,OAAQC,GAAqB5zC,EAAY4zC,EAAUE,K,gCCxC9C,MAAMlqC,EAAiB5V,GACrB57B,KAAKC,MAAMpB,KAAKC,MAAQ,KAAQ88B,G,8ECCzC,SAASmgD,EAAiBhoB,GACtB,OAAO,IAAI31D,SAAQ,CAACzB,EAASD,KAEzBq3D,EAAQioB,WAAajoB,EAAQkoB,UAAY,IAAMt/E,EAAQo3D,EAAQ7nD,QAE/D6nD,EAAQmoB,QAAUnoB,EAAQ2I,QAAU,IAAMhgE,EAAOq3D,EAAQt3D,UAWjE,IAAI0/E,EACJ,SAASC,IAIL,OAHKD,IACDA,EAXR,SAAqBE,EAAQC,GACzB,MAAMC,ICJU5lD,UAAU6lD,eACtB,WAAWrgB,KAAKxlC,UAAUD,aACzB,iBAAiBylC,KAAKxlC,UAAUD,YAEnB+lD,UAAUC,UAGrB,IAAIt+E,SAAQ,SAAUzB,GACzB,IAAIggF,EAAS,WAAc,OAAOF,UAAUC,YAAYh+E,QAAQ/B,IAChEigF,EAAatC,YAAYqC,EAAQ,KACjCA,OACDj+E,SAAQ,WAAc,OAAO67E,cAAcqC,MANnCx+E,QAAQzB,WDDKuC,MAAK,KACzB,MAAM60D,EAAU0oB,UAAUvoB,KASQ,gBAPlC,OADAH,EAAQ8oB,gBAAkB,IAAM9oB,EAAQ7nD,OAAO4wE,kBAAkBR,GAC1DP,EAAiBhoB,MCRhC,IAOQ6oB,EDGJ,MAAO,CAACG,EAAQlgF,IAAa0/E,EAAIr9E,MAAM89E,GAAOngF,EAASmgF,EAAGC,YAAYX,EAAWS,GAAQG,YAAYZ,MAK3Ea,CAAY,EAAgB,WAE/ChB,E,wBEhBX,MAAMiB,EAAS,CAAC,EAAG,EAAG,EAAG,EAAG,GAErB,SAASC,IAAqC,IAApBC,EAAoB,wDACnD,GAAIA,GAAcz9C,aAAaC,QAAQzkB,EAAAA,IACrC,OAAO,EAGT,MAAMkiE,EAAe19C,aAAaC,QAAQ1kB,EAAAA,IAC1C,IAAKmiE,EAAc,OAAO,EAE1B,IACE,MAAMx9C,EAAWC,KAAKC,MAAMs9C,GAC5B,OAAO/3E,QAAQu6B,GAAYA,EAAS75B,IAAM65B,EAASy9C,MACnD,MAAO3/E,GAEP,OAAO,GAIJ,SAAS+5B,EAAaf,EAA6BgB,GACxD,MAAM,SAAE2H,EAAF,KAAYtV,EAAZ,OAAkBjG,GAAW4S,EAEnCgJ,aAAaK,QAAQ9kB,EAAAA,GAAkB4kB,KAAKG,UAAU,CAAEq9C,KAAMh+C,EAAUt5B,GAAI2xB,KAC5EgI,aAAaK,QAAQ,KAAMv+B,OAAO69B,IAClCnhC,OAAO6rB,KAAKA,GAAM5hB,IAAI0sB,QAAQnrB,SAAS4zE,IACrC59C,aAAaK,QAAS,KAAIu9C,aAAiBz9C,KAAKG,UAAUjW,EAAKuzD,QAG7Dx5D,GACF5lB,OAAO6rB,KAAKjG,GAAQ3b,IAAI0sB,QAAQnrB,SAAS4zE,IACvC59C,aAAaK,QAAS,KAAIu9C,SAAaz9C,KAAKG,UAAUlc,EAAOw5D,QAK5D,SAAS3lD,IACd,CACE1c,EAAAA,GACA,QACGgiE,EAAO90E,KAAKm1E,GAAU,KAAIA,kBAC1BL,EAAO90E,KAAKm1E,GAAU,KAAIA,YAC7B5zE,SAAS8jB,IACTkS,aAAa69C,WAAW/vD,MAIrB,SAASmJ,IACd,IAAKumD,IACH,OAGF,MAAMt9C,EAAWC,KAAKC,MAAMJ,aAAaC,QAAQ1kB,EAAAA,KAC3CokB,EAAWxK,OAAO+K,EAASy9C,MAC3BtzD,EAA+B,GAC/BjG,EAAiC,GAsBvC,OApBAm5D,EAAOvzE,SAAS4zE,IACd,IACE,MAAM9vD,EAAMkS,aAAaC,QAAS,KAAI29C,cAClC9vD,IACFzD,EAAKuzD,GAAQz9C,KAAKC,MAAMtS,IAG1B,MAAM3K,EAAO6c,aAAaC,QAAS,KAAI29C,UACnCz6D,IACFiB,EAAOw5D,GAAQz9C,KAAKC,MAAMjd,IAE5B,MAAOnlB,GACHhC,EAAAA,IAEFC,QAAQ4B,KAAK,gCAAiCG,OAM/CQ,OAAO6rB,KAAKA,GAAM1pB,OAEhB,CACLg/B,SAAAA,EACAtV,KAAAA,EACAjG,OAAAA,QALF,EASKllB,eAAew3B,IACpB,MAAMonD,EAAY99C,aAAaC,QAAQzkB,EAAAA,IACvC,IAAKsiE,EAAW,OAEhB,MAAMC,QFjER,SAAajwD,EAAKkwD,EAAczB,KAC5B,OAAOyB,EAAY,YAAanW,GAAUqU,EAAiBrU,EAAMnrE,IAAIoxB,MEgE7CmwD,CAAS,UAASH,KAC5C,IAEE/lD,EADoBoI,KAAKC,MAAM29C,IAE/B,MAAO//E,GACHhC,EAAAA,IAEFC,QAAQ4B,KAAK,gCAAiCG,IAO7CkB,eAAey3B,IACpBqJ,aAAa69C,WAAWriE,EAAAA,IAExB,MAAM0iE,QF6BR,SAAcF,EAAczB,KACxB,OAAOyB,EAAY,YAAanW,IAE5B,GAAIA,EAAMsW,WACN,OAAOjC,EAAiBrU,EAAMsW,cAElC,MAAMC,EAAQ,GACd,OArBR,SAAoBvW,EAAO7qE,GAOvB,OANA6qE,EAAMwW,aAAajC,UAAY,WACtBzb,KAAKt0D,SAEVrP,EAAS2jE,KAAKt0D,QACds0D,KAAKt0D,OAAOiyE,aAETpC,EAAiBrU,EAAMuV,aAcnBmB,CAAW1W,GAAQ12C,GAAWitD,EAAMz8E,KAAKwvB,EAAOrD,OAAMzuB,MAAK,IAAM++E,OEpCxDH,SAEhB1/E,QAAQ0+B,IAAkB,CAC9B5E,EAAS48B,MAAM,aACZipB,EACAv1E,QAAQzI,GAAmB,iBAANA,GAAkBA,EAAEmO,WAAW,4BACpD5F,KAAKvI,GFpBZ,SAAa4tB,EAAKkwD,EAAczB,KAC5B,OAAOyB,EAAY,aAAcnW,IAC7BA,EAAM/oE,OAAOgvB,GACNouD,EAAiBrU,EAAMuV,gBEiBpBa,CAAQ/9E,S,smECzG1B,IAAIs+E,GAAgB,EAEpB,MAAMC,EAAkB,yDAGlBC,EAAgB,IAAIvuE,IAAI,CAC5B,wBACA,2BAGIwuE,EAAO,CAACC,EAAeC,EAAaC,KAChC,EAAIA,GAAsBF,EAAQE,EAAqBD,EAG3DE,EAAUvgF,OAAO6rB,KAAK20D,GAAiDv2E,KAAKw2E,IAAD,CAC/EA,SAAAA,EACAF,OAAQ,CAACG,EAASF,EAAYC,GAAU,IAAKC,EAASF,EAAYC,GAAU,SA6C9E,SAASC,EAASC,GAChB,MAAM9yE,EAASoyE,EAAgBx2D,KAAKk3D,GAEpC,MAAO,CACLC,EAAG5jB,SAASnvD,EAAO,GAAI,IACvBgzE,EAAG7jB,SAASnvD,EAAO,GAAI,IACvB+tC,EAAGohB,SAASnvD,EAAO,GAAI,IACvB8tC,OAAiBjyC,IAAdmE,EAAO,GAAmBmvD,SAASnvD,EAAO,GAAI,SAAMnE,GAI3D,SAASo3E,EAAwBC,EAAoBC,GAAkD,IAAhCV,EAAgC,uDAAH,EAClGC,EAAO/0E,SAAQ,IAA0C,IAAzC,SAAEi1E,EAAUF,OAAQU,GAAqB,EACvD,MAAML,EAAIj/E,KAAKoP,MAAMovE,EAAKc,EAAeF,GAAYH,EAAGK,EAAeD,GAAUJ,EAAGN,IAC9EO,EAAIl/E,KAAKoP,MAAMovE,EAAKc,EAAeF,GAAYF,EAAGI,EAAeD,GAAUH,EAAGP,IAC9E1kC,EAAIj6C,KAAKoP,MAAMovE,EAAKc,EAAeF,GAAYnlC,EAAGqlC,EAAeD,GAAUplC,EAAG0kC,IAC9E3kC,OAAqCjyC,IAAjCu3E,EAAeF,GAAYplC,EACjCh6C,KAAKoP,MAAMovE,EAAKc,EAAeF,GAAYplC,EAAIslC,EAAeD,GAAUrlC,EAAI2kC,SAC5E52E,EAEJ/C,SAAS47B,gBAAgBprB,MAAMgsB,YAAYs9C,OAAgB/2E,IAANiyC,EAChD,QAAOilC,KAAKC,KAAKjlC,KAAKD,EAAI,OAC1B,OAAMilC,KAAKC,KAAKjlC,MAEjBskC,EAAc9uE,IAAIqvE,IACpB95E,SAAS47B,gBAAgBprB,MAAMgsB,YAAa,GAAEs9C,QAAiB,GAAEG,KAAKC,KAAKjlC,QAKjF,QAxEoB,CAAC1Y,EAA2Bg+C,KAC9C,MAAMC,EAAwB,SAAVj+C,EACdk+C,EAAgBpB,GAAiBkB,EACjCH,EAAaI,EAAc,EAAI,EAC/BH,EAAWG,EAAc,EAAI,EAC7BE,EAAU7gF,KAAKC,MACf6gF,EAAgB36E,SAAS46E,cAAc,4BAE7C56E,SAAS47B,gBAAgBxY,UAAU6Z,OAAQ,UAAQu9C,EAAc,QAAU,SACvEnB,GACFr5E,SAAS47B,gBAAgBxY,UAAU/X,IAAI,iBAEzCrL,SAAS47B,gBAAgBxY,UAAU/X,IAAK,SAAQkxB,KAC5Co+C,GACFA,EAAc/xD,aAAa,UAAW4xD,EAAc,UAAY,QAGlEniF,YAAW,KACT2H,SAAS47B,gBAAgBxY,UAAU6Z,OAAO,mBAjCZ,KAoChCo8C,GAAgB,EAEZoB,GACF/rD,EAAAA,EAAAA,KAAQ,MACNu9B,EAAAA,EAAAA,KAAc,KACZ,MAAM9vD,EAAInB,KAAKuP,KAAK1Q,KAAKC,MAAQ4gF,GA1CrB,IA0C6C,GAIzD,OAFAP,EAAwBC,EAAYC,EAU5C,SAAoBl+E,GAClB,OAAO,GAAM,EAAIA,IAAM,IAX6B0+E,CAAW1+E,IAElDA,EAAI,QAIfg+E,EAAwBC,EAAYC,K,2EChEjC,SAASzO,EAAc9uE,GAC5B,OAAOH,OAAOG,GAAOW,QAAQ,mBAAoB,OAGnD,SAASq9E,EAAkBrwC,GAEzB,MAAyB,OADX9tC,OAAO8tC,EAAO5qC,QAAQ,IAC1BmM,QAAQ,GACThR,KAAKoP,MAAMqgC,GAGbA,EAAO5qC,QAAQ,GAAGpC,QAAQ,IAAK,KAGjC,SAASs9E,EAAqBC,GACnC,OAAIA,EAAQ,IACHA,EAGLA,EAAQ,IACF,GAAEF,EAAkBE,EAAQ,QAG9B,GAAEF,EAAkBE,EAAQ,QAG/B,SAASC,EAAgBC,GAA2B,IAAXx1C,EAAW,uDAAH,EACtD,OAAOw1C,EACJz9E,QAAQ,yCAA0C,IAClDmG,OACAjG,MAAM,OACNE,MAAM,EAAG6nC,GACTpiC,KAAK63E,IACJ,IAAKA,EAAK3/E,OAAQ,MAAO,GAEzB,MAAMiM,GADN0zE,GAAO3zE,EAAAA,EAAAA,IAAoB2zE,IACP59E,MAAMkJ,EAAAA,GAC1B,OAAIgB,GAAU0zE,EAAKjyE,WAAWzB,EAAO,IAC5BA,EAAO,GAET0zE,EAAK59E,MAAM,MAAO,GAAGV,iBAE7BE,KAAK,M,eC3CK,SAASmH,EAAuClG,EAASxC,GACtE,OAAKwC,IAASxC,GAAUwC,EAAKxC,QAAUA,EAC9BwC,EAGD,GAAEA,EAAK0G,UAAU,EAAGlJ,Q,sGCC9B,IAAIq/D,EACAvkE,EAEG,MAAM8kF,EAAuB,qHAG7BrhF,eAAe+zE,EAAU5wE,EAAamyD,GAG3C,IAFAgsB,KAEQ/kF,EAAOglF,iBACPrhF,EAAAA,EAAAA,IAZ4B,KAepC,MAAM,OAAEiN,EAAF,MAAUsiC,EAAV,OAAiBC,SAuEzB,SAA0BvsC,EAAamyD,GACrC,OAAO,IAAIj2D,SAASzB,IACbrB,EAAOilF,WACVjlF,EAAOilF,SAAW,IAAI/kF,KAGxBF,EAAOilF,SAAS/hF,IAAI0D,EAAKvF,GACzBrB,EAAO2C,YAAY,CAAEiI,GAAIhE,EAAKmyD,KAAAA,OA9EQmsB,CAAiBt+E,EAAKmyD,GAC9D,GAAK7lB,GAAUC,EAIf,OA2BF,YAAwF,IAArE,OAAEviC,EAAF,MAAUsiC,EAAV,OAAiBC,GAAoD,EAKtF,OAJKoxB,IACHA,EAAS76D,SAASiH,cAAc,WAG3B,IAAI7N,SAASzB,IAClB,MAAM0iE,EAAM,IAAIohB,UAAUv0E,EAAQsiC,EAAOC,GAEzCoxB,EAAOrxB,MAAQA,EACfqxB,EAAOpxB,OAASA,EACJoxB,EAAOjC,WAAW,MAC1B8iB,aAAarhB,EAAK,EAAG,GAEzBQ,EAAO8gB,QAAQtsB,IACb13D,EAAQ03D,MAAAA,EAAAA,OAAQtsD,KACf,YAAa,MA1CX64E,CAAU,CAAE10E,OAAAA,EAAQsiC,MAAAA,EAAOC,OAAAA,IAG7B1vC,eAAe8hF,EAAgBlzD,EAAamf,GACjD,IAAI1C,EAAAA,EAAAA,OAA+C,oBAA1B0C,EAAQ97B,OAAO,EAAG,IACzC,OAAO87B,EAGTuzC,IAEA,MAAMS,QAAgBhO,EAAUnlD,GAAK2wC,EAAAA,EAAAA,IAAcxxB,IAEnD,IAAKg0C,EACH,MAAM,IAAI/jF,MAAO,mCAAkC+vC,KAGrD,OAAO+xB,EAAAA,EAAAA,IAAciiB,GAGvB,SAAST,IACF/kF,IACHA,EAAS,IAAIU,OAAO,IAAIC,IAAI,mBAC5BX,EAAOglF,WAAY,EACnBhlF,EAAO81E,UAAY2P,GAuBvB,SAASA,EAAqBp9E,GAC5B,MAAM,GAAEuC,GAAOvC,EAAExH,KACjB,OAAQwH,EAAExH,KAAKC,MACb,IAAK,cACHd,EAAOglF,WAAY,EACnB,MAGF,IAAK,SACH,GAAIhlF,EAAOilF,SAAS9wE,IAAIvJ,GAAK,CAC3B,MAAMvJ,EAAUrB,EAAOilF,SAAShkF,IAAI2J,GAEpC5K,EAAOilF,SAAS5hF,OAAOuH,GACvBvJ,EAAQgH,EAAExH,U,qFC/ElB,MAAM6kF,EAAe,CACnB,OACA,eACA14E,KAAK9F,GAAY,KAAIA,iBACjBy+E,EAAmB,GAAEjmE,EAAAA,OACrBkmE,EAAc,YAGdC,EAAQ,IACLnhF,KAAKC,MAAM+0B,OAAO,IAAIn2B,MAAU,KAWzC,IAAIuiF,EAEG,MAAMppD,EAAgBqpD,IAC3B,MAAMC,EAAYH,KAEZ,YAAEI,EAAF,GAAeC,GAAOxhD,KAAKC,MAAMJ,aAAaC,QAAQohD,IAAgB,MAE5E,OAAIK,IAAgBF,GAAUG,EArBR,OAqBgCF,EAC7CljF,QAAQ0+B,IAAIkkD,EAAa14E,KAAKpG,GAC5B,IAAI9D,SAAc,CAACzB,EAASD,KACjC,MAAM+kF,EAASz8E,SAASiH,cAAc,UAEhCy1E,EAAgB,IAAMl8E,QAAQR,SAAS+kB,KAAK0C,YAAYg1D,IAE9DA,EAAO50E,IAAM3K,EAAM,IAAIy/E,gBAAgB,CACrCN,OAAQrsD,OAAOqsD,GAAQ5/C,WACvBy2C,QAAS+I,IAGXj8E,SAAS+kB,KAAKyC,YAAYi1D,GAE1BA,EAAOhlB,OAAS,KA7BN4kB,CAAAA,IAChB,MAAMG,EAAKL,IACXthD,aAAaK,QAAQghD,EAAalhD,KAAKG,UAAU,CAC/CohD,YAAaF,EACbG,GAAAA,MA0BMI,CAASP,GACTK,IACIN,IACF5+D,aAAa4+D,GACbA,OAAcr5E,GAEhB65B,IACAjlC,KAGF8kF,EAAO/kB,QAAU,KACfglB,IACAhlF,WAKC0B,QAAQzB,WAIZ,SAASilC,IACd,GAAI/lC,EAAAA,GACF,OAGF,QAAoBkM,IAAhBq5E,EAA2B,OAC/B,MAAME,EAAYH,KAEZ,GAAEK,GAAOxhD,KAAKC,MAAMJ,aAAaC,QAAQohD,IAAgB,MAEzD/+D,EAnEgB,OAmEam/D,EAAYE,GAE/CJ,EAAc/jF,YAAW,KACvB,MAAM,UAAEohC,IAAc5I,EAAAA,EAAAA,MAEhBwrD,EAAuB,4BAAd5iD,IAA2C4+C,EAAAA,EAAAA,KAAiB,GAC3ErlD,EAAaqpD,KACZrhF,KAAKsP,IAAI,EAAa,IAAV6S,IAGV,SAAS0/D,IACdhiD,aAAa69C,WAAWwD,K,0EC3E1B,MAAMY,EAAehzB,EAAAA,IAA2BizB,IAE1CC,EAAgB7kF,OAAOgf,YAC7B,IAAI8lE,EAAoBC,IACpBC,GAAoB,EAUxB,MAAMC,GAAethB,EAAAA,EAAAA,KAAS,KAC5BmhB,EAAoBC,KAEfC,KAiCEF,EAAkBzzC,OAASxwB,EAAAA,IAChCikE,EAAkBzzC,OAASvwB,EAAAA,IACxBgkE,EAAkBxzC,QAAUvwB,EAAAA,MAlCV4wC,EAAAA,IACjBA,EAAAA,IAA2BgzB,IAAiBC,MAEhD5kF,OAAOgC,SAASC,WAEjB,KAAK,GASD,SAAS8iF,IACd,IAAIzzC,EAEFA,EADEl7B,EAAAA,GACOpW,OAAOklF,eAAe5zC,OAAStxC,OAAOklF,eAAeC,QAErDnlF,OAAOgf,YAElB,MAAMomE,EAAc,IAAT9zC,EAIX,OAFAzpC,SAAS47B,gBAAgBprB,MAAMgsB,YAAY,OAAS,GAAE+gD,OAE/C,CACL/zC,MAAOrxC,OAAO2oB,WACd2oB,OAAQtxC,OAAOgf,aAWnB,SAAS4lE,IACP,OAAIxuE,EAAAA,GACKpW,OAAOgkC,WAAW,4BAA4B07B,QAOhD1/D,OAAOgkC,WAAW,0EAA0E07B,QAxCrG1/D,OAAOjB,iBAAiB,oBAAqBkmF,GACzC7uE,EAAAA,GACFpW,OAAOklF,eAAenmF,iBAAiB,SAAUkmF,GAEjDjlF,OAAOjB,iBAAiB,SAAUkmF,GAuCpC,MAOA,EAPmB,CACjB7lF,IAAK,IAAM0lF,EACXO,qBAAsB,IAAMR,EAAgBC,EAAkBxzC,OAC9Dg0C,eAjEF,WACEN,GAAoB,GAiEpBO,cA9DF,WACEP,GAAoB,K,2RCvBlBQ,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB96E,IAAjB+6E,EACH,OAAOA,EAAaC,QAGrB,IAAI/7D,EAAS27D,EAAyBE,GAAY,CAGjDE,QAAS,IAOV,OAHAC,EAAoBH,GAAUr7E,KAAKwf,EAAO+7D,QAAS/7D,EAAQA,EAAO+7D,QAASH,GAGpE57D,EAAO+7D,QAIfH,EAAoBK,EAAID,ECxBxBJ,EAAoBniF,EAAKumB,IACxB,IAAIk8D,EAASl8D,GAAUA,EAAOm8D,WAC7B,IAAOn8D,EAAiB,QACxB,IAAM,EAEP,OADA47D,EAAoBx7D,EAAE87D,EAAQ,CAAElpC,EAAGkpC,IAC5BA,G7HNJjoF,EAAWoD,OAAO+kF,eAAkBC,GAAShlF,OAAO+kF,eAAeC,GAASA,GAASA,EAAa,UAQtGT,EAAoBzhF,EAAI,SAASW,EAAO0qE,GAEvC,GADU,EAAPA,IAAU1qE,EAAQ0+D,KAAK1+D,IAChB,EAAP0qE,EAAU,OAAO1qE,EACpB,GAAoB,iBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAP0qE,GAAa1qE,EAAMqhF,WAAY,OAAOrhF,EAC1C,GAAW,GAAP0qE,GAAoC,mBAAf1qE,EAAM5C,KAAqB,OAAO4C,EAE5D,IAAIwhF,EAAKjlF,OAAOklF,OAAO,MACvBX,EAAoB3D,EAAEqE,GACtB,IAAIE,EAAM,GACVxoF,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,IAAKA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAIiU,EAAiB,EAAPs9D,GAAY1qE,EAAyB,iBAAXoN,KAAyBlU,EAAeoK,QAAQ8J,GAAUA,EAAUjU,EAASiU,GACxH7Q,OAAOolF,oBAAoBv0E,GAASrF,SAAS8jB,GAAS61D,EAAI71D,GAAO,IAAO7rB,EAAM6rB,KAI/E,OAFA61D,EAAa,QAAI,IAAM,EACvBZ,EAAoBx7D,EAAEk8D,EAAIE,GACnBF,G8HvBRV,EAAoBx7D,EAAI,CAAC27D,EAASW,KACjC,IAAI,IAAI/1D,KAAO+1D,EACXd,EAAoBe,EAAED,EAAY/1D,KAASi1D,EAAoBe,EAAEZ,EAASp1D,IAC5EtvB,OAAOulF,eAAeb,EAASp1D,EAAK,CAAEk2D,YAAY,EAAMtnF,IAAKmnF,EAAW/1D,MCJ3Ei1D,EAAoB/vB,EAAI,GAGxB+vB,EAAoBj/E,EAAKmgF,GACjB1lF,QAAQ0+B,IAAIz+B,OAAO6rB,KAAK04D,EAAoB/vB,GAAGtnD,QAAO,CAACw4E,EAAUp2D,KACvEi1D,EAAoB/vB,EAAEllC,GAAKm2D,EAASC,GAC7BA,IACL,KCNJnB,EAAoBoB,EAAKF,GAEZA,EAAU,IAAM,CAAC,GAAK,uBAAuB,GAAK,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,MCF/kBlB,EAAoBqB,SAAYH,GAEnBA,EAAU,IAAM,CAAC,GAAK,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,OCHvNlB,EAAoB1D,EAAI,WACvB,GAA0B,iBAAfgF,WAAyB,OAAOA,WAC3C,IACC,OAAO1jB,MAAQ,IAAI2jB,SAAS,cAAb,GACd,MAAOxgF,GACR,GAAsB,iBAAXxG,OAAqB,OAAOA,QALjB,GCAxBylF,EAAoBe,EAAI,CAACN,EAAKjwB,IAAU/0D,OAAOu6C,UAAU+uB,eAAengE,KAAK67E,EAAKjwB,GlIA9El4D,EAAa,GACbC,EAAoB,cAExBynF,EAAoB19D,EAAI,CAAChjB,EAAKkiF,EAAMz2D,EAAKm2D,KACxC,GAAG5oF,EAAWgH,GAAQhH,EAAWgH,GAAKV,KAAK4iF,OAA3C,CACA,IAAI3C,EAAQ4C,EACZ,QAAWt8E,IAAR4lB,EAEF,IADA,IAAI22D,EAAUt/E,SAASu/E,qBAAqB,UACpC5jF,EAAI,EAAGA,EAAI2jF,EAAQ9jF,OAAQG,IAAK,CACvC,IAAIiC,EAAI0hF,EAAQ3jF,GAChB,GAAGiC,EAAEmtB,aAAa,QAAU7tB,GAAOU,EAAEmtB,aAAa,iBAAmB50B,EAAoBwyB,EAAK,CAAE8zD,EAAS7+E,EAAG,OAG1G6+E,IACH4C,GAAa,GACb5C,EAASz8E,SAASiH,cAAc,WAEzBu4E,QAAU,QACjB/C,EAAOt/D,QAAU,IACbygE,EAAoB6B,IACvBhD,EAAO7zD,aAAa,QAASg1D,EAAoB6B,IAElDhD,EAAO7zD,aAAa,eAAgBzyB,EAAoBwyB,GACxD8zD,EAAO50E,IAAM3K,GAEdhH,EAAWgH,GAAO,CAACkiF,GACnB,IAAIM,EAAmB,CAAChgE,EAAMzO,KAE7BwrE,EAAO/kB,QAAU+kB,EAAOhlB,OAAS,KACjCj6C,aAAaL,GACb,IAAIwiE,EAAUzpF,EAAWgH,GAIzB,UAHOhH,EAAWgH,GAClBu/E,EAAOz3D,YAAcy3D,EAAOz3D,WAAWyC,YAAYg1D,GACnDkD,GAAWA,EAAQ96E,SAASkwE,GAAQA,EAAG9jE,KACpCyO,EAAM,OAAOA,EAAKzO,IAGlBkM,EAAU9kB,WAAWqnF,EAAiBE,KAAK,UAAM78E,EAAW,CAAE3L,KAAM,UAAWkI,OAAQm9E,IAAW,MACtGA,EAAO/kB,QAAUgoB,EAAiBE,KAAK,KAAMnD,EAAO/kB,SACpD+kB,EAAOhlB,OAASioB,EAAiBE,KAAK,KAAMnD,EAAOhlB,QACnD4nB,GAAcr/E,SAAS6/E,KAAKr4D,YAAYi1D,KmIvCzCmB,EAAoB3D,EAAK8D,IACH,oBAAX5yD,QAA0BA,OAAO20D,aAC1CzmF,OAAOulF,eAAeb,EAAS5yD,OAAO20D,YAAa,CAAEhjF,MAAO,WAE7DzD,OAAOulF,eAAeb,EAAS,aAAc,CAAEjhF,OAAO,K,MCLvD,IAAIijF,EACAnC,EAAoB1D,EAAE8F,gBAAeD,EAAYnC,EAAoB1D,EAAE//E,SAAW,IACtF,IAAI6F,EAAW49E,EAAoB1D,EAAEl6E,SACrC,IAAK+/E,GAAa//E,IACbA,EAASigF,gBACZF,EAAY//E,EAASigF,cAAcp4E,MAC/Bk4E,GAAW,CACf,IAAIT,EAAUt/E,EAASu/E,qBAAqB,UACzCD,EAAQ9jF,SAAQukF,EAAYT,EAAQA,EAAQ9jF,OAAS,GAAGqM,KAK7D,IAAKk4E,EAAW,MAAM,IAAIhoF,MAAM,yDAChCgoF,EAAYA,EAAUtiF,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpFmgF,EAAoB/4D,EAAIk7D,G,GnI0BpB3pF,EAAkB0oF,GACd,IAAI1lF,SAAQ,CAACzB,EAASD,KAC5B,IAAIyF,EAAOygF,EAAoBqB,SAASH,GACpCoB,EAAWtC,EAAoB/4D,EAAI1nB,EACvC,GAlBmB,EAACA,EAAM+iF,KAE3B,IADA,IAAIC,EAAmBngF,SAASu/E,qBAAqB,QAC7C5jF,EAAI,EAAGA,EAAIwkF,EAAiB3kF,OAAQG,IAAK,CAChD,IACIykF,GADA33D,EAAM03D,EAAiBxkF,IACRovB,aAAa,cAAgBtC,EAAIsC,aAAa,QACjE,GAAe,eAAZtC,EAAIlpB,MAAyB6gF,IAAajjF,GAAQijF,IAAaF,GAAW,OAAOz3D,EAErF,IAAI43D,EAAoBrgF,SAASu/E,qBAAqB,SACtD,IAAQ5jF,EAAI,EAAGA,EAAI0kF,EAAkB7kF,OAAQG,IAAK,CACjD,IAAI8sB,EAEJ,IADI23D,GADA33D,EAAM43D,EAAkB1kF,IACTovB,aAAa,gBAChB5tB,GAAQijF,IAAaF,EAAU,OAAOz3D,IAOnD63D,CAAenjF,EAAM+iF,GAAW,OAAOvoF,IA7CrB,EAACmnF,EAASoB,EAAUvoF,EAASD,KACnD,IAAI6oF,EAAUvgF,SAASiH,cAAc,QAErCs5E,EAAQhhF,IAAM,aACdghF,EAAQnpF,KAAO,WAiBfmpF,EAAQ7oB,QAAU6oB,EAAQ9oB,OAhBJxmD,IAGrB,GADAsvE,EAAQ7oB,QAAU6oB,EAAQ9oB,OAAS,KAChB,SAAfxmD,EAAM7Z,KACTO,QACM,CACN,IAAI6oF,EAAYvvE,IAAyB,SAAfA,EAAM7Z,KAAkB,UAAY6Z,EAAM7Z,MAChEqpF,EAAWxvE,GAASA,EAAM3R,QAAU2R,EAAM3R,OAAOnC,MAAQ+iF,EACzDrnF,EAAM,IAAId,MAAM,qBAAuB+mF,EAAU,cAAgB2B,EAAW,KAChF5nF,EAAIsK,KAAO,wBACXtK,EAAIzB,KAAOopF,EACX3nF,EAAIk2D,QAAU0xB,EACdF,EAAQv7D,WAAWyC,YAAY84D,GAC/B7oF,EAAOmB,KAIT0nF,EAAQpjF,KAAO+iF,EAEflgF,SAAS6/E,KAAKr4D,YAAY+4D,IAsBzBG,CAAiB5B,EAASoB,EAAUvoF,EAASD,MAI3CrB,EAAqB,CACxB,IAAK,GAGNunF,EAAoB/vB,EAAE8yB,QAAU,CAAC7B,EAASC,KAEtC1oF,EAAmByoF,GAAUC,EAASviF,KAAKnG,EAAmByoF,IACzB,IAAhCzoF,EAAmByoF,IAFX,CAAC,GAAK,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,GAEPA,IACtDC,EAASviF,KAAKnG,EAAmByoF,GAAW1oF,EAAe0oF,GAAS5kF,MAAK,KACxE7D,EAAmByoF,GAAW,KAC3BngF,IAEH,aADOtI,EAAmByoF,GACpBngF,O,MoI9DTi/E,EAAoB3oC,EAAIj1C,SAAS4gF,SAAWnyB,KAAKt0D,SAASgD,KAK1D,IAAI0jF,EAAkB,CACrB,IAAK,GAGNjD,EAAoB/vB,EAAE/xD,EAAI,CAACgjF,EAASC,KAElC,IAAI+B,EAAqBlD,EAAoBe,EAAEkC,EAAiB/B,GAAW+B,EAAgB/B,QAAW/7E,EACtG,GAA0B,IAAvB+9E,EAGF,GAAGA,EACF/B,EAASviF,KAAKskF,EAAmB,QAC3B,CAGL,IAAInoF,EAAU,IAAIS,SAAQ,CAACzB,EAASD,IAAYopF,EAAqBD,EAAgB/B,GAAW,CAACnnF,EAASD,KAC1GqnF,EAASviF,KAAKskF,EAAmB,GAAKnoF,GAGtC,IAAIuE,EAAM0gF,EAAoB/4D,EAAI+4D,EAAoBoB,EAAEF,GAEpDrnF,EAAQ,IAAIM,MAgBhB6lF,EAAoB19D,EAAEhjB,GAfF+T,IACnB,GAAG2sE,EAAoBe,EAAEkC,EAAiB/B,KAEf,KAD1BgC,EAAqBD,EAAgB/B,MACR+B,EAAgB/B,QAAW/7E,GACrD+9E,GAAoB,CACtB,IAAIN,EAAYvvE,IAAyB,SAAfA,EAAM7Z,KAAkB,UAAY6Z,EAAM7Z,MAChE2pF,EAAU9vE,GAASA,EAAM3R,QAAU2R,EAAM3R,OAAOuI,IACpDpQ,EAAMO,QAAU,iBAAmB8mF,EAAU,cAAgB0B,EAAY,KAAOO,EAAU,IAC1FtpF,EAAMmB,KAAO,iBACbnB,EAAML,KAAOopF,EACb/oF,EAAMs3D,QAAUgyB,EAChBD,EAAmB,GAAGrpF,MAIgB,SAAWqnF,EAASA,KAiBlE,IAAIkC,EAAuB,CAACC,EAA4B9pF,KACvD,IAGI0mF,EAAUiB,GAHToC,EAAUC,EAAaC,GAAWjqF,EAGhBwE,EAAI,EAC3B,GAAGulF,EAASv7E,MAAMzE,GAAgC,IAAxB2/E,EAAgB3/E,KAAa,CACtD,IAAI28E,KAAYsD,EACZvD,EAAoBe,EAAEwC,EAAatD,KACrCD,EAAoBK,EAAEJ,GAAYsD,EAAYtD,IAG7CuD,GAAsBA,EAAQxD,GAGlC,IADGqD,GAA4BA,EAA2B9pF,GACrDwE,EAAIulF,EAAS1lF,OAAQG,IACzBmjF,EAAUoC,EAASvlF,GAChBiiF,EAAoBe,EAAEkC,EAAiB/B,IAAY+B,EAAgB/B,IACrE+B,EAAgB/B,GAAS,KAE1B+B,EAAgB/B,GAAW,GAKzBuC,EAAqB5yB,KAA6B,uBAAIA,KAA6B,wBAAK,GAC5F4yB,EAAmBx8E,QAAQm8E,EAAqBpB,KAAK,KAAM,IAC3DyB,EAAmB7kF,KAAOwkF,EAAqBpB,KAAK,KAAMyB,EAAmB7kF,KAAKojF,KAAKyB,K,6DC3EvF,SAASC,EAAoB3iF,GAC3B,MAAMyD,EAAuBzD,EAAExH,KAK/B,GAJI8e,EAAAA,IAEFnf,QAAQC,IAAI,2BAA4BqL,IAErCA,EAAOhL,KAAM,OAClB,MAAMk5E,GAAWhyE,EAAAA,EAAAA,MACjB,OAAQ8D,EAAOhL,MACb,IAAK,eACCk5E,EAASlvE,cACXkvE,EAASlvE,aAAagB,EAAOjJ,SAE/B,MACF,IAAK,yBACHg3E,EAAAA,EAAAA,IAAyB/tE,EAAOjJ,QAAQ+H,KAK9C,SAASjJ,IACP05B,UAAU+8C,cAAc5wD,oBAAoB,UAAWwjE,GACvD3vD,UAAU+8C,cAAcx3E,iBAAiB,UAAWoqF,IAEpDxO,EAAAA,EAAAA,MAGEta,EAAAA,KACFrgE,OAAOjB,iBAAiB,QAAQ6C,UAC9B,IACE,IAAK43B,UAAU+8C,cAAcE,WAAY,CACvC,MAAM2S,QAAsB5vD,UAAU+8C,cAAc8S,mBAChDD,EAAc/lF,SACZ3E,EAAAA,IAEFC,QAAQC,IAAI,+DAERqC,QAAQ0+B,IAAIypD,EAAcj+E,KAAI22E,GAAKA,EAAEwH,uBAIzC9vD,UAAU+8C,cAAcgT,SAAS,IAAIzqF,IAAI,mBAE3CJ,EAAAA,IAEFC,QAAQC,IAAI,uCAGR46B,UAAU+8C,cAAc+B,MAE1B9+C,UAAU+8C,cAAcE,YACtB/3E,EAAAA,IAEFC,QAAQC,IAAI,4BAEdkB,MAEIpB,EAAAA,IAEFC,QAAQW,MAAM,oCAGX8W,EAAAA,IAAWsuB,EAAAA,KACdv+B,EAAAA,EAAAA,MAAcm9B,WAAW,CAAEtkC,KAAM,CAAEa,QAAS,0BAA2B2pF,aAAa,MAGxF,MAAO9oF,GACHhC,EAAAA,IAEFC,QAAQW,MAAM,2CAA4CoB,OAIhEV,OAAOjB,iBAAiB,SAAS6C,gBACzB43B,UAAU+8C,cAAc+B,MAC9Bx4E,Q,cC1EG,MAAM2pF,EAA6B,CACxCC,mBAAmB,EACnB13B,iBAAiB,EACjBF,uB,QAAwBC,GAAAA,OACxBltB,aAAc,EACdpG,iBAAkB,EAElB0D,gBAAgB,EAChBxB,YAAa,CACXgpD,WAAY,GACZC,QAAS,IAGX7rD,QAAS,CACPC,IAAK,GACLE,WAAY,GAGdtC,MAAO,CACLC,KAAM,GACNwe,aAAc,IAGhBte,MAAO,CACLgZ,QAAS,GACT2B,cAAe,GACfF,iBAAkB,GAClBtY,WAAY,GACZrC,KAAM,IAGRgV,SAAU,CACR0L,SAAU,GACVyC,aAAc,GACd+D,kBAAmB,IAGrB8mC,WAAY,CACVhuD,KAAM,IAGR2mB,kBAAmB,CACjBjG,SAAU,IAGZmJ,YAAa,CACX7pB,KAAM,GACNiuD,iBAAkB,GAGpBz9B,YAAa,CACXC,iBAAkB,IAGpBy9B,aAAc,CAAC,WAAY,gBAAiB,iBAAkB,QAAS,UAEvE1yC,SAAU,CACRC,SAAU,GACVM,MAAO,GACPoyC,OAAQ,CACN3yC,SAAU,IAEZqP,SAAU,CACRrP,SAAU,IAEZ4yC,SAAU,CACR5yC,SAAU,IAEZ6yC,SAAU,CACR3yC,OAAQ,IAEVvxB,OAAQ,GACR8yB,SAAU,IAGZqxC,cAAe,GAEfjyC,KAAM,CACJkyC,MAAO,GACPpkE,OAAQ,IAGVqkE,WAAY,CACV9yE,WAAW,EACX+yE,WAAY,IAGd5vC,aAAc,GAEdZ,WAAY,GAEZiC,gBAAiB,CACfC,gBAAiB,IAGnBM,iBAAkB,CAChBC,SAAU,IAGZS,WAAY,CACVT,SAAU,IAGZguC,SAAU,GAEVC,cAAe,GAEfn5B,YAAa,GAEbo5B,YAAa,CACXroB,OAAQtiD,EAAAA,GACR4qE,aAAc3qE,EAAAA,GACdwoB,SAAS,GAGX6kB,gBAAiB,GAEjBoE,YAAa,GAEb7T,QAAS,GAETgtC,cAAe,GAEfC,QAAS,GAETtsD,eAAgB,GAEhBnB,SAAU,CACR+B,MAAO,CACLkF,MAAO,QACP8tB,sBAAsB,EACtB/tB,gBAAiB/tB,EAAAA,GACbgK,EAAAA,GACCukB,EAAAA,GAAYtkB,EAAAA,GAAqCF,EAAAA,GACtD0jB,eAAgB3jB,EAAAA,GAChB2qE,oBAAqB,QACrBr8B,8BAA8B,EAC9BC,gCAAgC,EAChCC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,8BAA8B,EAC9BC,gCAAgC,EAChCC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,+BAA+B,EAC/BC,yBAAyB,EACzBC,2BAA2B,EAC3B27B,sBAAuB,GACvB7rD,qBAAqB,EACrBD,sBAAsB,EACtB44C,wBAAyB,EACzB/nB,iBAAiB,EACjBD,mBAAmB,EACnBm7B,uBAAuB,EACvB/6B,oBAAoB,EACpBtvB,SAAU,KACVE,WAAY,MACZG,0BAA0B,EAC1BiqD,6BAA6B,GAE/B7tC,OAAQ,CACN8tC,MAAO,CACLC,WAAW,EACXC,aAAcnnE,EAAAA,GAEhBonE,KAAM,CACJF,WAAW,EACXC,aAAcpnE,EAAAA,KAGlB6b,QAAS,GACT0I,iBAAkB,IAGpBkV,cAAe,GACf6tC,gBAAiB,GAEjBC,2BAA2B,EAE3Bp/B,gBAAiB,CACf3P,SAAU,IAGZsQ,qBAAsB,I,6FChKxB,MAEM0+B,GAAuB5nB,EAAAA,EAAAA,KAAS,KAAMC,EAAAA,EAAAA,IAAO4nB,IAF3B,KAE0D,GAElF,IACIC,EADAC,GAAY,EA2ChB,SAASC,IACPD,GAAY,EACZD,GAA8BxN,EAAAA,EAAAA,IAAeuN,GAAa,GAC1DxrF,OAAOjB,iBAAiB,OAAQysF,IAChC1yD,EAAAA,EAAAA,IAAYyyD,GAGd,SAASK,IACPF,GAAY,GACZ3yD,EAAAA,EAAAA,IAAewyD,GACfvrF,OAAO2lB,oBAAoB,OAAQ6lE,GAC/BC,GACFA,IAyHJ,SAASD,IACP,IAAKE,IAAaxmE,EAAAA,EAAAA,MAChB,OAGF,MAAMzO,GAASiiB,EAAAA,EAAAA,MAEf,GAAIjiB,EAAO+qB,aACT,OAGF,MAAMqqD,EAA6B,IAC9BpC,MACAlvC,EAAAA,EAAAA,IAAK9jC,EAAQ,CACd,YACA,kBACA,iBACA,qBACA,gBACA,cACA,WACA,gBACA,eACA,OACA,4BACA,kBACA,yBAEFg0E,YAAa,CACXroB,OAAQ3rD,EAAOg0E,YAAYroB,OAC3BsoB,aAAcj0E,EAAOg0E,YAAYC,aACjCniD,QAAS9xB,EAAOg0E,YAAYliD,SAE9BypB,gBAAiB85B,EAAmBr1E,GACpCmlB,MAAOmwD,EAAYt1E,GACnBslB,MAAOiwD,EAAYv1E,GACnBo6B,SAAUo7C,EAAex1E,GACzBikC,aAAc,CACZwxC,qBAAsBz1E,EAAOikC,aAAawxC,sBAE5C/uD,SAAUgvD,EAAe11E,GACzBivC,YAAa0mC,EAAkB31E,GAC/BozE,WAAYwC,EAAiB51E,GAC7Bi6C,mBAAoB47B,EAAyB71E,IAGzC6gD,EAAOz0B,KAAKG,UAAU6oD,GAC5BnpD,aAAaK,QAAQ3kB,EAAAA,GAAwBk5C,GAG/C,SAASw0B,EAAmBr1E,GAC1B,OAAOzW,OAAO2oB,WAAahI,EAAAA,IACvBlK,EAAOu7C,gBAIb,SAAS+5B,EAAYt1E,GAA2C,cAC9D,MAAQmlB,OAAO,KAAEC,EAAF,aAAQwe,GAAjB,cAAiC3f,GAAkBjkB,GACjDtN,OAAQojF,IAAkBnrC,EAAAA,EAAAA,IAAyB3qC,IAAW,GAChE+1E,EAAc,WAAG17B,EAAAA,EAAAA,IAAmBr6C,UAAtB,aAAG,EAA4BtL,KAAI,QAAC,GAAEpC,GAAH,SAAYA,KAE7D0jF,GAAY5zC,EAAAA,EAAAA,IAAO,IACpBne,EAAgB,CAACA,GAAiB,MAClC6xD,IAAiBpwD,EAAAA,EAAAA,IAASowD,GAAiB,CAACA,GAAiB,MAC7DC,GAAkB,MAClB/1E,EAAO8zE,SAASp2C,SAAW,OAC3B,WAAA4vB,EAAAA,EAAAA,IAAc7gD,EAAAA,WAAd,eAA8B7X,OAAO8wB,EAAAA,MAAa,OAClD,WAAA4nC,EAAAA,EAAAA,IAAc5gD,EAAAA,WAAd,eAAmC9X,OAAO8wB,EAAAA,MAAa,OACvD,UAAA1lB,EAAO2iC,mBAAP,eAAoBjF,UAAW,OAC/B,UAAA19B,EAAOikC,aAAawxC,4BAApB,eAA0C7gF,OAAO8wB,EAAAA,MAAa,MAC9Dj7B,OAAO6rB,KAAK8O,KACdn2B,MAAM,EAAG2Y,EAAAA,IAEZ,MAAO,CACLwd,MAAM0e,EAAAA,EAAAA,IAAK1e,EAAM4wD,GACjBpyC,cAAcE,EAAAA,EAAAA,IAAKF,EAAcoyC,IAIrC,SAAST,EAAYv1E,GACnB,MAAQslB,OAAO,KAAEF,GAAX,cAAmBnB,GAAkBjkB,EACrCi2E,GAAcplC,EAAAA,EAAAA,IAAkB7wC,GAChCg2E,GAAY5zC,EAAAA,EAAAA,IAAO,IACpBne,EAAgB,CAACA,GAAiB,MAClCgyD,EAAc,CAACA,EAAY3jF,IAAM,OACjCg7D,EAAAA,EAAAA,IAAc7gD,EAAAA,KAAkB,OAChC6gD,EAAAA,EAAAA,IAAc5gD,EAAAA,KAAuB,MACrC1M,EAAOikC,aAAawxC,sBAAwB,MAC5ChrF,OAAO6rB,KAAK8O,KACdn2B,MAAM,EAAG4Y,EAAAA,IAEZ,MAAO,IACF7H,EAAOslB,MACV2a,cAAe,GACf7a,MAAM0e,EAAAA,EAAAA,IAAK9jC,EAAOslB,MAAMF,KAAM4wD,IAIlC,SAASR,EAAex1E,GAA8C,MACpE,MAAM,cAAEikB,GAAkBjkB,EACpB8lC,EAAgD,IAC9CpzC,OAAQojF,IAAkBnrC,EAAAA,EAAAA,IAAyB3qC,IAAW,GA0BtE,MAzBsB,IACjB81E,EAAgB,CAACA,GAAiB,MAClC7xD,EAAgB,CAACA,GAAiB,OAClC,WAAAqpC,EAAAA,EAAAA,IAAc7gD,EAAAA,WAAd,eAA8Bxd,MAAM,EAAG6Y,EAAAA,MAAiD,IAG/E7R,SAASvD,IACrB,MAAM4I,EAAU0E,EAAOo6B,SAAS0L,SAASpzC,GACzC,IAAK4I,EACH,OAGF,MAAM46E,EAAa56E,EAAQqtC,YAAYh9C,EAAAA,IAClCuqF,GAAeA,EAAW9rC,cAI/BtE,EAASpzC,GAAU,CACjB0yB,MAAM0e,EAAAA,EAAAA,IAAKxoC,EAAQ8pB,KAAM8wD,EAAW9rC,aACpCzB,YAAa,CACX,CAACh9C,EAAAA,IAAiBuqF,QAKjB,CACLpwC,SAAAA,EACAyC,aAAc,GACd+D,kBAAmB,IAIvB,SAASopC,EAAe11E,GACtB,MAAM,MAAEyoB,EAAF,OAASie,GAAW1mC,EAAO0mB,SAEjC,MAAO,CACL+B,MAAAA,EACAie,OAAAA,EACAvd,QAAS,GACT0I,iBAAkB,IAItB,SAAS8jD,EAAkB31E,GACzB,MAAO,IACFA,EAAOivC,YACVokC,iBAAkB,GAItB,SAASuC,EAAiB51E,GACxB,MAAO,IACFA,EAAOozE,WACVhuD,KAAM,GACN+wD,uBAAmBhiF,EACnBiiF,4BAAwBjiF,EACxBkiF,2BAAuBliF,GAI3B,SAAS0hF,EAAyB71E,GAAwD,MACxF,iBAAOA,EAAOi6C,0BAAd,aAAO,EACHvlD,KAAK22E,IAAMvnC,EAAAA,EAAAA,IAAKunC,EAAG,CAAC,WAAY,aAAc,QAAS,iBAhVvD3jE,EAAAA,MAIJwa,EAAAA,EAAAA,IAAW,eAAe,KACpB+yD,GAIJC,QAGFhzD,EAAAA,EAAAA,IAAW,SAAS,KAClB+J,aAAa69C,WAAWniE,EAAAA,IAEnBstE,GAILE,SCtDJjzD,EAAAA,EAAAA,IAAW,QAAQ,KACjB,MAAMlU,GAAU8rD,EAAAA,EAAAA,IAAUkZ,GAC1B,ODwDK,SAAmBsD,GACxB,IAAI5uE,EAAAA,GAIJ,OAAI+hE,EAAAA,EAAAA,KAAiB,IACnByL,IA0BJ,SAAmBoB,GACbruF,EAAAA,IAEFC,QAAQquF,KAAK,2BAGf,MAAM11B,EAAO50B,aAAaC,QAAQvkB,EAAAA,IAC5B+zD,EAAS7a,EAAOz0B,KAAKC,MAAMw0B,QAAuB1sD,EAEpDlM,EAAAA,IAEFC,QAAQsuF,QAAQ,2BAGd9a,GAoBN,SAAsBA,EAAqB4a,GAEzC,GAAI,wCAAyC5a,EAAOh1C,SAAS+B,MAAO,CAClE,MAAM,oCACJguD,EADI,sCAEJC,EAFI,gCAGJC,EAHI,kCAIJC,EAJI,qBAKJC,EALI,mBAMJC,KACGpqB,GACDgP,EAAOh1C,SAAS+B,MAEpBizC,EAAOh1C,SAAS+B,MAAQ,IACnBikC,EACH3U,6BAA8B0+B,EAC9Bt+B,6BAA8Bs+B,EAC9Bz+B,+BAAgC0+B,EAChCt+B,+BAAgCs+B,EAChCz+B,yBAA0B0+B,EAC1Bt+B,yBAA0Bs+B,EAC1Bz+B,2BAA4B0+B,EAC5Bt+B,2BAA4Bs+B,EAC5Bz9B,kBAAmB09B,EACnBz9B,gBAAiB09B,GAKrBpb,EAAOh1C,SAAS+B,MAAQ,IACnB6tD,EAAa5vD,SAAS+B,SACtBizC,EAAOh1C,SAAS+B,OAGrBizC,EAAOh1C,SAASggB,OAAS,IACpB4vC,EAAa5vD,SAASggB,UACtBg1B,EAAOh1C,SAASggB,QAGrBg1B,EAAOzsB,YAAc,IAChBqnC,EAAarnC,eACbysB,EAAOzsB,aAGPysB,EAAO96B,SAAS4yC,WACnB9X,EAAO96B,SAAS4yC,SAAW8C,EAAa11C,SAAS4yC,UAG9C9X,EAAOjmB,kBACVimB,EAAOjmB,gBAAkB,CACvB3P,SAAU,KAIT41B,EAAOtlB,uBACVslB,EAAOtlB,qBAAuB,SAGEjiD,IAA9BunE,EAAOsY,YAAYroB,SACrB+P,EAAOsY,YAAYroB,OAAStiD,EAAAA,SAGUlV,IAApCunE,EAAOsY,YAAYC,eACrBvY,EAAOsY,YAAYC,aAAe3qE,EAAAA,IAG/BoyD,EAAO0X,aACV1X,EAAO0X,WAAakD,EAAalD,YAG9B1X,EAAOv2C,MAAMye,eAChB83B,EAAOv2C,MAAMye,aAAe,IAGzB83B,EAAOthC,SAASkS,oBACnBovB,EAAOthC,SAASkS,kBAAoB,IAGjCovB,EAAOkZ,kBACVlZ,EAAOkZ,gBAAkB,IAlGzBmC,CAAarb,EAAQ4a,GAGvB,MAAM/yC,EAAW,IACZ+yC,KACA5a,GAGCsb,EAAqB97B,EAAAA,QAAgD/mD,GAAtB8xE,EAAAA,EAAAA,KAErD,MAAO,IACF1iC,EACHnJ,SAAU,IACLmJ,EAASnJ,SACZmO,aAAcyuC,EAAoB,CAACA,GAAqB,KArDnDC,CAAUX,SAEjBnB,IClEK+B,CAAUlpE,IAAYA,K,wBCV/B,MAAMmpE,EAAc,gBAGdC,EAASrpF,OAAO9C,KAAKC,MAAQkB,KAAKgrC,UAIxC,IAAInuC,EAFJgjC,aAAaK,QAAQ6qD,EAAaC,GAIlC,MAAM7Q,EAAWh9E,OAAOm9E,aAAY,KAC9Bz9E,GAAYgjC,aAAaC,QAAQirD,KAAiBC,IACpDnuF,IACA09E,cAAcJ,MAXD,K,+FCDjB,MAAM8Q,EAAa,CAAC,iBAAkB,kBAEvB,SAASC,IACtB,GAAI,UAAWlmF,SACb,OAAO5G,QAAQ0+B,IAAImuD,EAAW3iF,KAAK6iF,GAASnmF,SAASomF,MAAMC,KAAKF,M,+DCqCpE,SAASG,IACP,MAAM,QAAEp5C,EAAF,KAAWlZ,IAASnD,EAAAA,EAAAA,MAAYqD,MACtC,GAAKgZ,EAAQsQ,OAIb,OAAOpkD,QAAQ0+B,IAAIoV,EAAQsQ,OAAO3/C,MAAM,EARf,IAQsCyF,KAAKhC,IAClE,MAAM+C,EAAO2vB,EAAK1yB,GAClB,IAAK+C,EACH,OAGF,MAAMk6B,GAAaF,EAAAA,EAAAA,IAAkBh6B,GACrC,OAAKk6B,EAIE+zC,EAAAA,GAAkB/zC,EAAYlkC,EAAAA,GAAAA,cAJrC,MAQJ,MAAMksF,EAAe,CACnBC,KAAM,IAAMptF,QAAQ0+B,IAAI,EACtB3V,EAAAA,EAAAA,IAAW0sD,EAAAA,GAAAA,KAAc,QACtB30E,KAAKgsF,GACRI,KACAlsB,EAAAA,EAAAA,IAAaqsB,KAEfvpD,gBAAiB,IAAM9jC,QAAQ0+B,IAAI,CACjCouD,KACA9rB,EAAAA,EAAAA,IAAassB,KAEfC,SAAU,KAAMvsB,EAAAA,EAAAA,IAAawsB,GAC7BC,aAAc,KAAMzsB,EAAAA,EAAAA,IAAawsB,GACjC5sD,WAAYksD,GAmFd,GAAev3E,EAAAA,EAAAA,KACZC,IACC,MAAM2tB,GAAQR,EAAAA,EAAAA,IAAYntB,IACpB,WAAEk4E,EAAF,gBAAc3zE,GAAoBvE,EAAO0mB,SAASggB,OAAO/Y,IAAU,GAEzE,MAAO,CACLY,4BAA6BvuB,EAAOuuB,4BACpCH,aAAcpuB,EAAOouB,aACrB+pD,oBAAqBvmF,QAAQsmF,GAC7BE,yBAA0BxmF,QAAQ2S,GAClC8zE,oBAAoB78B,EAAAA,EAAAA,IAAyBx7C,GAC7Cs4E,gBAAiBt4E,EAAOs4E,mBAX9B,EAhF4C,IAQtC,IARuC,KAC3C3a,EAD2C,SAE3CruE,EAF2C,oBAG3C6oF,EAH2C,yBAI3CC,EAJ2C,mBAK3CC,EAL2C,4BAM3C9pD,EAN2C,gBAO3C+pD,GACI,EACJ,MAAM,aAAEC,IAAiB7oF,EAAAA,EAAAA,OAElB8oF,EAASC,IAAav9E,EAAAA,EAAAA,MAE3BmZ,aAAcqkE,EADV,qBAC4B5zE,IAC9BC,EAAAA,EAAAA,IAAmByzE,OAASrkF,GAAW,GAoC3C,OAlCAyH,EAAAA,EAAAA,KAAU,KACR,IAAI2S,EAsBJ,OAZA/jB,QAAQY,KAAK,EACXC,EAAAA,EAAAA,IArEoB,KA4DFF,WAClB,UACQwsF,EAAaha,KACnB,MAAO1zE,MAOT0uF,KACCrtF,MAAK,KACNmtF,IACAF,EAAa,CAAEnqD,aAAc,IAE7B7f,EAAUhlB,OAAOE,YAAW,KAC1B8uF,EAAa,CAAEnqD,aAAc,MA3EV,QA+EhB,KACD7f,IACFK,aAAaL,GACbA,OAAUpa,GAGZokF,EAAa,CAAEnqD,aAAc,OAG9B,IAGD,0BAAK97B,GAAG,YACLhD,EACAopF,IAAqBnqD,GACpB,0BAAKl/B,WAAWmB,EAAAA,EAAAA,GAAe,OAAQsU,IAC3B,SAAT64D,EACC,sCACE,0BACEtuE,UAAU,OACVuS,MAAO02E,EAAmB,UAASA,WAAsBnkF,IAE3D,0BACE9E,WAAWmB,EAAAA,EAAAA,GACT,SACA2nF,GAAuB,kBACvBC,GAA4B,kBAC5BC,GAAsB,uBAGzBA,GAAsB,0BAAKhpF,UAAU,WAGxC,0BAAKA,UAAU,e,oCCnJ3B,MAYA,GAZsB,CAAC26B,EAA8BjQ,KACnD,MAAO6+D,EAAaC,IAAkBp3E,EAAAA,EAAAA,MAQtC,OANIuoB,GACFjX,GAAAA,GAC+BiX,EAAUjQ,GACtCzuB,KAAKutF,GAGHD,GCVF,SAASE,KACd,IAAIC,EAAoBh2D,UAAUkH,SAMlC,OAJI8uD,GAA2C,UAAtBA,IACvBA,EAAoBA,EAAkB37E,OAAO,EAAG,IAG3C27E,E,4HCuBT,MAAMC,GAAuB,IAAMvuE,EAAAA,GA4InC,IAAetb,EAAAA,EAAAA,KAAK4Q,EAAAA,EAAAA,KACjBC,IACC,MAAQkqB,aAAegpD,WAAYvO,IAAoB3kE,EACvD,MAAO,CACL2kE,cAAAA,KAJc5kE,EAzIgC,IAM9C,IAN+C,GACnDzN,EADmD,MAEnDpE,EAFmD,UAGnD4S,EAHmD,SAInDmB,EAJmD,cAKnD0iE,GACI,EACJ,MAAM1xE,GAAOkP,EAAAA,GAAAA,KAEP82E,GAAWn+E,EAAAA,EAAAA,IAAyB,OAEnClG,EAAQskF,IAAaz3E,EAAAA,EAAAA,OACrB03E,EAAcC,IAAmB33E,EAAAA,EAAAA,IAA2B,IAE7D43E,GAAevpF,EAAAA,EAAAA,KAAawpF,IAChCJ,EAAUI,GACVF,EA6GJ,SAAyBlvD,GAA8D,IAA/Bt1B,EAA+B,uDAAtB,GAC/D,IAAKA,EAAOhI,OACV,OAAOs9B,EAGT,MAAM8J,GAAcC,EAAAA,GAAAA,GAA4Br/B,GAEhD,OAAOs1B,EAAYt1B,QAAQgwE,GACzB5wC,EAAY4wC,EAAQ2U,cAAiB3U,EAAQ56E,MAAQgqC,EAAY4wC,EAAQ56E,QArHzDwvF,CAAgB7U,EAAe2U,MAC9C,CAAC3U,KAEJ7xD,EAAAA,GAAAA,IAAY,IAAyB,IAAvB2mE,GAAuB,EACD,KAA9BA,MAAAA,OAAA,EAAAA,EAAmB7sF,SAAgB+3E,EAAc/3E,OAAS,GAC5DysF,EAAazkF,KAEd,CAAC+vE,EAAe0U,IAEnB,MAAMj3E,GAAetS,EAAAA,EAAAA,KAAa80E,IAChC3iE,EAAS2iE,GAETn7E,YAAW,IAAM4vF,OAAallF,IAAY6kF,MACzC,CAAC/2E,EAAUo3E,IAERK,GAAc5pF,EAAAA,EAAAA,KAAaC,IAC/BspF,EAAatpF,EAAEsP,cAAcnR,SAC5B,CAACmrF,IAEEM,GAAqB7pF,EAAAA,EAAAA,KAAaC,IACtC,GAAkB,IAAdA,EAAEoT,QACJ,OAGF,MAAMzS,EAASX,EAAEsP,cACbnR,QAAoBiG,IAAXS,IACXlE,EAAOxC,MAAQ,IAGjBmrF,EAAa3oF,EAAOxC,SACnB,CAAC0G,EAAQykF,EAAcnrF,IAiD1B,OACE,mBAAC0rF,GAAA,EAAD,CACEvqF,UAAU,mBACViT,QAlD+D,IAA2B,IAA1B,UAAEkB,EAAF,OAAaT,GAAa,EAC5F,MAAM82E,EAAgB,KACpB,GAAI92E,EACF,OAGFtZ,YAAW,KACTwvF,EAAS39E,QAASw+E,WAzDH,IA4DjBt2E,IAEA,MAAMu2E,EAAS3oF,SAAS4oF,eAAe,0BACvCD,EAAOE,SAAS,CAAEC,IAAKH,EAAOI,aAAcC,SAAU,YAQlDC,EAAazlF,MAAAA,EAAAA,GAAW1G,MAAAA,OAAA,EAAAA,EAAOlE,QAAQkE,MAAAA,OAAf,EAAeA,EAAOqrF,cAAe,GAEnE,OACE,0BAAKlqF,WAAWmB,EAAAA,EAAAA,GAAe,cAAetC,GAAS,YACrD,4BACE4N,IAAKm9E,EACL5pF,WAAWmB,EAAAA,EAAAA,GAAe,eAAgBuS,GAAU,SACpDva,KAAK,OACL8J,GAAIA,EACJpE,MAAOmsF,EACPv2E,aAAa,MACblT,QAASipF,EACTr5E,QAASq5E,EACT51E,QAlBmBlU,IACvB2pF,EAAY3pF,GACZ8pF,KAiBI52E,UAAW02E,IAEb,gCAAQ1mF,EAAK,8BACZ6N,EACC,mBAACw5E,GAAA,EAAD,CAAS75E,MAAM,UAEf,wBAAG7P,QAASipF,EAAexqF,WAAWmB,EAAAA,EAAAA,GAAe,gBAAiBuS,GAAU,aAWnFo2E,EACEzkF,KAAKkwE,GACJ,mBAAC2V,GAAA,EAAD,CACExgE,IAAK6qD,EAAQC,KACbx1E,UAAWnB,GAAS02E,EAAQC,OAAS32E,EAAM22E,KAAO,WAAa,GAC/Dj0E,QAAS,IAAMwR,EAAawiE,IAE5B,2BAAMv1E,UAAU,iBAAgBmG,EAAAA,GAAAA,IAAW6yD,EAAAA,GAAAA,IAAWuc,EAAQC,MAAO,CAAC,cACtE,2BAAMx1E,UAAU,gBAAgBu1E,EAAQ56E,MAAQ46E,EAAQ2U,aACxD,2BAAMlqF,UAAU,gBAAgBu1E,EAAQI,iBAG5CmU,EAAavsF,QACb,mBAAC2tF,GAAA,EAAD,CACExgE,IAAI,aACJ1qB,UAAU,aACV4R,UAAQ,GAER,+BAAOhO,EAAK,2BC/GtB,IAAIunF,IAAqB,EAEzB,MAoNA,IAAerrF,EAAAA,EAAAA,KAAK4Q,EAAAA,EAAAA,KACjBC,IACC,MACE0mB,UAAY+B,OAAO,SAAEwB,IACrBC,aAAegpD,WAAYvO,IACzB3kE,EAEJ,MAAO,KACF8jC,EAAAA,EAAAA,IAAK9jC,EAAQ,CACd,kBACA,YACA,kBACA,gBACA,sBACA,YACA,iBACA,uBAEFiqB,SAAAA,EACA06C,cAAAA,KAnBc5kE,EApNoB,IAWlC,IAXmC,gBACvC4kB,EADuC,UAEvCkG,EAFuC,gBAGvCyD,EAHuC,cAIvC7K,EAJuC,oBAKvCM,EALuC,UAMvCL,EANuC,eAOvCgI,EAPuC,mBAQvC9G,EARuC,cASvC+/C,EATuC,SAUvC16C,GACI,EACJ,MAAM,mBACJwwD,EADI,kBAEJC,EAFI,mBAGJC,EAHI,gBAIJC,EAJI,eAKJC,EALI,eAMJC,EANI,iBAOJ1wD,IACE16B,EAAAA,EAAAA,MAEEuD,GAAOkP,EAAAA,GAAAA,KAEP82E,GAAWn+E,EAAAA,EAAAA,IAAyB,MACpCi+E,EAAoBD,KAEpBiC,EAAeC,GAAcjC,EAAmB,2BAC/CnU,EAASqW,IAAcx5E,EAAAA,EAAAA,OACvB+hB,EAAa03D,IAAkBz5E,EAAAA,EAAAA,OAC/B05E,EAAWC,IAAgB35E,EAAAA,EAAAA,KAAS,IACpC45E,EAAeC,IAAoB75E,EAAAA,EAAAA,OACnCX,EAAWy6E,EAAeC,IAAmBtgF,EAAAA,EAAAA,KAE9CugF,EAAa7W,EAAW,IAAGA,EAAQI,eAAexhD,GAAe,KAAOA,EACxEk4D,EAAYD,GAAcA,EAAW5sF,QAAQ,UAAW,IAAIjC,QAvC1C,GAyCxBgP,EAAAA,EAAAA,KAAU,KACHkyB,EAAAA,IACHmrD,EAAS39E,QAASiI,UAEnB,CAACqhE,KAEJhpE,EAAAA,EAAAA,KAAU,KACgB,yBAApB+oB,GAA+CC,GACjD+1D,MAED,CAACh2D,EAAiBC,EAAoB+1D,KAEzC/+E,EAAAA,EAAAA,KAAU,KACgB,yBAApB+oB,GACFi2D,EAAgB,CAAE5wD,SAAUC,MAE7B,CAACtF,EAAiBsF,EAAU2wD,KAE/Bh/E,EAAAA,EAAAA,KAAU,KACJgpB,GAAsB+/C,IAAkBC,IAAYuW,GACtDF,GAAWvW,EAAAA,GAAAA,IAAqBC,EAAe//C,GAAoB,MAEpE,CAACggD,EAAShgD,EAAoBu2D,EAAWxW,IAE5C,MAAMgX,GAAkB7rF,EAAAA,EAAAA,KAAa8rF,IAC9BA,EAAchvF,QACjBsuF,EAAe,IAGjB,MAAMW,EAAmBlX,IAAiBG,EAAAA,GAAAA,IAA0BH,EAAeiX,GAG7EE,GAAmBlX,GACrBiX,GAAoBA,EAAiBhX,OAASD,EAAQC,OACrDgX,GAAoBD,EAAchvF,OACnCivF,EACAjX,IAECA,IAAYkX,GAAoBA,GAAmBA,EAAgBjX,OAASD,EAAQC,OACvFoW,EAAWa,GAEbZ,GAAe7V,EAAAA,GAAAA,IAAkBuW,EAAeE,MAC/C,CAACnX,EAAeC,IAEbmX,GAAmBjsF,EAAAA,EAAAA,KAAY,KACnCyrF,KAEK7wD,EAAAA,GAAAA,IAAYquD,GAAmB,KAClCyC,IAEApxD,EAAiB,CAAEH,SAAU8uD,SAE9B,CAACwC,EAAenxD,EAAkB2uD,EAAmByC,KAExD5/E,EAAAA,EAAAA,KAAU,UACYzH,IAAhBqvB,GAA6B8K,GAC/BqtD,EAAgBrtD,KAEjB,CAACA,EAAiB9K,EAAam4D,KAElC37D,EAAAA,EAAAA,KAAgB,KACVi5D,EAAS39E,SAAW+/E,GACtBpC,EAAS39E,QAAQ0gF,qBAAqBX,KAEvC,CAACA,IAEJ,MAAMY,GAAkBnhF,EAAAA,EAAAA,KAAO,GACzBohF,GAAcpsF,EAAAA,EAAAA,KAAY,KAC9BmsF,EAAgB3gF,SAAU,EAC1ByL,uBAAsB,KACpBk1E,EAAgB3gF,SAAU,OAE3B,IAEG6gF,GAAsBrsF,EAAAA,EAAAA,KAAa5B,IACvC+sF,EAAW/sF,GACXgtF,EAAe,MACd,IAEGkB,GAA0BtsF,EAAAA,EAAAA,KAAaC,IACvC2zB,GACFm3D,IAIGL,KACHA,IAAqB,EACrBlD,KACK9rB,EAAAA,EAAAA,IAAawsB,IAGpB,MAAM,MAAE9pF,EAAF,eAASmuF,EAAT,aAAyBC,GAAiBvsF,EAAEW,OAClD4qF,EACEe,GAAkBC,GAAgBA,EAAepuF,EAAMtB,OACnD,CAACyvF,EAAgBC,QACjBnoF,GAGNinF,GAAa,GAEb,MAAMmB,EACJpuD,EAAAA,IAAay2C,QAA0BzwE,IAAfsnF,GACrBvtF,EAAMtB,OAAS6uF,EAAW7uF,OAAS,IAAMqvF,EAAgB3gF,QAE9DqgF,EAAgBY,EAA+B,GAAE3X,EAASI,eAAe92E,IAAUA,KAClF,CAACw1B,EAAWm3D,EAAgBjW,EAAS6W,EAAYE,IAE9Ca,GAA0B1sF,EAAAA,EAAAA,KAAaC,IAC3C2qF,EAAkB3qF,EAAEW,OAAOqR,WAC1B,CAAC24E,IAcE+B,EAA4B,sCAAd5xD,EAEpB,OACE,0BAAKv4B,GAAG,yBAAyBjD,UAAU,iBACzC,0BAAKA,UAAU,aACb,0BAAKiD,GAAG,SACR,yCACA,wBAAGjD,UAAU,QAAQ4D,EAAK,cAC1B,2BAAMO,OAAO,GAAGkpF,SApBtB,SAAsBr6E,GACpBA,EAAM/R,iBAEFmzB,GAIAi4D,GACFjB,EAAmB,CAAEj3D,YAAai4D,MAa9B,mBAAC,GAAD,CACEnpF,GAAG,qBACHpE,MAAO02E,EACP9jE,WAAY8jB,IAAuBggD,EACnC3iE,SAAUk6E,IAEZ,mBAACQ,GAAA,EAAD,CACE7gF,IAAKm9E,EACL3mF,GAAG,uBACHuP,MAAO5O,EAAK,0BACZ/E,MAAOutF,EACP5yF,MAAO66B,GAAazwB,EAAKywB,GACzB3f,UAAU,MACV9B,SAAUm6E,EACVh4E,QAAS+pB,EAAAA,GAAY+tD,OAAc/nF,IAErC,mBAACyoF,GAAA,EAAD,CACEtqF,GAAG,uBACHuP,MAAM,oBACNE,QAASnQ,QAAQ85B,GACjBzpB,SAAUu6E,IAEXd,IACCe,EACE,mBAACI,GAAA,EAAD,CAAQr0F,KAAK,SAAS0Y,QAAM,EAACJ,UAAW2iB,GAAgBxwB,EAAK,eAE7D,mBAAC6pF,GAAA,EAAD,OAGHL,GACC,mBAACI,GAAA,EAAD,CAAQh8E,QAAM,EAACK,QAAM,EAACJ,UAAWijB,EAAqBnzB,QAASkqF,GAC5D7nF,EAAK,mBAGT8lF,GAAqBA,IAAsB9uD,GAAY8wD,GACtD,mBAAC8B,GAAA,EAAD,CAAQh8E,QAAM,EAACC,UAAWA,EAAWlQ,QAASmrF,GAAmBhB,U,eClP7E,MAMA,IAAe5rF,EAAAA,EAAAA,KANW,KACxB,MAAM4tF,GAAWC,EAAAA,GAAAA,GAAgB/c,EAAAA,GAAAA,KAAc,YAE/C,OAAO8c,EAAW,mBAACA,EAAD,MAAe,mBAACD,GAAA,EAAD,SCGnC,IAAe3tF,EAAAA,EAAAA,KANe,KAC5B,MAAM8tF,GAAeD,EAAAA,GAAAA,GAAgB/c,EAAAA,GAAAA,KAAc,gBAEnD,OAAOgd,EAAe,mBAACA,EAAD,MAAmB,mBAACH,GAAA,EAAD,SCG3C,IAAe3tF,EAAAA,EAAAA,KANe,KAC5B,MAAM+tF,GAAeF,EAAAA,GAAAA,GAAgB/c,EAAAA,GAAAA,KAAc,gBAEnD,OAAOid,EAAe,mBAACA,EAAD,MAAmB,mBAACJ,GAAA,EAAD,SCP9B,IAAIK,GAAE,KAAK,MAAMC,IAAGA,GAAEnhE,OAAO,SAAS5uB,EAAEgwF,GAAGF,GAAE9vF,EAAEgwF,IAAIx9B,KAAKy9B,UAAUF,GAC/E,SAAU/vF,GAAG,SAASgwF,EAAE9vF,EAAEwR,EAAEqnC,EAAEr2C,GAAG,IAAIs2C,EAAE,GAAGk3C,EAAElwF,EAAE+4C,EAAErnC,GAAGw+E,EAAEnN,EAAE7iF,GAAGgwF,EAAEC,IAAIztF,EAAEA,GAAG,EAAE,IAAIs7E,EAAEkS,EAAEA,IAAI/pE,EAAE+pE,EAAEA,IAAI,EAAExtF,EAA4G,OAA1Gs2C,EAAEj3C,KAAK7B,EAAE84C,EAAEo3C,MAAM1+E,EAAEsnC,EAAEi+B,QAAQl+B,EAAEC,EAAEq3C,EAAElqE,EAAE6yB,EAAED,EAAE,SAASC,EAAED,GAAa,OAALA,GAAGr2C,IAAS,GAAjBs2C,GAAGt2C,IAAmBs2C,GAAGglC,GAAG,EAAEjlC,GAAGA,GAAGilC,IAAKkS,EAAEn3C,EAAEC,EAAED,IAAWC,EAAE,SAASs3C,EAAEpwF,EAAEwR,EAAEqnC,EAAEr2C,EAAEs2C,EAAEk3C,EAAElS,EAAE73D,EAAE83D,EAAE3kE,GAAG,SAASypE,EAAE/pC,EAAED,EAAE6Y,EAAElgD,EAAEyU,EAAE63D,EAAEC,GAAGjlC,GAAG94C,EAAEqwF,OAAOx3C,EAAEilC,EAAEpsB,EAAEqsB,GAAG/9E,EAAEswF,MAAMz3C,EAAE6Y,EAAElgD,EAAEyU,EAAE+pE,IAAIhwF,EAAEqwF,OAAOx3C,EAAE6Y,GAAGosB,EAAE99E,EAAEuwF,OAAO/+E,EAAEw+E,EAAEn3C,GAAG74C,EAAEuwF,OAAO/+E,EAAEqnC,GAAGgqC,EAAE58D,EAAEzjB,EAAEq2C,EAAEr2C,EAAEs2C,GAAGk3C,EAAE,GAAGnN,EAAE9E,EAAEv7E,EAAEs2C,EAAEtnC,EAAEsnC,EAAE,GAAGk3C,GAAGnN,EAAEzpE,EAAE5H,EAAEsnC,EAAEtnC,EAAEqnC,EAAEm3C,EAAE,GAAGnN,EAAE/E,EAAEtsE,EAAEqnC,EAAEr2C,EAAEq2C,EAAE,EAAEm3C,GAAG,SAASQ,EAAExwF,EAAEwR,EAAEqnC,EAAEr2C,EAAEs2C,EAAEk3C,EAAElS,EAAE73D,EAAE83D,EAAE3kE,GAAG,SAASypE,EAAE/pC,EAAED,EAAErnC,EAAEyU,GAAGjmB,EAAEuwF,OAAOz3C,EAAEtnC,EAAEqnC,GAAG74C,EAAEqwF,OAAOv3C,EACtfD,GAAG74C,EAAEqwF,OAAOv3C,EAAED,EAAE5yB,GAAGjmB,EAAEswF,MAAMx3C,EAAED,EAAEC,EAAEtnC,EAAEqnC,EAAEm3C,GAAGlS,GAAG+E,EAAErxE,EAAEqnC,EAAEm3C,EAAEA,GAAG/pE,GAAG48D,EAAErgF,EAAEq2C,GAAGm3C,EAAEA,GAAGjS,GAAG8E,EAAErgF,EAAEs2C,GAAGk3C,GAAGA,GAAG52E,GAAGypE,EAAErxE,EAAEsnC,EAAEk3C,GAAGA,GAAmX,SAAS12E,EAAEtZ,EAAEwR,GAAGqnC,EAAE,CAAC,IAAIA,EAAErnC,EAAE3P,KAAKW,EACpfgP,EAAEi/E,EAAE33C,EAAEtnC,EAAEk/E,EAAEV,EAAEx+E,EAAEm/E,EAAE7S,EAAEtsE,EAAEo/E,EAAqB,IAAnB93C,EAAEj6C,KAAKsP,IAAI,EAAE2qC,GAAG,GAAOk3C,EAAEnxF,KAAKuP,IAAI,GAAG4hF,GAAG,IAAIl3C,GAAGk3C,EAAEl3C,GAAG,EAAE,IAAI,IAAI7yB,EAAE6pE,EAAEj3C,EAAEr2C,EAAEs2C,EAAEglC,GAAG,MAAMjlC,EAAE,MAAMo3C,IAAIhqE,OAAE,EAAO,IAAIA,EAAE,OAAO,KAAyI,IAApI4yB,EAAE74C,EAAEy8D,WAAW,MAAMjrD,EAAEm5E,aAAa9xC,EAAEg4C,UAAUr/E,EAAEm5E,WAAW9xC,EAAEi4C,SAASt/E,EAAEu/E,KAAKv/E,EAAEm7E,IAAIn7E,EAAEtG,KAAKsG,EAAEtG,OAAO1I,EAAEyjB,EAAEkqE,EAAEH,EAAEx+E,EAAEtG,KAAK1I,EAAEq2C,EAAEm4C,YAAgBlT,EAAE,EAAEA,EAAEt7E,EAAEs7E,GAAG,EAAE,IAAIhlC,EAAE,EAAEA,EAAEt2C,EAAEs2C,GAAG,EAAE,CAAC,IAAIilC,EAAEllC,EAAEz/B,EAAE5H,EAAEu/E,KAAKj4C,EAAEk3C,EAAEnN,EAAErxE,EAAEm7E,IAAI7O,EAAEkS,EAAEtnE,EAAEo1D,EAAEmT,EAAEn4C,EAAE4Y,EAAEzrC,EAAE4yB,EAAEj6C,EAAEwa,EAAE42E,EAAElO,EAAEe,EAAEmN,EAAEkB,EAAExoE,EAAE,EAAEyoE,EAAEzoE,EAAE,EAAEppB,EAAE2xF,EAAE,EAAEltE,EAAEktE,EAAE,EAAE33E,EAAEza,KAAKC,MAAMD,KAAKuP,IAAI,GAAGvP,KAAKsP,IAAI,EAAEqD,EAAE4/E,IAAIpB,GAAGS,EAAE/+B,EAAEhpC,EAAEuoE,GAAGI,EAAE3/B,EAAEw/B,EAAE5xF,GAAGQ,EAAE4xD,EAAEw/B,EAAED,GAAGC,EAAEx/B,EAAEw/B,EAAEntE,GAAG,IAAIutE,EAAE5/B,EAAEhpC,EAAE3E,GAAGA,EAAE2tC,EAAEy/B,EAAEptE,GAAGktE,EAAEv/B,EAAEy/B,EACnfF,GAAGE,EAAEz/B,EAAEy/B,EAAE7xF,GAAGopB,EAAEgpC,EAAEhpC,EAAEppB,GAAG8Z,EAAEva,KAAKoP,MAAMmL,GAAGypE,EAAEhkF,KAAKoP,MAAM40E,GAAGjkF,EAAEC,KAAKoP,MAAMrP,GAAGkjF,EAAEjjF,KAAKoP,MAAM6zE,GAAG2O,EAAEL,EAAErS,EAAE3kE,EAAEypE,EAAEjkF,EAAEkjF,EAAExoE,GAAGxZ,IAAI4oB,GAAG5oB,IAAIwxF,GAAGL,IAAIK,GAAGL,IAAIvoE,GAAG8nE,EAAEzS,EAAE3kE,EAAEypE,EAAEjkF,EAAEkjF,EAAExoE,EAAExZ,GAAG4oB,GAAG2oE,EAAEvxF,GAAGwxF,GAAGJ,EAAED,GAAGK,GAAGvtE,EAAEktE,GAAGvoE,GAAGyoE,GAAmB,OAF7F,SAAWnxF,EAAEwR,GAAG,IAAIqnC,EAAErnC,EAAEo4B,KAAK,GAAG,iBAAkBiP,EAAE74C,EAAE6wF,UAAUh4C,MAAM,CAAC,IAAIr2C,EAAEq2C,EAAE59C,KAAK69C,EAAED,EAAE04C,WAAuD,GAA5C14C,EAAEA,EAAE7/B,SAAS7R,KAAK2xC,GAAIj6C,KAAKoP,MAAM6qC,EAAEtnC,EAAEtG,QAAU,oBAAoB1I,EAAE,IAAIwtF,EAAEhwF,EAAEwxF,qBAAqBC,MAAMzxF,EAAE64C,OAAQ,IAAG,oBAAoBr2C,EAA2C,MAAM5G,MAAM,oBAArDo0F,EAAEhwF,EAAE0xF,qBAAqBD,MAAMzxF,EAAE64C,GAAwCC,EAAEpwC,SAAQ,EAAEowC,EAAED,MAAMm3C,EAAE2B,aAAa74C,EAAED,MAAK74C,EAAE6wF,UAAUb,GAEhS4B,CAAE/4C,EAAErnC,GAAGqnC,EAAEjP,OAAc5pC,EAAE,IAAIywF,EAAE,CAACoB,WAAW,EAAEC,WAAW,GAAGC,QAAQ,IAAIhB,KAAK,EAAEpE,IAAI,EAAEzhF,KAAK,IAAI0+B,KAAK,OAAO+gD,WAAW,KAAK9oF,KAAK,UAAUmwF,OAAO,GAAGC,MAAM,GAAGrC,GAAE,SAAS5vF,EAAEwR,GAAG,IAAIqnC,EAAE,GAAG37C,OAAOC,OAAO07C,EAAE43C,EAAEzwF,GAAG64C,EAAE63C,EAAE73C,EAAEg5C,WAAWh5C,EAAE83C,EAAE93C,EAAEi5C,WAAWj5C,EAAE43C,EAAE53C,EAAEk5C,QAAQl5C,EAAEk4C,KAAKl4C,EAAEk4C,KAAKl4C,EAAE8zC,IAAI9zC,EAAE8zC,IAAI9zC,EAAE3tC,KAAK2tC,EAAE3tC,KAAK2tC,EAAEjP,KAAKiP,EAAEjP,KAAKiP,EAAE8xC,WAAW9xC,EAAE8xC,WAC/e9xC,EAAEh3C,KAAKg3C,EAAEh3C,KAAKg3C,EAAEu4C,EAAEv4C,EAAEm5C,OAAOn5C,EAAE+3C,EAAE/3C,EAAEo5C,MAASzgF,aAAa0gF,mBAAsB1gF,EAAE67B,QAAQwL,EAAE3tC,MAAMsG,EAAE87B,SAASuL,EAAE3tC,OAAKsG,EAAE67B,MAAMwL,EAAE3tC,KAAKsG,EAAE87B,OAAOuL,EAAE3tC,MAAKsG,EAAEirD,WAAW,MAAM01B,UAAU,EAAE,EAAE3gF,EAAE67B,MAAM77B,EAAE87B,QAAQh0B,EAAE9H,EAAEqnC,MAAQ74C,EAAE6D,SAASiH,cAAc,WAAYuiC,MAAMwL,EAAE3tC,KAAKlL,EAAEstC,OAAOuL,EAAE3tC,KAAK2tC,EAAEv/B,EAAEtZ,EAAE64C,GAAGrnC,EAAE6Z,YAAYwtB,KAJxS,CAI8S,WACjE,SAASu3C,EAAE5+E,EAAEqnC,GAAG,SAASr2C,EAAEs2C,EAAEk3C,GAAG,IAAI,IAAIn3C,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,MAAM,GAAGC,EAAED,GAAG5yB,GAAG6yB,EAAED,GAAG,IAAI,IAAIrnC,GAAG,EAAE,GAAGA,EAAEA,GAAG,GAAG,GAAGw+E,EAAEx+E,GAAGyU,GAAG+pE,EAAEx+E,IAAIssE,EAAEhlC,EAAED,GAAGm3C,EAAEx+E,GAAG,GAAGqnC,GAAG,GAAGA,IAAI,GAAGrnC,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,IAAI,GAAGqnC,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,GAAG,GAAGrnC,GAAG,GAAGA,GAAS,SAASsnC,EAAEA,EAAED,GAAG,IAAI,IAAI6Y,EAAEzrC,EAAE,EAAEzU,EAAE,GAAG5S,EAAE4J,MAAMkpD,GAAGowB,EAAE,EAAEA,EACnfpwB,EAAEowB,GAAG,EAAE,CAACljF,EAAEkjF,GAAGt5E,MAAMkpD,GAAG,IAAI,IAAIhpC,EAAE,EAAEA,EAAEgpC,EAAEhpC,GAAG,EAAE9pB,EAAEkjF,GAAGp5D,GAAG,KAA2C,IAAtCo1D,EAAEl/E,EAAE4D,EAAE,EAAE,GAAGA,EAAEyjB,EAAE,EAAE,GAAGzjB,EAAE,EAAEyjB,EAAE,GAAGyrC,EAAEp4C,EAAEs2E,EAAEp+E,GAAO5S,EAAE,EAAEA,EAAE8yD,EAAEryD,OAAOT,GAAG,EAAE,IAAIkjF,EAAE,EAAEA,EAAEpwB,EAAEryD,OAAOyiF,GAAG,EAAE,CAACp5D,EAAEgpC,EAAE9yD,GAAG,IAAIqyF,EAAEv/B,EAAEowB,GAAG,GAAG,MAAMhE,EAAEp1D,GAAGuoE,GAAG,IAAI,IAAI3xF,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,IAAI,IAAIykB,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE+5D,EAAEp1D,EAAEppB,GAAG2xF,EAAEltE,IAAI,GAAGzkB,GAAG,GAAGA,IAAI,GAAGykB,GAAG,GAAGA,GAAG,GAAGzkB,GAAG,GAAGykB,EAAE,IAAI2tC,EAAE,EAAEA,EAAEzrC,EAAE,EAAEyrC,GAAG,EAAE,MAAMosB,EAAEpsB,GAAG,KAAKosB,EAAEpsB,GAAG,GAAG,GAAGA,EAAE,GAAG,IAAIA,EAAE,EAAEA,EAAEzrC,EAAE,EAAEyrC,GAAG,EAAE,MAAMosB,EAAE,GAAGpsB,KAAKosB,EAAE,GAAGpsB,GAAG,GAAGA,EAAE,GAAiB,IAAdA,EAAEp4C,EAAExZ,EAAEkwF,GAAG,EAAEn3C,GAAOj6C,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEkjF,GAAGhpC,GAAG,IAAI4Y,GAAG9yD,EAAE,GAAGk/E,EAAE,EAAEl/E,EAAEA,EAAE,EAAEA,EAAEA,EAAE,EAAEqnB,EAAE,GAAGrnB,GAAG,GAAGkjF,EAAEhE,EAAE,GAAG,EAAEl/E,EAAEqnB,EAAErnB,EAAE,EAAE,EAAEA,EAAE,GAAGA,EAAE,GAAGA,GAAGkjF,EAAe,GAAbhE,EAAE73D,EAAE,GAAG,IAAI6yB,EAAK,GACtftnC,EAAE,CAAU,IAATkgD,EAAEp4C,EAAEs4E,EAAEpgF,GAAO5S,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEkjF,GAAGhpC,GAAG,IAAI4Y,GAAG9yD,EAAE,GAAGk/E,EAAEj/E,KAAKC,MAAMF,EAAE,IAAIA,EAAE,EAAEqnB,EAAE,EAAE,GAAG67D,EAAE,IAAIljF,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEkjF,GAAGhpC,GAAG,IAAI4Y,GAAG9yD,EAAE,GAAGk/E,EAAEl/E,EAAE,EAAEqnB,EAAE,EAAE,GAAGpnB,KAAKC,MAAMF,EAAE,IAAIkjF,EAAE,GAAG,MAAM/D,EAAE,CAAkB,IAAjBjlC,EAAE94C,EAAEqxF,EAAE7/E,EAAEw+E,GAAGt+B,EAHmS,WAAa,IAAIlgD,EAAE,GAAGqnC,EAAE,EAAEr2C,EAAE,CAACstF,EAAE,WAAW,OAAOt+E,GAC/fA,EAAE,SAASsnC,GAAG,OAAO,IAAItnC,EAAE3S,KAAKC,MAAMg6C,EAAE,MAAM,EAAEA,EAAE,EAAE,IAAI4a,IAAI,SAAS5a,EAAEk3C,GAAG,IAAI,IAAIn3C,EAAE,EAAEA,EAAEm3C,EAAEn3C,GAAG,EAAEr2C,EAAEs/E,EAAE,IAAIhpC,IAAIk3C,EAAEn3C,EAAE,EAAE,KAAK6Y,EAAE,WAAW,OAAO7Y,GAAGipC,EAAE,SAAShpC,GAAG,IAAIk3C,EAAEnxF,KAAKC,MAAM+5C,EAAE,GAAGrnC,EAAEnS,QAAQ2wF,GAAGx+E,EAAEnR,KAAK,GAAGy4C,IAAItnC,EAAEw+E,IAAI,MAAMn3C,EAAE,GAAGA,GAAG,IAAI,OAAOr2C,EAE9DstF,GAAQlxF,EAAE,EAAEA,EAAEwa,EAAE/Z,OAAOT,GAAG,EAAEkjF,EAAE1oE,EAAExa,GAAG8yD,EAAEgC,IAAI,EAAE,GAAGhC,EAAEgC,IAAIouB,EAAEhpC,IAAIx/B,EAAEo4C,EAAE,EAAElgD,IAAIswE,EAAEsQ,MAAM1gC,GAAG,IAAI9yD,EAAEkjF,EAAE,EAAEljF,EAAEk6C,EAAEz5C,OAAOT,GAAG,EAAEkjF,GAAGhpC,EAAEl6C,GAAGe,EAAE,GAAG+xD,EAAEA,IAAI,EAAEowB,EAAE,MAAMlmF,MAAM,0BAA0B81D,EAAEA,IAAI,IAAI,EAAEowB,EAAE,KAAK,IAAIpwB,EAAEA,IAAI,GAAG,EAAEowB,GAAGpwB,EAAEgC,IAAI,EAAE,GAAG,GAAGhC,EAAEA,IAAI,GAAGA,EAAEowB,GAAE,GAAI,OAAOpwB,EAAEA,KAAK,EAAEowB,IAAKpwB,EAAEgC,IAAI,IAAI,GAAMhC,EAAEA,KAAK,EAAEowB,KAAQpwB,EAAEgC,IAAI,GAAG,GAAG,IAAImvB,EAAE,EAC7c,IAD+cf,EAAEljF,EAAE,EAAE8pB,EAAElgB,MAAMswC,EAAEz5C,QACjf4xF,EAAEzoF,MAAMswC,EAAEz5C,QAAYC,EAAE,EAAEA,EAAEw5C,EAAEz5C,OAAOC,GAAG,EAAE,CAAC,IAAImxF,EAAE33C,EAAEx5C,GAAGK,EAAEG,EAAEg5C,EAAEx5C,GAAGkjF,EAAEiO,EAAgD,IAA9C7xF,EAAEC,KAAKsP,IAAIvP,EAAE6xF,GAAG3O,EAAEjjF,KAAKsP,IAAI2zE,EAAEhiF,GAAG4oB,EAAEppB,GAAGkJ,MAAMioF,GAAO1sE,EAAE,EAAEA,EAAE2E,EAAEppB,GAAGD,OAAO0kB,GAAG,EAAE2E,EAAEppB,GAAGykB,GAAG,IAAI2tC,EAAEo+B,IAAI/rE,EAAE8+D,GAA4D,IAAzDA,GAAG4N,EAAE1sE,EAAEzK,EAAE82E,EAAEtwF,GAAG2wF,EAAED,EAAE9nE,EAAEppB,GAAGykB,EAAE+0B,IAAI,GAAG/0B,EAAEA,GAAGktE,EAAE3xF,GAAGkJ,MAAMub,EAAE+0B,IAAI,GAAO/0B,EAAE,EAAEA,EAAEktE,EAAE3xF,GAAGD,OAAO0kB,GAAG,EAAEjkB,EAAEikB,EAAE0sE,EAAE33C,IAAIm4C,EAAE3xF,GAAGD,OAAO4xF,EAAE3xF,GAAGykB,GAAG,GAAGjkB,EAAE2wF,EAAEj/E,EAAE1R,GAAG,EAAE,IAAIikB,EAAE2tC,EAAE,EAAE3tC,EAAE+0B,EAAEz5C,OAAO0kB,GAAG,EAAE2tC,GAAG5Y,EAAE/0B,GAAGy+D,EAAa,IAAX9wB,EAAElpD,MAAMkpD,GAAO3tC,EAAE8+D,EAAE,EAAE9+D,EAAEnlB,EAAEmlB,GAAG,EAAE,IAAIzkB,EAAE,EAAEA,EAAEw5C,EAAEz5C,OAAOC,GAAG,EAAEykB,EAAE2E,EAAEppB,GAAGD,SAASqyD,EAAEmxB,GAAGn6D,EAAEppB,GAAGykB,GAAG8+D,GAAG,GAAG,IAAI9+D,EAAE,EAAEA,EAAE+9D,EAAE/9D,GAAG,EAAE,IAAIzkB,EAAE,EAAEA,EAAEw5C,EAAEz5C,OAAOC,GAAG,EAAEykB,EAAEktE,EAAE3xF,GAAGD,SAASqyD,EAAEmxB,GAAGoO,EAAE3xF,GAAGykB,GAAG8+D,GAAG,GAAG9E,EAAErsB,EACpd,IADsd5Y,EAAEilC,EAAErsB,GACnf,EAAE9yD,EAAEqnB,EAAE,EAAE67D,EAAE,EAAEp5D,EAAE,EAAEmwB,EAAEv/B,EAAEg4E,EAAEz4C,GAAOo4C,EAAEhrE,EAAE,EAAE,EAAEgrE,EAAEA,GAAG,EAAE,IAAI,GAAGA,KAAKA,IAAI,CAAC,IAAI3xF,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,MAAMw+E,EAAEl/E,GAAGqyF,EAAE3xF,KAAKykB,GAAE,EAAG2E,EAAEowB,EAAEz5C,SAAS0kB,EAAE,IAAI+0B,EAAEpwB,KAAKo5D,EAAE,IAAIjpC,EAAEj6C,EAAEqyF,EAAE3xF,KAAKykB,GAAGA,GAAG+5D,EAAEl/E,GAAGqyF,EAAE3xF,GAAGykB,GAAO,KAAH+9D,IAAUp5D,GAAG,EAAEo5D,EAAE,IAAS,GAAG,GAARljF,GAAG8yD,IAAUzrC,GAAGrnB,EAAE,CAACA,GAAG8yD,EAAEA,GAAGA,EAAE,QAAQ,IAAIs+B,EAAE4B,EAAE/4C,GAAGilC,EAAE,KAAK73D,EAAE,EAAE83D,EAAE,KAAK3kE,EAAE,GAAGypE,EAAE,CAACA,EAAE,SAAS/pC,GAAGA,EALuC,SAAWtnC,GAAG,IAAIqnC,EAAEu3C,EAAE3uF,EAAE+P,GAAG,MAAM,CAAC6gF,EAAE,WAAW,OAAO,GAAGv5C,EAAE,WAAW,OAAOD,EAAEx5C,QAAQ+yF,MAAM,SAAS5gF,GAAG,IAAI,IAAIsnC,EAAE,EAAEA,EAAED,EAAEx5C,OAAOy5C,GAAG,EAAEtnC,EAAEkiD,IAAI7a,EAAEC,GAAG,KAKrLh5C,CAAEg5C,GAAG1/B,EAAE/Y,KAAKy4C,GAAGilC,EAAE,MAAMllC,EAAE,SAASC,EAAED,GAAG,GAAG,EAAEC,GAAG7yB,GAAG6yB,GAAG,EAAED,GAAG5yB,GAAG4yB,EAAE,MAAMj9C,MAAMk9C,EAAE,IAAID,GAAG,OAAOilC,EAAEhlC,GAAGD,IAAIm3C,EAAE,WAAW,OAAO/pE,GAAGgqE,EAAE,WAAW,IAAI,IAAIp3C,EAAE,EAAEm3C,EAAE,EAAEx+E,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,CAACsnC,GAAE,EAAGtnC,GAAG,IAAIyU,EAAE3M,EAAE43E,EAAErO,IAAM,GAAGrxE,GAAGqnC,EAAE5yB,KAAE4yB,EAAE5yB,EAAE+pE,EAAEx+E,GAAEsnC,GAAE,EAAGk3C,KAAK,OAAOnN,EACrf,SAAS2N,EAAEh/E,EAAEqnC,GAAG,QAAG,IAAoBrnC,EAAEnS,OAAO,MAAMzD,MAAM4V,EAAEnS,OAAO,IAAIw5C,GAAG,IAAIr2C,EAAE,WAAW,IAAI,IAAIs2C,EAAE,EAAEA,EAAEtnC,EAAEnS,QAAQ,GAAGmS,EAAEsnC,IAAIA,GAAG,EAAE,IAAI,IAAIglC,EAAEt1E,MAAMgJ,EAAEnS,OAAOy5C,EAAED,GAAG5yB,EAAE,EAAEA,EAAEzU,EAAEnS,OAAOy5C,EAAE7yB,GAAG,EAAE63D,EAAE73D,GAAGzU,EAAEyU,EAAE6yB,GAAG,OAAOglC,EAAxH,GAA6HhlC,EAAE,CAACtnC,EAAE,SAASsnC,GAAG,OAAOt2C,EAAEs2C,IAAIA,EAAE,WAAW,OAAOt2C,EAAEnD,QAAQizF,SAAS,SAASz5C,GAAG,IAAI,IAAIm3C,EAAExnF,MAAMswC,EAAEA,IAAID,EAAEC,IAAI,GAAGtnC,EAAE,EAAEA,EAAEsnC,EAAEA,IAAItnC,GAAG,EAAE,IAAI,IAAIusE,EAAE,EAAEA,EAAEllC,EAAEC,IAAIilC,GAAG,EAAEiS,EAAEx+E,EAAEusE,IAAI0S,EAAEjxF,EAAEixF,EAAE1S,EAAEjlC,EAAEtnC,EAAEA,IAAIi/E,EAAE1S,EAAEllC,EAAErnC,EAAEusE,KAAK,OAAOyS,EAAER,EAAE,IAAIjsE,EAAE,SAAS80B,GAAG,GAAG,EAAEC,EAAEA,IAAID,EAAEC,IAAI,OAAOA,EAAE,IAAI,IAAItnC,EAAEi/E,EAAE1S,EAAEjlC,EAAEtnC,EAAE,IAAIi/E,EAAE1S,EAAEllC,EAAErnC,EAAE,IAAIw+E,EAAExnF,MAAMswC,EAAEA,KACjfilC,EAAE,EAAEA,EAAEjlC,EAAEA,IAAIilC,GAAG,EAAEiS,EAAEjS,GAAGjlC,EAAEtnC,EAAEusE,GAAG,IAAIA,EAAE,EAAEA,EAAEllC,EAAEC,IAAIilC,GAAG,EAAEiS,EAAEjS,IAAI0S,EAAEjxF,EAAEixF,EAAE1S,EAAEllC,EAAErnC,EAAEusE,IAAIvsE,GAAG,OAAOg/E,EAAER,EAAE,GAAGjsE,EAAE80B,KAAK,OAAOC,EAAEs3C,EAAE3uF,EAAE,SAAS+P,GAAG,IAAI,IAAIqnC,EAAE,GAAGr2C,EAAE,EAAEA,EAAEgP,EAAEnS,OAAOmD,IAAI,CAAC,IAAIs2C,EAAEtnC,EAAErR,WAAWqC,GAAG,IAAIs2C,EAAED,EAAEx4C,KAAKy4C,GAAG,KAAKA,EAAED,EAAEx4C,KAAK,IAAIy4C,GAAG,EAAE,IAAM,GAAFA,GAAM,MAAMA,GAAG,OAAOA,EAAED,EAAEx4C,KAAK,IAAIy4C,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAOt2C,IAAIs2C,EAAE,QAAU,KAAFA,IAAS,GAAmB,KAAhBtnC,EAAErR,WAAWqC,IAASq2C,EAAEx4C,KAAK,IAAIy4C,GAAG,GAAG,IAAIA,GAAG,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAO,OAAOD,GAAG,IAAI+4C,EAAE,CAACW,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAE5C,EAAE,GAAGv2E,EAAE,WAAW,SAAS9H,EAAEsnC,GAAG,IAAI,IAAID,EAAE,EAAE,GAAGC,GAAGD,GAAG,EAAEC,KAAK,EAAE,OAAOD,EAAE,IAAIA,EAAE,CAAC,GAAG,CAAC,EAAE,IACjf,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KACjf,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,MAAMr2C,EAAE,CAAC1C,EAAE,SAASg5C,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAGtnC,EAAEqnC,GAAGrnC,EAAE,OAAOqnC,GAAG,MAAMrnC,EAAEqnC,GAAGrnC,EAAE,MAAM,OAAgB,OAATsnC,GAAG,GAAGD,IAAU+4C,EAAE,SAAS94C,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAGtnC,EAAEqnC,GAAGrnC,EAAE,OAAOqnC,GAAG,MAAMrnC,EAAEqnC,GAAGrnC,EAAE,MAAM,OAAOsnC,GAAG,GAAGD,GAAG+2C,EAAE,SAAS92C,GAAG,OAAOD,EAAEC,EAAE,IAAIw4C,EAAE,SAASx4C,GAAG,OAAOA,GAAG,KAAK,EAAE,OAAO,SAASA,EAAED,GAAG,OAAO,IAAIC,EAAED,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,GAAG,OAAO,GAAGA,EAAE,GAAG,KAAK,EAAE,OAAO,SAASA,EAAED,GAAG,OAAO,GAAGA,EAAE,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IACnfC,EAAED,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIh6C,KAAKC,MAAMg6C,EAAE,GAAGj6C,KAAKC,MAAM+5C,EAAE,IAAI,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,GAAGC,EAAED,EAAE,EAAEC,EAAED,EAAE,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIC,EAAED,EAAE,EAAEC,EAAED,EAAE,GAAG,GAAG,KAAK,EAAE,OAAO,SAASC,EAAED,GAAG,OAAO,IAAIC,EAAED,EAAE,GAAGC,EAAED,GAAG,GAAG,GAAG,QAAQ,MAAMj9C,MAAM,mBAAmBk9C,KAAMs3C,EAAE,SAASt3C,GAAG,IAAI,IAAID,EAAE23C,EAAE,CAAC,GAAG,GAAGh/E,EAAE,EAAEA,EAAEsnC,EAAEtnC,GAAG,EAAEqnC,EAAEA,EAAEy5C,SAAS9B,EAAE,CAAC,EAAEC,EAAEjxF,EAAEgS,IAAI,IAAI,OAAOqnC,GAAG6Y,EAAE,SAAS5Y,EAAED,GAAG,GAAG,GAAGC,GAAG,EAAED,GAAG,GAAGA,EAAE,MAAMj9C,MAAM,SAASk9C,EAAE,WAAWD,GAAG,OAAO,GAAGA,EAAE,EAAE,IAAIq4C,EAAE,SAASp4C,GAAG,IAAI,IAAID,EAAEC,EAAEk3C,IAAIx+E,EAAE,EACpfyU,EAAE,EAAEA,EAAE4yB,EAAE5yB,GAAG,EAAE,IAAI,IAAI83D,EAAE,EAAEA,EAAEllC,EAAEklC,GAAG,EAAE,CAAC,IAAI,IAAIv7E,EAAE,EAAExC,EAAE84C,EAAED,EAAE5yB,EAAE83D,GAAGr1D,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,KAAK,EAAEzC,EAAEyC,GAAGmwB,GAAG5yB,EAAEyC,GAAG,IAAI,IAAIuoE,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,EAAElT,EAAEkT,GAAGp4C,GAAGklC,EAAEkT,IAAI,GAAGvoE,GAAG,GAAGuoE,IAAIjxF,GAAG84C,EAAED,EAAE5yB,EAAEyC,EAAEq1D,EAAEkT,KAAKzuF,GAAG,GAAG,EAAEA,IAAIgP,GAAG,EAAEhP,EAAE,GAAG,IAAIyjB,EAAE,EAAEA,EAAE4yB,EAAE,EAAE5yB,GAAG,EAAE,IAAI83D,EAAE,EAAEA,EAAEllC,EAAE,EAAEklC,GAAG,EAAKv7E,EAAE,EAAEs2C,EAAED,EAAE5yB,EAAE83D,KAAKv7E,GAAG,GAAGs2C,EAAED,EAAE5yB,EAAE,EAAE83D,KAAKv7E,GAAG,GAAGs2C,EAAED,EAAE5yB,EAAE83D,EAAE,KAAKv7E,GAAG,GAAGs2C,EAAED,EAAE5yB,EAAE,EAAE83D,EAAE,KAAKv7E,GAAG,IAAG,GAAGA,GAAG,GAAGA,KAAEgP,GAAG,GAAE,IAAIyU,EAAE,EAAEA,EAAE4yB,EAAE5yB,GAAG,EAAE,IAAI83D,EAAE,EAAEA,EAAEllC,EAAE,EAAEklC,GAAG,EAAEjlC,EAAED,EAAE5yB,EAAE83D,KAAKjlC,EAAED,EAAE5yB,EAAE83D,EAAE,IAAIjlC,EAAED,EAAE5yB,EAAE83D,EAAE,IAAIjlC,EAAED,EAAE5yB,EAAE83D,EAAE,IAAIjlC,EAAED,EAAE5yB,EAAE83D,EAAE,KAAKjlC,EAAED,EAAE5yB,EAAE83D,EAAE,IAAIjlC,EAAED,EAAE5yB,EAAE83D,EAAE,KAAKvsE,GAAG,IAAI,IAAIusE,EAAE,EAAEA,EAAEllC,EAAEklC,GAAG,EAAE,IAAI93D,EAAE,EAAEA,EAAE4yB,EAAE,EAAE5yB,GAAG,EAAE6yB,EAAED,EAAE5yB,EAAE83D,KAAKjlC,EAAED,EAAE5yB,EACrf,EAAE83D,IAAIjlC,EAAED,EAAE5yB,EAAE,EAAE83D,IAAIjlC,EAAED,EAAE5yB,EAAE,EAAE83D,IAAIjlC,EAAED,EAAE5yB,EAAE,EAAE83D,KAAKjlC,EAAED,EAAE5yB,EAAE,EAAE83D,IAAIjlC,EAAED,EAAE5yB,EAAE,EAAE83D,KAAKvsE,GAAG,IAAI,IAAIusE,EAAEv7E,EAAE,EAAEu7E,EAAEllC,EAAEklC,GAAG,EAAE,IAAI93D,EAAE,EAAEA,EAAE4yB,EAAE5yB,GAAG,EAAE6yB,EAAED,EAAE5yB,EAAE83D,KAAKv7E,GAAG,GAAG,OAAOgP,EAAG3S,KAAK6xC,IAAI,IAAIluC,EAAEq2C,EAAEA,EAAE,IAAI,EAAE,KAAK,OAAOr2C,EALqP,GAKhPiuF,EAAE,WAAW,IAAI,IAAIj/E,EAAEhJ,MAAM,KAAKqwC,EAAErwC,MAAM,KAAKhG,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAEgP,EAAEhP,GAAG,GAAGA,EAAE,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAEgP,EAAEhP,GAAGgP,EAAEhP,EAAE,GAAGgP,EAAEhP,EAAE,GAAGgP,EAAEhP,EAAE,GAAGgP,EAAEhP,EAAE,GAAG,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAEq2C,EAAErnC,EAAEhP,IAAIA,EAAE,MAAM,CAACu7E,EAAE,SAASjlC,GAAG,GAAG,EAAEA,EAAE,MAAMl9C,MAAM,QAAQk9C,EAAE,KAAK,OAAOD,EAAEC,IAAIt5C,EAAE,SAASs5C,GAAG,KAAK,EAAEA,GAAGA,GAAG,IAAI,KAAK,KAAKA,GAAGA,GAAG,IAAI,OAAOtnC,EAAEsnC,KAArR,GAA6R94C,EAAE,WAAW,SAASwR,EAAEsnC,EAAEtnC,GAAG,OAAOA,GAAG,KAAKogF,EAAEW,EAAE,OAAO15C,EAAE,GAC3gBC,EAAE,IAAI,KAAK84C,EAAEY,EAAE,OAAO35C,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAK84C,EAAEa,EAAE,OAAO55C,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAK84C,EAAE/B,EAAE,OAAOh3C,EAAE,GAAGC,EAAE,GAAG,IAAI,IAAID,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAClf,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,CAAC,EAAE,GACnf,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EACrf,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,IAAI,KAChf,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAClf,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IA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","sources":["webpack://telegram-t/webpack/runtime/create fake namespace object","webpack://telegram-t/webpack/runtime/load script","webpack://telegram-t/webpack/runtime/css loading","webpack://telegram-t/./src/api/gramjs/worker/provider.ts","webpack://telegram-t/./src/api/types/media.ts","webpack://telegram-t/./src/api/types/messages.ts","webpack://telegram-t/./src/lib/punycode.js","webpack://telegram-t/./src/components/common/SafeLink.tsx","webpack://telegram-t/./src/components/common/helpers/documentInfo.ts","webpack://telegram-t/./src/components/common/helpers/parseEmojiOnlyString.ts","webpack://telegram-t/./src/components/common/UserLink.tsx","webpack://telegram-t/./src/components/common/MessageLink.tsx","webpack://telegram-t/./src/components/common/ChatLink.tsx","webpack://telegram-t/./src/components/common/GroupCallLink.tsx","webpack://telegram-t/./src/components/common/helpers/renderActionMessageText.tsx","webpack://telegram-t/./src/components/common/helpers/renderMessageText.ts","webpack://telegram-t/./src/components/common/helpers/renderText.tsx","webpack://telegram-t/./src/components/common/spoiler/Spoiler.tsx","webpack://telegram-t/./src/components/common/helpers/renderTextWithEntities.tsx","webpack://telegram-t/./src/components/middle/helpers/preventMessageInputBlur.ts","webpack://telegram-t/./src/components/middle/message/MentionLink.tsx","webpack://telegram-t/./src/components/ui/Button.tsx","webpack://telegram-t/./src/components/ui/Checkbox.tsx","webpack://telegram-t/./src/components/ui/DropdownMenu.tsx","webpack://telegram-t/./src/components/ui/InputText.tsx","webpack://telegram-t/./src/components/ui/Link.tsx","webpack://telegram-t/./src/components/ui/Loading.tsx","webpack://telegram-t/./src/components/ui/Menu.tsx","webpack://telegram-t/./src/components/ui/MenuItem.tsx","webpack://telegram-t/./src/components/ui/RippleEffect.tsx","webpack://telegram-t/./src/components/ui/Spinner.tsx","webpack://telegram-t/./src/config.ts","webpack://telegram-t/./src/hooks/useEffectWithPrevDeps.ts","webpack://telegram-t/./src/hooks/useFlag.ts","webpack://telegram-t/./src/hooks/useForceUpdate.ts","webpack://telegram-t/./src/hooks/useHeavyAnimationCheck.ts","webpack://telegram-t/./src/hooks/useHistoryBack.ts","webpack://telegram-t/./src/hooks/useKeyboardListNavigation.ts","webpack://telegram-t/./src/hooks/useLang.ts","webpack://telegram-t/./src/hooks/useModuleLoader.ts","webpack://telegram-t/./src/hooks/useOnChange.ts","webpack://telegram-t/./src/hooks/usePrevious.ts","webpack://telegram-t/./src/hooks/useShowTransition.ts","webpack://telegram-t/./src/hooks/useVirtualBackdrop.ts","webpack://telegram-t/./src/lib/teact/dom-events.ts","webpack://telegram-t/./src/lib/teact/teact-dom.ts","webpack://telegram-t/./src/lib/teact/teact.ts","webpack://telegram-t/./src/lib/teact/teactn.tsx","webpack://telegram-t/./src/lib/twemojiRegex.js","webpack://telegram-t/./src/modules/actions/api/initial.ts","webpack://telegram-t/./src/modules/actions/api/settings.ts","webpack://telegram-t/./src/modules/actions/apiUpdaters/initial.ts","webpack://telegram-t/./src/modules/actions/ui/initial.ts","webpack://telegram-t/./src/modules/actions/ui/settings.ts","webpack://telegram-t/./src/modules/helpers/chats.ts","webpack://telegram-t/./src/modules/helpers/messages.ts","webpack://telegram-t/./src/modules/helpers/messageSummary.ts","webpack://telegram-t/./src/modules/helpers/messageMedia.ts","webpack://telegram-t/./src/modules/helpers/localSearch.ts","webpack://telegram-t/./src/modules/helpers/payments.ts","webpack://telegram-t/./src/modules/helpers/users.ts","webpack://telegram-t/./src/modules/reducers/chats.ts","webpack://telegram-t/./src/modules/reducers/symbols.ts","webpack://telegram-t/./src/modules/reducers/users.ts","webpack://telegram-t/./src/modules/reducers/globalSearch.ts","webpack://telegram-t/./src/modules/reducers/localSearch.ts","webpack://telegram-t/./src/modules/reducers/management.ts","webpack://telegram-t/./src/modules/reducers/settings.ts","webpack://telegram-t/./src/modules/reducers/twoFaSettings.ts","webpack://telegram-t/./src/modules/reducers/payments.ts","webpack://telegram-t/./src/modules/reducers/messages.ts","webpack://telegram-t/./src/modules/selectors/chats.ts","webpack://telegram-t/./src/modules/selectors/symbols.ts","webpack://telegram-t/./src/modules/selectors/messages.ts","webpack://telegram-t/./src/modules/selectors/localSearch.ts","webpack://telegram-t/./src/modules/selectors/management.ts","webpack://telegram-t/./src/modules/selectors/ui.ts","webpack://telegram-t/./src/modules/selectors/globalSearch.ts","webpack://telegram-t/./src/modules/selectors/payments.ts","webpack://telegram-t/./src/modules/selectors/settings.ts","webpack://telegram-t/./src/modules/selectors/users.ts","webpack://telegram-t/./src/types/index.ts","webpack://telegram-t/./src/util/animation.ts","webpack://telegram-t/./src/util/appBadge.ts","webpack://telegram-t/./src/util/arePropsShallowEqual.ts","webpack://telegram-t/./src/util/buildClassName.ts","webpack://telegram-t/./src/util/cacheApi.ts","webpack://telegram-t/./src/util/callbacks.ts","webpack://telegram-t/./src/util/captureEscKeyListener.ts","webpack://telegram-t/./src/util/captureKeyboardListeners.ts","webpack://telegram-t/./src/util/dateFormat.ts","webpack://telegram-t/./src/util/emoji.ts","webpack://telegram-t/./src/util/ensureProtocol.ts","webpack://telegram-t/./src/util/environmentWebp.ts","webpack://telegram-t/./src/util/environmentSystemTheme.ts","webpack://telegram-t/./src/util/environment.ts","webpack://telegram-t/./src/util/files.ts","webpack://telegram-t/./src/util/folderManager.ts","webpack://telegram-t/./src/util/formatCurrency.ts","webpack://telegram-t/./src/util/generateIdFor.ts","webpack://telegram-t/./src/util/getReadableErrorText.ts","webpack://telegram-t/./src/util/handleError.ts","webpack://telegram-t/./src/util/iteratees.ts","webpack://telegram-t/./src/util/langProvider.ts","webpack://telegram-t/./src/util/oggToWav.ts","webpack://telegram-t/./src/util/mediaLoader.ts","webpack://telegram-t/./src/util/memo.ts","webpack://telegram-t/./src/util/moduleLoader.ts","webpack://telegram-t/./src/util/notifications.ts","webpack://telegram-t/./src/util/permanentWebVersion.ts","webpack://telegram-t/./src/util/phoneNumber.ts","webpack://telegram-t/./src/util/routing.ts","webpack://telegram-t/./src/util/schedulers.ts","webpack://telegram-t/./src/util/searchWords.ts","webpack://telegram-t/./src/util/serverTime.ts","webpack://telegram-t/./node_modules/idb-keyval/dist/index.js","webpack://telegram-t/./node_modules/safari-14-idb-fix/dist/index.js","webpack://telegram-t/./src/util/sessions.ts","webpack://telegram-t/./src/util/switchTheme.ts","webpack://telegram-t/./src/util/textFormat.ts","webpack://telegram-t/./src/util/trimText.ts","webpack://telegram-t/./src/util/webpToPng.ts","webpack://telegram-t/./src/util/websync.ts","webpack://telegram-t/./src/util/windowSize.ts","webpack://telegram-t/webpack/bootstrap","webpack://telegram-t/webpack/runtime/compat get default export","webpack://telegram-t/webpack/runtime/define property getters","webpack://telegram-t/webpack/runtime/ensure chunk","webpack://telegram-t/webpack/runtime/get javascript chunk filename","webpack://telegram-t/webpack/runtime/get mini-css chunk filename","webpack://telegram-t/webpack/runtime/global","webpack://telegram-t/webpack/runtime/hasOwnProperty shorthand","webpack://telegram-t/webpack/runtime/make namespace object","webpack://telegram-t/webpack/runtime/publicPath","webpack://telegram-t/webpack/runtime/jsonp chunk loading","webpack://telegram-t/./src/util/setupServiceWorker.ts","webpack://telegram-t/./src/global/initial.ts","webpack://telegram-t/./src/global/cache.ts","webpack://telegram-t/./src/global/index.ts","webpack://telegram-t/./src/util/activeTabMonitor.ts","webpack://telegram-t/./src/util/fonts.ts","webpack://telegram-t/./src/components/common/UiLoader.tsx","webpack://telegram-t/./src/hooks/useLangString.ts","webpack://telegram-t/./src/components/auth/helpers/getSuggestedLanguage.ts","webpack://telegram-t/./src/components/auth/CountryCodeInput.tsx","webpack://telegram-t/./src/components/auth/AuthPhoneNumber.tsx","webpack://telegram-t/./src/components/auth/AuthCode.async.tsx","webpack://telegram-t/./src/components/auth/AuthPassword.async.tsx","webpack://telegram-t/./src/components/auth/AuthRegister.async.tsx","webpack://telegram-t/./node_modules/qr-creator/dist/qr-creator.es6.min.js","webpack://telegram-t/./src/components/auth/AuthQrCode.tsx","webpack://telegram-t/./src/components/auth/Auth.tsx","webpack://telegram-t/./src/components/main/Main.async.tsx","webpack://telegram-t/./src/components/main/AppInactive.tsx","webpack://telegram-t/./src/App.tsx","webpack://telegram-t/./src/index.tsx"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"telegram-t:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\t;\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = (chunkId, fullhref, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"47\":1,\"126\":1,\"133\":1,\"472\":1,\"538\":1,\"640\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","import { Api } from '../../../lib/gramjs';\nimport { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, OriginRequest } from './types';\n\nimport { DEBUG } from '../../../config';\nimport generateIdFor from '../../../util/generateIdFor';\nimport { pause } from '../../../util/schedulers';\n\ntype RequestStates = {\n messageId: string;\n resolve: Function;\n reject: Function;\n callback?: AnyToVoidFunction;\n};\n\nconst HEALTH_CHECK_TIMEOUT = 150;\nconst HEALTH_CHECK_MIN_DELAY = 5 * 1000; // 5 sec\n\nlet worker: Worker;\nconst requestStates = new Map<string, RequestStates>();\nconst requestStatesByCallback = new Map<AnyToVoidFunction, RequestStates>();\n\n// TODO Re-use `util/WorkerConnector.ts`\n\nexport function initApi(onUpdate: OnApiUpdate, initialArgs: ApiInitialArgs) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD WORKER');\n }\n\n worker = new Worker(new URL('./worker.ts', import.meta.url));\n subscribeToWorker(onUpdate);\n\n if (initialArgs.platform === 'iOS') {\n setupIosHealthCheck();\n }\n }\n\n return makeRequest({\n type: 'initApi',\n args: [initialArgs],\n });\n}\n\nexport function callApi<T extends keyof Methods>(fnName: T, ...args: MethodArgs<T>) {\n if (!worker) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('API is not initialized');\n }\n\n return undefined;\n }\n\n const promise = makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n });\n\n // Some TypeScript magic to make sure `VirtualClass` is never returned from any method\n if (DEBUG) {\n (async () => {\n try {\n type ForbiddenTypes =\n Api.VirtualClass<any>\n | (Api.VirtualClass<any> | undefined)[];\n type ForbiddenResponses =\n ForbiddenTypes\n | (AnyLiteral & { [k: string]: ForbiddenTypes });\n\n // Unwrap all chained promises\n const response = await promise;\n // Make sure responses do not include `VirtualClass` instances\n const allowedResponse: Exclude<typeof response, ForbiddenResponses> = response;\n // Suppress \"unused variable\" constraint\n void allowedResponse;\n } catch (err) {\n // Do noting\n }\n })();\n }\n\n return promise as MethodResponse<T>;\n}\n\nexport function cancelApiProgress(progressCallback: ApiOnProgress) {\n progressCallback.isCanceled = true;\n\n const { messageId } = requestStatesByCallback.get(progressCallback) || {};\n if (!messageId) {\n return;\n }\n\n worker.postMessage({\n type: 'cancelProgress',\n messageId,\n });\n}\n\nfunction subscribeToWorker(onUpdate: OnApiUpdate) {\n worker.addEventListener('message', ({ data }: WorkerMessageEvent) => {\n if (data.type === 'update') {\n onUpdate(data.update);\n } else if (data.type === 'methodResponse') {\n const requestState = requestStates.get(data.messageId);\n if (requestState) {\n if (data.error) {\n requestState.reject(data.error);\n } else {\n requestState.resolve(data.response);\n }\n }\n } else if (data.type === 'methodCallback') {\n requestStates.get(data.messageId)?.callback?.(...data.callbackArgs);\n } else if (data.type === 'unhandledError') {\n throw new Error(data.error?.message);\n }\n });\n}\n\nfunction makeRequest(message: OriginRequest) {\n const messageId = generateIdFor(requestStates);\n const payload: OriginRequest = {\n messageId,\n ...message,\n };\n\n const requestState = { messageId } as RequestStates;\n\n // Re-wrap type because of `postMessage`\n const promise: Promise<MethodResponse<keyof Methods>> = new Promise((resolve, reject) => {\n Object.assign(requestState, { resolve, reject });\n });\n\n if (('args' in payload) && typeof payload.args[1] === 'function') {\n const callback = payload.args.pop() as AnyToVoidFunction;\n requestState.callback = callback;\n requestStatesByCallback.set(callback, requestState);\n }\n\n requestStates.set(messageId, requestState);\n\n promise\n .catch(() => undefined)\n .finally(() => {\n requestStates.delete(messageId);\n\n if (requestState.callback) {\n requestStatesByCallback.delete(requestState.callback);\n }\n });\n\n worker.postMessage(payload);\n\n return promise;\n}\n\nconst startedAt = Date.now();\n\n// Workaround for iOS sometimes stops interacting with worker\nfunction setupIosHealthCheck() {\n window.addEventListener('focus', () => {\n void ensureWorkerPing();\n // Sometimes a single check is not enough\n setTimeout(() => ensureWorkerPing(), 1000);\n });\n}\n\nasync function ensureWorkerPing() {\n try {\n await Promise.race([\n makeRequest({ type: 'ping' }),\n pause(HEALTH_CHECK_TIMEOUT).then(() => Promise.reject(new Error('HEALTH_CHECK_TIMEOUT'))),\n ]);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (Date.now() - startedAt >= HEALTH_CHECK_MIN_DELAY) {\n window.location.reload();\n }\n }\n}\n","// We cache avatars as Data URI for faster initial load\n// and messages media as Blob for smaller size.\n\nexport enum ApiMediaFormat {\n BlobUrl,\n Lottie,\n Progressive,\n Stream,\n}\n\nexport type ApiParsedMedia = string | Blob | ArrayBuffer;\nexport type ApiPreparedMedia = string;\n","import { ApiGroupCall } from './calls';\n\nexport interface ApiDimensions {\n width: number;\n height: number;\n}\n\nexport interface ApiPhotoSize extends ApiDimensions {\n type: 's' | 'm' | 'x' | 'y' | 'z';\n}\n\nexport interface ApiThumbnail extends ApiDimensions {\n dataUri: string;\n}\n\nexport interface ApiPhoto {\n id: string;\n thumbnail?: ApiThumbnail;\n sizes: ApiPhotoSize[];\n blobUrl?: string;\n}\n\nexport interface ApiSticker {\n id: string;\n stickerSetId: string;\n stickerSetAccessHash?: string;\n emoji?: string;\n isLottie: boolean;\n isGif: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isLottie?: true;\n isGifs?: true;\n installedDate?: number;\n id: string;\n accessHash: string;\n title: string;\n hasThumbnail?: boolean;\n count: number;\n stickers?: ApiSticker[];\n packs?: Record<string, ApiSticker[]>;\n covers?: ApiSticker[];\n shortName: string;\n}\n\nexport interface ApiVideo {\n id: string;\n mimeType: string;\n duration: number;\n fileName: string;\n width?: number;\n height?: number;\n supportsStreaming?: boolean;\n isRound?: boolean;\n isGif?: boolean;\n thumbnail?: ApiThumbnail;\n blobUrl?: string;\n size: number;\n}\n\nexport interface ApiAudio {\n id: string;\n size: number;\n mimeType: string;\n fileName: string;\n duration: number;\n performer?: string;\n title?: string;\n thumbnailSizes?: ApiPhotoSize[];\n}\n\nexport interface ApiVoice {\n id: string;\n duration: number;\n waveform?: number[];\n}\n\nexport interface ApiDocument {\n id?: string;\n fileName: string;\n size: number;\n timestamp?: number;\n mimeType: string;\n thumbnail?: ApiThumbnail;\n previewBlobUrl?: string;\n mediaType?: 'photo' | 'video';\n mediaSize?: ApiDimensions;\n}\n\nexport interface ApiContact {\n firstName: string;\n lastName: string;\n phoneNumber: string;\n userId: string;\n}\n\nexport interface ApiPollAnswer {\n text: string;\n option: string;\n}\n\nexport interface ApiPollResult {\n isChosen?: true;\n isCorrect?: true;\n option: string;\n votersCount: number;\n}\n\nexport interface ApiPoll {\n id: string;\n summary: {\n closed?: true;\n isPublic?: true;\n multipleChoice?: true;\n quiz?: true;\n question: string;\n answers: ApiPollAnswer[];\n closePeriod?: number;\n closeDate?: number;\n };\n results: {\n results?: ApiPollResult[];\n totalVoters?: number;\n recentVoterIds?: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n}\n\nexport interface ApiInvoice {\n text: string;\n title: string;\n photoUrl?: string;\n amount: number;\n currency: string;\n receiptMsgId?: number;\n isTest?: boolean;\n}\n\nexport type ApiNewPoll = {\n summary: ApiPoll['summary'];\n quiz?: {\n correctAnswers: string[];\n solution?: string;\n solutionEntities?: ApiMessageEntity[];\n };\n};\n\nexport interface ApiAction {\n text: string;\n targetUserIds?: string[];\n targetChatId?: string;\n type: 'historyClear' | 'contactSignUp' | 'chatCreate' | 'other';\n photo?: ApiPhoto;\n amount?: number;\n currency?: string;\n translationValues: string[];\n call?: Partial<ApiGroupCall>;\n}\n\nexport interface ApiWebPage {\n id: number;\n url: string;\n displayUrl: string;\n type?: string;\n siteName?: string;\n title?: string;\n description?: string;\n photo?: ApiPhoto;\n duration?: number;\n document?: ApiDocument;\n video?: ApiVideo;\n}\n\nexport interface ApiMessageForwardInfo {\n date: number;\n isChannelPost: boolean;\n channelPostId?: number;\n isLinkedChannelPost?: boolean;\n fromChatId?: string;\n senderUserId?: string;\n fromMessageId?: number;\n hiddenUserName?: string;\n adminTitle?: string;\n}\n\nexport interface ApiMessageEntity {\n type: string;\n offset: number;\n length: number;\n userId?: string;\n url?: string;\n}\n\nexport enum ApiMessageEntityTypes {\n Bold = 'MessageEntityBold',\n Blockquote = 'MessageEntityBlockquote',\n BotCommand = 'MessageEntityBotCommand',\n Cashtag = 'MessageEntityCashtag',\n Code = 'MessageEntityCode',\n Email = 'MessageEntityEmail',\n Hashtag = 'MessageEntityHashtag',\n Italic = 'MessageEntityItalic',\n MentionName = 'MessageEntityMentionName',\n Mention = 'MessageEntityMention',\n Phone = 'MessageEntityPhone',\n Pre = 'MessageEntityPre',\n Strike = 'MessageEntityStrike',\n TextUrl = 'MessageEntityTextUrl',\n Url = 'MessageEntityUrl',\n Underline = 'MessageEntityUnderline',\n Spoiler = 'MessageEntitySpoiler',\n Unknown = 'MessageEntityUnknown',\n}\n\nexport interface ApiFormattedText {\n text: string;\n entities?: ApiMessageEntity[];\n}\n\nexport interface ApiMessage {\n id: number;\n chatId: string;\n content: {\n text?: ApiFormattedText;\n photo?: ApiPhoto;\n video?: ApiVideo;\n document?: ApiDocument;\n sticker?: ApiSticker;\n contact?: ApiContact;\n poll?: ApiPoll;\n action?: ApiAction;\n webPage?: ApiWebPage;\n audio?: ApiAudio;\n voice?: ApiVoice;\n invoice?: ApiInvoice;\n };\n date: number;\n isOutgoing: boolean;\n senderId?: string;\n replyToChatId?: string;\n replyToMessageId?: number;\n replyToTopMessageId?: number;\n sendingState?: 'messageSendingStatePending' | 'messageSendingStateFailed';\n forwardInfo?: ApiMessageForwardInfo;\n isDeleting?: boolean;\n previousLocalId?: number;\n views?: number;\n isEdited?: boolean;\n editDate?: number;\n isMentioned?: boolean;\n isMediaUnread?: boolean;\n groupedId?: string;\n isInAlbum?: boolean;\n hasUnreadMention?: boolean;\n inlineButtons?: ApiKeyboardButtons;\n keyboardButtons?: ApiKeyboardButtons;\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n viaBotId?: string;\n threadInfo?: ApiThreadInfo;\n adminTitle?: string;\n isScheduled?: boolean;\n shouldHideKeyboardButtons?: boolean;\n isFromScheduled?: boolean;\n seenByUserIds?: string[];\n isProtected?: boolean;\n reactors?: {\n nextOffset?: string;\n count: number;\n reactions: ApiUserReaction[];\n };\n reactions?: ApiReactions;\n}\n\nexport interface ApiReactions {\n canSeeList?: boolean;\n results: ApiReactionCount[];\n recentReactions?: ApiUserReaction[];\n}\n\nexport interface ApiUserReaction {\n userId: string;\n reaction: string;\n}\n\nexport interface ApiReactionCount {\n isChosen?: boolean;\n count: number;\n reaction: string;\n}\n\nexport interface ApiAvailableReaction {\n selectAnimation?: ApiDocument;\n staticIcon?: ApiDocument;\n centerIcon?: ApiDocument;\n aroundAnimation?: ApiDocument;\n reaction: string;\n title: string;\n isInactive?: boolean;\n}\n\nexport interface ApiThreadInfo {\n threadId: number;\n chatId: string;\n topMessageId?: number;\n originChannelId?: string;\n messagesCount: number;\n lastMessageId?: number;\n lastReadInboxMessageId?: number;\n recentReplierIds?: string[];\n}\n\nexport type ApiMessageOutgoingStatus = 'read' | 'succeeded' | 'pending' | 'failed';\n\nexport type ApiSponsoredMessage = {\n chatId?: string;\n randomId: string;\n isBot?: boolean;\n channelPostId?: number;\n startParam?: string;\n chatInviteHash?: string;\n chatInviteTitle?: string;\n text: ApiFormattedText;\n expiresAt: number;\n};\n\nexport interface ApiKeyboardButton {\n type: 'command' | 'url' | 'callback' | 'requestPoll' | 'requestSelfContact' | 'buy' | 'NOT_SUPPORTED';\n text: string;\n messageId: number;\n value?: string;\n}\n\nexport type ApiKeyboardButtons = ApiKeyboardButton[][];\nexport type ApiReplyKeyboard = {\n keyboardPlaceholder?: string;\n isKeyboardSingleUse?: boolean;\n} & {\n [K in 'inlineButtons' | 'keyboardButtons']?: ApiKeyboardButtons;\n};\n\nexport type ApiMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice' | 'profilePhoto';\nexport type ApiGlobalMessageSearchType = 'text' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\n\nexport type ApiReportReason = 'spam' | 'violence' | 'pornography' | 'childAbuse'\n| 'copyright' | 'geoIrrelevant' | 'fake' | 'other';\n\nexport type ApiSendMessageAction = {\n type: 'cancel' | 'typing' | 'recordAudio' | 'chooseSticker';\n};\n\nexport const MAIN_THREAD_ID = -1;\n\n// `Symbol` can not be transferred from worker\nexport const MESSAGE_DELETED = 'MESSAGE_DELETED';\n","/* eslint-disable no-nested-ternary */\n/* eslint-disable no-bitwise */\n\nconst utf16 = {\n // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.\n decode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n let extra;\n\n while (i < len) {\n value = input.charCodeAt(i++);\n if ((value & 0xf800) === 0xd800) {\n extra = input.charCodeAt(i++);\n if ((value & 0xfc00) !== 0xd800 || (extra & 0xfc00) !== 0xdc00) {\n throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');\n }\n value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;\n }\n output.push(value);\n }\n return output;\n },\n encode: (input) => {\n const output = [];\n let i = 0;\n const len = input.length;\n let value;\n\n while (i < len) {\n value = input[i++];\n if ((value & 0xf800) === 0xd800) {\n throw new RangeError('UTF-16(encode): Illegal UTF-16 value');\n }\n if (value > 0xffff) {\n value -= 0x10000;\n output.push(String.fromCharCode(((value >>> 10) & 0x3ff) | 0xd800));\n value = 0xdc00 | (value & 0x3ff);\n }\n output.push(String.fromCharCode(value));\n }\n return output.join('');\n },\n};\n\n// Default parameters\nconst initial_n = 0x80;\nconst initial_bias = 72;\nconst delimiter = '\\x2D';\nconst base = 36;\nconst damp = 700;\nconst tmin = 1;\nconst tmax = 26;\nconst skew = 38;\nconst maxint = 0x7fffffff;\n\n// decode_digit(cp) returns the numeric value of a basic code\n// point (for use in representing integers) in the range 0 to\n// base-1, or base if cp is does not represent a value.\n\nfunction decode_digit(cp) {\n return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;\n}\n\n// ** Bias adaptation function **\nfunction adapt(delta, numpoints, firsttime) {\n let k;\n delta = firsttime ? Math.floor(delta / damp) : delta >> 1;\n delta += Math.floor(delta / numpoints);\n\n for (k = 0; delta > ((base - tmin) * tmax) >> 1; k += base) {\n delta = Math.floor(delta / (base - tmin));\n }\n return Math.floor(k + ((base - tmin + 1) * delta) / (delta + skew));\n}\n\n// Main decode\nfunction decode(input, preserveCase) {\n // Dont use utf16\n const output = [];\n const case_flags = [];\n const input_length = input.length;\n\n let n; let out; let i; let bias; let basic; let j; let ic; let oldi; let w; let k; let digit; let t; let len;\n\n // Initialize the state:\n\n n = initial_n;\n i = 0;\n bias = initial_bias;\n\n // Handle the basic code points: Let basic be the number of input code\n // points before the last delimiter, or 0 if there is none, then\n // copy the first basic code points to the output.\n\n basic = input.lastIndexOf(delimiter);\n if (basic < 0) basic = 0;\n\n for (j = 0; j < basic; ++j) {\n if (preserveCase) case_flags[output.length] = input.charCodeAt(j) - 65 < 26;\n if (input.charCodeAt(j) >= 0x80) {\n throw new RangeError('Illegal input >= 0x80');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: Start just after the last delimiter if any\n // basic code points were copied; start at the beginning otherwise.\n\n for (ic = basic > 0 ? basic + 1 : 0; ic < input_length;) {\n // ic is the index of the next character to be consumed,\n\n // Decode a generalized variable-length integer into delta,\n // which gets added to i. The overflow checking is easier\n // if we increase i as we go, then subtract off its starting\n // value at the end to obtain delta.\n for (oldi = i, w = 1, k = base; ; k += base) {\n if (ic >= input_length) {\n throw RangeError('punycode_bad_input(1)');\n }\n digit = decode_digit(input.charCodeAt(ic++));\n\n if (digit >= base) {\n throw RangeError('punycode_bad_input(2)');\n }\n if (digit > Math.floor((maxint - i) / w)) {\n throw RangeError('punycode_overflow(1)');\n }\n i += digit * w;\n t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;\n if (digit < t) {\n break;\n }\n if (w > Math.floor(maxint / (base - t))) {\n throw RangeError('punycode_overflow(2)');\n }\n w *= base - t;\n }\n\n out = output.length + 1;\n bias = adapt(i - oldi, out, oldi === 0);\n\n // i was supposed to wrap around from out to 0,\n // incrementing n each time, so we'll fix that now:\n if (Math.floor(i / out) > maxint - n) {\n throw RangeError('punycode_overflow(3)');\n }\n n += Math.floor(i / out);\n i %= out;\n\n // Insert n at position i of the output:\n // Case of last character determines uppercase flag:\n if (preserveCase) {\n case_flags.splice(i, 0, input.charCodeAt(ic - 1) - 65 < 26);\n }\n\n output.splice(i, 0, n);\n i++;\n }\n if (preserveCase) {\n for (i = 0, len = output.length; i < len; i++) {\n if (case_flags[i]) {\n output[i] = String.fromCharCode(output[i])\n .toUpperCase()\n .charCodeAt(0);\n }\n }\n }\n return utf16.encode(output);\n}\n\nfunction toUnicode(domain) {\n const domain_array = domain.split('.');\n const out = [];\n for (let i = 0; i < domain_array.length; ++i) {\n const s = domain_array[i];\n out.push(s.match(/^xn--/) ? decode(s.slice(4)) : s);\n }\n return out.join('.');\n}\n\nexport default toUnicode;\n","import React, { FC, memo, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\nimport convertPunycode from '../../lib/punycode';\n\nimport {\n DEBUG, RE_TG_LINK, RE_TME_LINK,\n} from '../../config';\nimport buildClassName from '../../util/buildClassName';\nimport { ensureProtocol } from '../../util/ensureProtocol';\n\ntype OwnProps = {\n url?: string;\n text: string;\n className?: string;\n children?: any;\n isRtl?: boolean;\n};\n\nconst SafeLink: FC<OwnProps> = ({\n url,\n text,\n className,\n children,\n isRtl,\n}) => {\n const { toggleSafeLinkModal, openTelegramLink } = getDispatch();\n\n const content = children || text;\n const isNotSafe = url !== content;\n\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {\n if (\n e.ctrlKey || e.altKey || e.shiftKey || e.metaKey\n || !url || (!url.match(RE_TME_LINK) && !url.match(RE_TG_LINK))\n ) {\n if (isNotSafe) {\n toggleSafeLinkModal({ url });\n\n e.preventDefault();\n return false;\n }\n\n return true;\n }\n\n e.preventDefault();\n openTelegramLink({ url });\n\n return false;\n }, [isNotSafe, openTelegramLink, toggleSafeLinkModal, url]);\n\n if (!url) {\n return undefined;\n }\n\n const classNames = buildClassName(\n className || 'text-entity-link',\n text.length > 50 && 'long-word-break-all',\n );\n\n return (\n <a\n href={ensureProtocol(url)}\n title={getDomain(url)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classNames}\n onClick={handleClick}\n dir={isRtl ? 'rtl' : 'auto'}\n >\n {content}\n </a>\n );\n};\n\nfunction getDomain(url?: string) {\n if (!url) {\n return undefined;\n }\n\n const href = ensureProtocol(url);\n if (!href) {\n return undefined;\n }\n\n try {\n let decodedHref = decodeURI(href);\n\n const match = decodedHref.match(/^https?:\\/\\/([^/:?#]+)(?:[/:?#]|$)/i);\n if (!match) {\n return undefined;\n }\n const domain = match[1];\n decodedHref = decodedHref.replace(domain, convertPunycode(domain));\n\n return decodedHref;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('SafeLink.getDecodedUrl error ', url, error);\n }\n }\n\n return undefined;\n}\n\nexport default memo(SafeLink);\n","import { ApiDocument } from '../../../api/types';\n\nconst ONE_GIGABYTE = 1024 * 1024 * 1024;\nconst ONE_MEGABYTE = 1024 * 1024;\n\nexport function getFileSizeString(bytes: number) {\n if (bytes > (ONE_GIGABYTE / 2)) {\n return `${(bytes / ONE_GIGABYTE).toFixed(1)} GB`;\n }\n if (bytes > (ONE_MEGABYTE / 2)) {\n return `${(bytes / ONE_MEGABYTE).toFixed(1)} MB`;\n }\n return `${(bytes / (1024)).toFixed(1)} KB`;\n}\n\nexport function getDocumentExtension(document: ApiDocument) {\n const { fileName, mimeType } = document;\n\n return getFileExtension(fileName, mimeType);\n}\n\nexport function getFileExtension(fileName: string, mimeType: string) {\n if (fileName && fileName.indexOf('.') !== -1) {\n return fileName.split('.').pop();\n } else {\n return mimeType.split('/').pop();\n }\n}\n\nexport function getColorFromExtension(extension: string) {\n switch (extension) {\n case 'apk':\n case 'xls':\n case 'xlsx':\n return 'green';\n case 'zip':\n case 'rar':\n case '7z':\n case 'tar':\n case 'gz':\n case 'ppt':\n case 'pptx':\n return 'orange';\n case 'pdf':\n case 'xps':\n return 'red';\n default:\n return 'default';\n }\n}\n\nexport function getDocumentHasPreview(document: ApiDocument) {\n return Boolean(document.previewBlobUrl || document.thumbnail);\n}\n","import twemojiRegex from '../../../lib/twemojiRegex';\n\nconst DETECT_UP_TO = 3;\nconst MAX_LENGTH = DETECT_UP_TO * 8; // Maximum 8 per one emoji.\nconst RE_EMOJI_ONLY = new RegExp(`^(?:${twemojiRegex.source})+$`, '');\n\nconst parseEmojiOnlyString = (text: string): number | false => {\n if (text.length > MAX_LENGTH) {\n return false;\n }\n\n const isEmojiOnly = Boolean(text.match(RE_EMOJI_ONLY));\n if (!isEmojiOnly) {\n return false;\n }\n\n let emojiCount = 0;\n while (twemojiRegex.exec(text)) {\n emojiCount++;\n\n if (emojiCount > DETECT_UP_TO) {\n twemojiRegex.lastIndex = 0;\n return false;\n }\n }\n\n return emojiCount;\n};\n\nexport default parseEmojiOnlyString;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport { ApiChat, ApiUser } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ntype OwnProps = {\n className?: string;\n sender?: ApiUser | ApiChat;\n children: any;\n};\n\nconst UserLink: FC<OwnProps> = ({\n className, sender, children,\n}) => {\n const { openChat } = getDispatch();\n\n const handleClick = useCallback(() => {\n if (sender) {\n openChat({ id: sender.id });\n }\n }, [sender, openChat]);\n\n if (!sender) {\n return children;\n }\n\n return (\n <Link className={buildClassName('UserLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default UserLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport { ApiMessage } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n message?: ApiMessage;\n children: any;\n};\n\nconst MessageLink: FC<OwnProps> = ({\n className, message, children,\n}) => {\n const { focusMessage } = getDispatch();\n\n const handleMessageClick = useCallback((): void => {\n if (message) {\n focusMessage({ chatId: message.chatId, messageId: message.id });\n }\n }, [focusMessage, message]);\n\n if (!message) {\n return children;\n }\n\n return (\n <Link className={buildClassName('MessageLink', className)} onClick={handleMessageClick}>{children}</Link>\n );\n};\n\nexport default MessageLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\nimport { getDispatch } from '../../lib/teact/teactn';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\n\ntype OwnProps = {\n className?: string;\n chatId?: string;\n children: any;\n};\n\nconst ChatLink: FC<OwnProps> = ({\n className, chatId, children,\n}) => {\n const { openChat } = getDispatch();\n\n const handleClick = useCallback(() => {\n if (chatId) {\n openChat({ id: chatId });\n }\n }, [chatId, openChat]);\n\n if (!chatId) {\n return children;\n }\n\n return (\n <Link className={buildClassName('ChatLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default ChatLink;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport { ApiGroupCall } from '../../api/types';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Link from '../ui/Link';\nimport { getDispatch } from '../../lib/teact/teactn';\n\ntype OwnProps = {\n className?: string;\n groupCall?: Partial<ApiGroupCall>;\n children: any;\n};\n\nconst GroupCallLink: FC<OwnProps> = ({\n className, groupCall, children,\n}) => {\n const { joinGroupCall } = getDispatch();\n\n const handleClick = useCallback(() => {\n if (groupCall) {\n joinGroupCall({ id: groupCall.id, accessHash: groupCall.accessHash });\n }\n }, [groupCall, joinGroupCall]);\n\n if (!groupCall) {\n return children;\n }\n\n return (\n <Link className={buildClassName('GroupCallLink', className)} onClick={handleClick}>{children}</Link>\n );\n};\n\nexport default GroupCallLink;\n","import React from '../../../lib/teact/teact';\n\nimport {\n ApiChat, ApiMessage, ApiUser, ApiGroupCall,\n} from '../../../api/types';\nimport { LangFn } from '../../../hooks/useLang';\nimport {\n getChatTitle,\n getMessageSummaryText,\n getUserFullName,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { formatCurrency } from '../../../util/formatCurrency';\nimport { TextPart, renderMessageSummary } from './renderMessageText';\nimport renderText from './renderText';\n\nimport UserLink from '../UserLink';\nimport MessageLink from '../MessageLink';\nimport ChatLink from '../ChatLink';\nimport GroupCallLink from '../GroupCallLink';\n\ninterface RenderOptions {\n asPlainText?: boolean;\n asTextWithSpoilers?: boolean;\n}\n\nconst MAX_LENGTH = 32;\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOriginUser?: ApiUser,\n actionOriginChat?: ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: string,\n options: RenderOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n\n const {\n text, translationValues, amount, currency, call,\n } = message.content.action;\n const content: TextPart[] = [];\n const noLinks = options.asPlainText || options.asTextWithSpoilers;\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n\n let unprocessed = lang(translationKey, translationValues?.length ? translationValues : undefined);\n let processed: TextPart[];\n\n if (unprocessed.includes('%payment_amount%')) {\n processed = processPlaceholder(\n unprocessed,\n '%payment_amount%',\n formatCurrency(amount!, currency, lang.code),\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n }\n\n processed = processPlaceholder(\n unprocessed,\n '%action_origin%',\n actionOriginUser ? (\n renderUserContent(actionOriginUser, noLinks) || NBSP\n ) : actionOriginChat ? (\n renderChatContent(lang, actionOriginChat, noLinks) || NBSP\n ) : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_user%',\n targetUsers\n ? targetUsers.map((user) => renderUserContent(user, noLinks)).filter<TextPart>(Boolean as any)\n : 'User',\n );\n\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%message%',\n targetMessage\n ? renderMessageContent(lang, targetMessage, options)\n : 'a message',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%product%',\n targetMessage\n ? renderProductContent(targetMessage)\n : 'a product',\n );\n unprocessed = processed.pop() as string;\n content.push(...processed);\n\n processed = processPlaceholder(\n unprocessed,\n '%target_chat%',\n targetChatId\n ? renderMigratedContent(targetChatId, noLinks)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlainText) {\n return content.join('').trim();\n }\n\n if (call) {\n return renderGroupCallContent(call, content);\n }\n\n return content;\n}\n\nfunction renderProductContent(message: ApiMessage) {\n return message.content && message.content.invoice\n ? message.content.invoice.title\n : 'a product';\n}\n\nfunction renderMessageContent(lang: LangFn, message: ApiMessage, options: RenderOptions = {}) {\n const { asPlainText, asTextWithSpoilers } = options;\n\n if (asPlainText) {\n return getMessageSummaryText(lang, message, undefined, MAX_LENGTH);\n }\n\n const messageSummary = renderMessageSummary(lang, message, undefined, undefined, MAX_LENGTH);\n\n if (asTextWithSpoilers) {\n return (\n <span>{messageSummary}</span>\n );\n }\n\n return (\n <MessageLink className=\"action-link\" message={message}>{messageSummary}</MessageLink>\n );\n}\n\nfunction renderGroupCallContent(groupCall: Partial<ApiGroupCall>, text: TextPart[]): string | TextPart | undefined {\n return (\n <GroupCallLink groupCall={groupCall}>\n {text}\n </GroupCallLink>\n );\n}\n\nfunction renderUserContent(sender: ApiUser, noLinks?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender), MAX_LENGTH);\n\n if (noLinks) {\n return text;\n }\n\n return <UserLink className=\"action-link\" sender={sender}>{sender && renderText(text!)}</UserLink>;\n}\n\nfunction renderChatContent(lang: LangFn, chat: ApiChat, noLinks?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat), MAX_LENGTH);\n\n if (noLinks) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chat.id}>{chat && renderText(text!)}</ChatLink>;\n}\n\nfunction renderMigratedContent(chatId: string, noLinks?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (noLinks) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chatId}>{text}</ChatLink>;\n}\n\nfunction processPlaceholder(text: string, placeholder: string, replaceValue?: TextPart | TextPart[]): TextPart[] {\n const placeholderPosition = text.indexOf(placeholder);\n if (placeholderPosition < 0 || !replaceValue) {\n return [text];\n }\n\n const content: TextPart[] = [];\n content.push(text.substring(0, placeholderPosition));\n if (Array.isArray(replaceValue)) {\n replaceValue.forEach((value, index) => {\n content.push(value);\n if (index + 1 < replaceValue.length) {\n content.push(', ');\n }\n });\n } else {\n content.push(replaceValue);\n }\n content.push(text.substring(placeholderPosition + placeholder.length));\n\n return content;\n}\n","import { ApiMessage, ApiMessageEntityTypes } from '../../../api/types';\nimport {\n getMessageSummaryDescription,\n getMessageSummaryEmoji,\n getMessageSummaryText,\n getMessageText,\n TRUNCATED_SUMMARY_LENGTH,\n} from '../../../modules/helpers';\nimport { LangFn } from '../../../hooks/useLang';\nimport renderText from './renderText';\nimport { renderTextWithEntities, TextPart } from './renderTextWithEntities';\nimport trimText from '../../../util/trimText';\n\nexport type { TextPart };\n\nexport function renderMessageText(\n message: ApiMessage,\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n isSimple?: boolean,\n truncateLength?: number,\n) {\n const { text, entities } = message.content.text || {};\n\n if (!text) {\n const contentNotSupportedText = getMessageText(message);\n return contentNotSupportedText ? [trimText(contentNotSupportedText, truncateLength)] : undefined;\n }\n\n return renderTextWithEntities(\n trimText(text, truncateLength),\n entities,\n highlight,\n shouldRenderHqEmoji,\n undefined,\n message.id,\n isSimple,\n );\n}\n\nexport function renderMessageSummary(\n lang: LangFn,\n message: ApiMessage,\n noEmoji = false,\n highlight?: string,\n truncateLength = TRUNCATED_SUMMARY_LENGTH,\n): TextPart[] {\n let { entities } = message.content.text || {};\n\n const hasSpoilers = entities?.some((e) => e.type === ApiMessageEntityTypes.Spoiler);\n if (!hasSpoilers) {\n const text = trimText(getMessageSummaryText(lang, message, noEmoji), truncateLength);\n\n if (highlight) {\n return renderText(text, ['emoji', 'highlight'], { highlight });\n } else {\n return renderText(text);\n }\n }\n\n const emoji = !noEmoji && getMessageSummaryEmoji(message);\n const emojiWithSpace = emoji ? `${emoji} ` : '';\n\n const text = renderMessageText(message, highlight, undefined, true, truncateLength);\n const description = getMessageSummaryDescription(lang, message, text);\n\n return [\n emojiWithSpace,\n ...(Array.isArray(description) ? description : [description]),\n ].filter<TextPart>(Boolean);\n}\n","import React from '../../../lib/teact/teact';\nimport EMOJI_REGEX, { removeVS16s } from '../../../lib/twemojiRegex';\n\nimport { RE_LINK_TEMPLATE, RE_MENTION_TEMPLATE } from '../../../config';\nimport { IS_EMOJI_SUPPORTED } from '../../../util/environment';\nimport { fixNonStandardEmoji, nativeToUnified } from '../../../util/emoji';\nimport buildClassName from '../../../util/buildClassName';\nimport { compact } from '../../../util/iteratees';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\nexport type TextFilter = (\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n);\n\nconst RE_LETTER_OR_DIGIT = /^[\\d\\wа-яё]$/i;\nconst SIMPLE_MARKDOWN_REGEX = /(\\*\\*|__).+?\\1/g;\n\nexport default function renderText(\n part: TextPart,\n filters: Array<TextFilter> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return compact(filters.reduce((text, filter) => {\n switch (filter) {\n case 'escape_html':\n return escapeHtml(text);\n\n case 'hq_emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'big', 'jsx');\n\n case 'emoji':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'jsx');\n\n case 'emoji_html':\n EMOJI_REGEX.lastIndex = 0;\n return replaceEmojis(text, 'small', 'html');\n\n case 'br':\n return addLineBreaks(text, 'jsx');\n\n case 'br_html':\n return addLineBreaks(text, 'html');\n\n case 'highlight':\n return addHighlight(text, params!.highlight);\n\n case 'links':\n return addLinks(text);\n\n case 'simple_markdown':\n return replaceSimpleMarkdown(text, 'jsx');\n\n case 'simple_markdown_html':\n return replaceSimpleMarkdown(text, 'html');\n }\n\n return text;\n }, [part] as TextPart[]));\n}\n\nfunction escapeHtml(textParts: TextPart[]): TextPart[] {\n const divEl = document.createElement('div');\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n divEl.innerText = part;\n result.push(divEl.innerHTML);\n\n return result;\n }, [] as TextPart[]);\n}\n\nfunction replaceEmojis(textParts: TextPart[], size: 'big' | 'small', type: 'jsx' | 'html'): TextPart[] {\n if (IS_EMOJI_SUPPORTED) {\n return textParts;\n }\n\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n part = fixNonStandardEmoji(part);\n const parts = part.split(EMOJI_REGEX);\n const emojis = part.match(EMOJI_REGEX) || [];\n result.push(parts[0]);\n\n return emojis.reduce((emojiResult: TextPart[], emoji, i) => {\n const code = nativeToUnified(removeVS16s(emoji));\n if (!code) return emojiResult;\n const className = buildClassName(\n 'emoji',\n size === 'small' && 'emoji-small',\n );\n if (type === 'jsx') {\n emojiResult.push(\n <img\n className={className}\n src={`./img-apple-${size === 'big' ? '160' : '64'}/${code}.png`}\n alt={emoji}\n />,\n );\n }\n if (type === 'html') {\n emojiResult.push(\n // For preventing extra spaces in html\n // eslint-disable-next-line max-len\n `<img draggable=\"false\" class=\"${className}\" src=\"./img-apple-${size === 'big' ? '160' : '64'}/${code}.png\" alt=\"${emoji}\" />`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n emojiResult.push(parts[index]);\n }\n\n return emojiResult;\n }, result);\n }, [] as TextPart[]);\n}\n\nfunction addLineBreaks(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result: TextPart[], part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const splittenParts = part\n .split(/\\r\\n|\\r|\\n/g)\n .reduce((parts: TextPart[], line: string, i, source) => {\n // This adds non-breaking space if line was indented with spaces, to preserve the indentation\n const trimmedLine = line.trimLeft();\n const indentLength = line.length - trimmedLine.length;\n parts.push(String.fromCharCode(160).repeat(indentLength) + trimmedLine);\n\n if (i !== source.length - 1) {\n parts.push(\n type === 'jsx' ? <br /> : '<br />',\n );\n }\n\n return parts;\n }, []);\n\n return [...result, ...splittenParts];\n }, []);\n}\n\nfunction addHighlight(textParts: TextPart[], highlight: string | undefined): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string' || !highlight) {\n result.push(part);\n return result;\n }\n\n const lowerCaseText = part.toLowerCase();\n const queryPosition = lowerCaseText.indexOf(highlight.toLowerCase());\n const nextSymbol = lowerCaseText[queryPosition + highlight.length];\n if (queryPosition < 0 || (nextSymbol && nextSymbol.match(RE_LETTER_OR_DIGIT))) {\n result.push(part);\n return result;\n }\n\n const newParts: TextPart[] = [];\n newParts.push(part.substring(0, queryPosition));\n newParts.push(\n <span className=\"matching-text-highlight\">\n {part.substring(queryPosition, queryPosition + highlight.length)}\n </span>,\n );\n newParts.push(part.substring(queryPosition + highlight.length));\n\n return [...result, ...newParts];\n }, [] as TextPart[]);\n}\n\nconst RE_LINK = new RegExp(`${RE_LINK_TEMPLATE}|${RE_MENTION_TEMPLATE}`, 'ig');\n\nfunction addLinks(textParts: TextPart[]): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const links = part.match(RE_LINK);\n if (!links || !links.length) {\n result.push(part);\n return result;\n }\n\n const content: TextPart[] = [];\n\n let nextLink = links.shift();\n let lastIndex = 0;\n while (nextLink) {\n const index = part.indexOf(nextLink, lastIndex);\n content.push(part.substring(lastIndex, index));\n if (nextLink.startsWith('@')) {\n content.push(\n <MentionLink username={nextLink}>\n {nextLink}\n </MentionLink>,\n );\n } else {\n if (nextLink.endsWith('?')) {\n nextLink = nextLink.slice(0, nextLink.length - 1);\n }\n\n content.push(\n <SafeLink text={nextLink} url={nextLink} />,\n );\n }\n lastIndex = index + nextLink.length;\n nextLink = links.shift();\n }\n content.push(part.substring(lastIndex));\n\n return [...result, ...content];\n }, [] as TextPart[]);\n}\n\nfunction replaceSimpleMarkdown(textParts: TextPart[], type: 'jsx' | 'html'): TextPart[] {\n return textParts.reduce((result, part) => {\n if (typeof part !== 'string') {\n result.push(part);\n return result;\n }\n\n const parts = part.split(SIMPLE_MARKDOWN_REGEX);\n const entities = part.match(SIMPLE_MARKDOWN_REGEX) || [];\n result.push(parts[0]);\n\n return entities.reduce((entityResult: TextPart[], entity, i) => {\n if (type === 'jsx') {\n entityResult.push(\n entity.startsWith('**')\n ? <b>{entity.replace(/\\*\\*/g, '')}</b>\n : <i>{entity.replace(/__/g, '')}</i>,\n );\n } else {\n entityResult.push(\n entity.startsWith('**')\n ? `<b>${entity.replace(/\\*\\*/g, '')}</b>`\n : `<i>${entity.replace(/__/g, '')}</i>`,\n );\n }\n\n const index = i * 2 + 2;\n if (parts[index]) {\n entityResult.push(parts[index]);\n }\n\n return entityResult;\n }, result);\n }, [] as TextPart[]);\n}\n","import { MouseEvent as ReactMouseEvent } from 'react';\nimport React, {\n FC, memo, useCallback, useEffect, useRef,\n} from '../../../lib/teact/teact';\n\nimport { createClassNameBuilder } from '../../../util/buildClassName';\nimport useFlag from '../../../hooks/useFlag';\n\nimport './Spoiler.scss';\n\ntype OwnProps = {\n children?: React.ReactNode;\n messageId?: number;\n};\n\nconst READING_SYMBOLS_PER_SECOND = 23; // Heuristics\nconst MIN_HIDE_TIMEOUT = 5000; // 5s\nconst MAX_HIDE_TIMEOUT = 60000; // 1m\n\nconst actionsByMessageId: Map<number, {\n reveal: VoidFunction;\n conceal: VoidFunction;\n}[]> = new Map();\n\nconst buildClassName = createClassNameBuilder('Spoiler');\n\nconst Spoiler: FC<OwnProps> = ({\n children,\n messageId,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const contentRef = useRef<HTMLDivElement>(null);\n\n const [isRevealed, reveal, conceal] = useFlag();\n\n const handleClick = useCallback((e: ReactMouseEvent<HTMLDivElement, MouseEvent>) => {\n e.preventDefault();\n e.stopPropagation();\n\n actionsByMessageId.get(messageId!)?.forEach((actions) => actions.reveal());\n\n const contentLength = contentRef.current!.innerText.length;\n const readingMs = Math.round(contentLength / READING_SYMBOLS_PER_SECOND) * 1000;\n const timeoutMs = Math.max(MIN_HIDE_TIMEOUT, Math.min(readingMs, MAX_HIDE_TIMEOUT));\n\n setTimeout(() => {\n actionsByMessageId.get(messageId!)?.forEach((actions) => actions.conceal());\n conceal();\n }, timeoutMs);\n }, [conceal, messageId]);\n\n useEffect(() => {\n if (!messageId) {\n return undefined;\n }\n\n if (actionsByMessageId.has(messageId)) {\n actionsByMessageId.get(messageId)!.push({ reveal, conceal });\n } else {\n actionsByMessageId.set(messageId, [{ reveal, conceal }]);\n }\n\n return () => {\n actionsByMessageId.delete(messageId);\n };\n }, [conceal, handleClick, isRevealed, messageId, reveal]);\n\n return (\n <span\n className={buildClassName(\n '&',\n !isRevealed && 'concealed',\n !isRevealed && Boolean(messageId) && 'animated',\n )}\n onClick={messageId && !isRevealed ? handleClick : undefined}\n >\n <span className={buildClassName('content')} ref={contentRef}>\n {children}\n </span>\n </span>\n );\n};\n\nexport default memo(Spoiler);\n","import { MouseEvent } from 'react';\nimport React from '../../../lib/teact/teact';\nimport { getDispatch } from '../../../lib/teact/teactn';\n\nimport { ApiFormattedText, ApiMessageEntity, ApiMessageEntityTypes } from '../../../api/types';\nimport renderText, { TextFilter } from './renderText';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\nimport Spoiler from '../spoiler/Spoiler';\n\nexport type TextPart =\n string\n | Element;\n\ninterface IOrganizedEntity {\n entity: ApiMessageEntity;\n organizedIndexes: Set<number>;\n nestedEntities: IOrganizedEntity[];\n}\n\nexport function renderTextWithEntities(\n text: string,\n entities?: ApiMessageEntity[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n messageId?: number,\n isSimple?: boolean,\n) {\n if (!entities || !entities.length) {\n return renderMessagePart(text, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple);\n }\n\n const result: TextPart[] = [];\n let deleteLineBreakAfterPre = false;\n\n const organizedEntities = organizeEntities(entities);\n\n // Recursive function to render regular and nested entities\n function renderEntity(\n textPartStart: number,\n textPartEnd: number,\n organizedEntity: IOrganizedEntity,\n isLastEntity: boolean,\n ) {\n const renderResult: TextPart[] = [];\n const { entity, nestedEntities } = organizedEntity;\n const { offset, length, type } = entity;\n\n // Render text before the entity\n let textBefore = text.substring(textPartStart, offset);\n const textBeforeLength = textBefore.length;\n if (textBefore) {\n if (deleteLineBreakAfterPre && textBefore.length > 0 && textBefore[0] === '\\n') {\n textBefore = textBefore.substr(1);\n deleteLineBreakAfterPre = false;\n }\n if (textBefore) {\n renderResult.push(...renderMessagePart(\n textBefore, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple,\n ) as TextPart[]);\n }\n }\n\n const entityStartIndex = textPartStart + textBeforeLength;\n const entityEndIndex = entityStartIndex + length;\n\n let entityContent: TextPart = text.substring(offset, offset + length);\n const nestedEntityContent: TextPart[] = [];\n\n if (deleteLineBreakAfterPre && entityContent.length > 0 && entityContent[0] === '\\n') {\n entityContent = entityContent.substr(1);\n deleteLineBreakAfterPre = false;\n }\n\n if (type === ApiMessageEntityTypes.Pre) {\n deleteLineBreakAfterPre = true;\n }\n\n // Render nested entities, if any\n if (nestedEntities.length) {\n let nestedIndex = entityStartIndex;\n\n nestedEntities.forEach((nestedEntity, nestedEntityIndex) => {\n const {\n renderResult: nestedResult,\n entityEndIndex: nestedEntityEndIndex,\n } = renderEntity(\n nestedIndex,\n entityEndIndex,\n nestedEntity,\n nestedEntityIndex === nestedEntities.length - 1,\n );\n\n nestedEntityContent.push(...nestedResult);\n nestedIndex = nestedEntityEndIndex;\n });\n }\n\n // Render the entity itself\n const newEntity = shouldRenderAsHtml\n ? processEntityAsHtml(entity, entityContent, nestedEntityContent)\n : processEntity(entity, entityContent, nestedEntityContent, highlight, messageId, isSimple);\n\n if (Array.isArray(newEntity)) {\n renderResult.push(...newEntity);\n } else {\n renderResult.push(newEntity);\n }\n\n // Render text after the entity, if it is the last entity in the text,\n // or the last nested entity inside of another entity\n if (isLastEntity && entityEndIndex < textPartEnd) {\n let textAfter = text.substring(entityEndIndex, textPartEnd);\n if (deleteLineBreakAfterPre && textAfter.length > 0 && textAfter[0] === '\\n') {\n textAfter = textAfter.substring(1);\n }\n if (textAfter) {\n renderResult.push(...renderMessagePart(\n textAfter, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple,\n ) as TextPart[]);\n }\n }\n\n return {\n renderResult,\n entityEndIndex,\n };\n }\n\n // Process highest-level entities\n let index = 0;\n\n organizedEntities.forEach((entity, arrayIndex) => {\n const { renderResult, entityEndIndex } = renderEntity(\n index,\n text.length,\n entity,\n arrayIndex === organizedEntities.length - 1,\n );\n\n result.push(...renderResult);\n index = entityEndIndex;\n });\n\n return result;\n}\n\nexport function getTextWithEntitiesAsHtml(formattedText?: ApiFormattedText) {\n const { text, entities } = formattedText || {};\n if (!text) {\n return '';\n }\n\n const result = renderTextWithEntities(\n text,\n entities,\n undefined,\n undefined,\n true,\n );\n\n if (Array.isArray(result)) {\n return result.join('');\n }\n\n return result;\n}\n\nfunction renderMessagePart(\n content: TextPart | TextPart[],\n highlight?: string,\n shouldRenderHqEmoji?: boolean,\n shouldRenderAsHtml?: boolean,\n isSimple?: boolean,\n) {\n if (Array.isArray(content)) {\n const result: TextPart[] = [];\n\n content.forEach((c) => {\n result.push(...renderMessagePart(c, highlight, shouldRenderHqEmoji, shouldRenderAsHtml, isSimple));\n });\n\n return result;\n }\n\n if (shouldRenderAsHtml) {\n return renderText(content, ['escape_html', 'emoji_html', 'br_html']);\n }\n\n const emojiFilter = shouldRenderHqEmoji ? 'hq_emoji' : 'emoji';\n\n const filters: TextFilter[] = [emojiFilter];\n if (!isSimple) {\n filters.push('br');\n }\n\n if (highlight) {\n return renderText(content, filters.concat('highlight'), { highlight });\n } else {\n return renderText(content, filters);\n }\n}\n\n// Organize entities in a tree-like structure to better represent how the text will be displayed\nfunction organizeEntities(entities: ApiMessageEntity[]) {\n const organizedEntityIndexes: Set<number> = new Set();\n const organizedEntities: IOrganizedEntity[] = [];\n\n entities.forEach((entity, index) => {\n if (organizedEntityIndexes.has(index)) {\n return;\n }\n\n const organizedEntity = organizeEntity(entity, index, entities, organizedEntityIndexes);\n if (organizedEntity) {\n organizedEntity.organizedIndexes.forEach((organizedIndex) => {\n organizedEntityIndexes.add(organizedIndex);\n });\n\n organizedEntities.push(organizedEntity);\n }\n });\n\n return organizedEntities;\n}\n\nfunction organizeEntity(\n entity: ApiMessageEntity,\n index: number,\n entities: ApiMessageEntity[],\n organizedEntityIndexes: Set<number>,\n): IOrganizedEntity | undefined {\n const { offset, length } = entity;\n const organizedIndexes = new Set([index]);\n\n if (organizedEntityIndexes.has(index)) {\n return undefined;\n }\n\n // Determine any nested entities inside current entity\n const nestedEntities: IOrganizedEntity[] = [];\n const parsedNestedEntities = entities\n .filter((e, i) => i > index && e.offset >= offset && e.offset < offset + length)\n .map((e) => organizeEntity(e, entities.indexOf(e), entities, organizedEntityIndexes))\n .filter<IOrganizedEntity>(Boolean as any);\n\n parsedNestedEntities.forEach((parsedEntity) => {\n let isChanged = false;\n\n parsedEntity.organizedIndexes.forEach((organizedIndex) => {\n if (!isChanged && !organizedIndexes.has(organizedIndex)) {\n isChanged = true;\n }\n\n organizedIndexes.add(organizedIndex);\n });\n\n if (isChanged) {\n nestedEntities.push(parsedEntity);\n }\n });\n\n return {\n entity,\n organizedIndexes,\n nestedEntities,\n };\n}\n\nfunction processEntity(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n highlight?: string,\n messageId?: number,\n isSimple?: boolean,\n) {\n const entityText = typeof entityContent === 'string' && entityContent;\n const renderedContent = nestedEntityContent.length ? nestedEntityContent : entityContent;\n\n function renderNestedMessagePart() {\n return renderMessagePart(\n renderedContent, highlight, undefined, undefined, isSimple,\n );\n }\n\n if (!entityText) {\n return renderNestedMessagePart();\n }\n\n if (isSimple) {\n const text = renderNestedMessagePart();\n if (entity.type === ApiMessageEntityTypes.Spoiler) {\n return <Spoiler>{text}</Spoiler>;\n }\n return text;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return <strong>{renderNestedMessagePart()}</strong>;\n case ApiMessageEntityTypes.Blockquote:\n return <blockquote>{renderNestedMessagePart()}</blockquote>;\n case ApiMessageEntityTypes.BotCommand:\n return (\n <a\n onClick={handleBotCommandClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Hashtag:\n return (\n <a\n onClick={handleHashtagClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Cashtag:\n return (\n <a\n onClick={handleHashtagClick}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Code:\n return <code className=\"text-entity-code\">{renderNestedMessagePart()}</code>;\n case ApiMessageEntityTypes.Email:\n return (\n <a\n href={`mailto:${entityText}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Italic:\n return <em>{renderNestedMessagePart()}</em>;\n case ApiMessageEntityTypes.MentionName:\n return (\n <MentionLink userId={entity.userId}>\n {renderNestedMessagePart()}\n </MentionLink>\n );\n case ApiMessageEntityTypes.Mention:\n return (\n <MentionLink username={entityText}>\n {renderNestedMessagePart()}\n </MentionLink>\n );\n case ApiMessageEntityTypes.Phone:\n return (\n <a\n href={`tel:${entityText}`}\n className=\"text-entity-link\"\n dir=\"auto\"\n >\n {renderNestedMessagePart()}\n </a>\n );\n case ApiMessageEntityTypes.Pre:\n return <pre className=\"text-entity-pre\">{renderNestedMessagePart()}</pre>;\n case ApiMessageEntityTypes.Strike:\n return <del>{renderNestedMessagePart()}</del>;\n case ApiMessageEntityTypes.TextUrl:\n case ApiMessageEntityTypes.Url:\n return (\n <SafeLink\n url={getLinkUrl(entityText, entity)}\n text={entityText}\n >\n {renderNestedMessagePart()}\n </SafeLink>\n );\n case ApiMessageEntityTypes.Underline:\n return <ins>{renderNestedMessagePart()}</ins>;\n case ApiMessageEntityTypes.Spoiler:\n return <Spoiler messageId={messageId}>{renderNestedMessagePart()}</Spoiler>;\n default:\n return renderNestedMessagePart();\n }\n}\n\nfunction processEntityAsHtml(\n entity: ApiMessageEntity,\n entityContent: TextPart,\n nestedEntityContent: TextPart[],\n) {\n const rawEntityText = typeof entityContent === 'string' && entityContent;\n\n const renderedContent = nestedEntityContent.length\n ? nestedEntityContent.join('')\n : renderText(entityContent, ['escape_html', 'emoji_html', 'br_html']).join('');\n\n if (!rawEntityText) {\n return renderedContent;\n }\n\n switch (entity.type) {\n case ApiMessageEntityTypes.Bold:\n return `<b>${renderedContent}</b>`;\n case ApiMessageEntityTypes.Italic:\n return `<i>${renderedContent}</i>`;\n case ApiMessageEntityTypes.Underline:\n return `<u>${renderedContent}</u>`;\n case ApiMessageEntityTypes.Code:\n return `<code class=\"text-entity-code\">${renderedContent}</code>`;\n case ApiMessageEntityTypes.Pre:\n return `\\`\\`\\`<br/>${renderedContent}<br/>\\`\\`\\``;\n case ApiMessageEntityTypes.Strike:\n return `<del>${renderedContent}</del>`;\n case ApiMessageEntityTypes.MentionName:\n return `<a\n class=\"text-entity-link\"\n data-entity-type=\"${ApiMessageEntityTypes.MentionName}\"\n data-user-id=\"${entity.userId}\"\n contenteditable=\"false\"\n dir=\"auto\"\n >${renderedContent}</a>`;\n case ApiMessageEntityTypes.Url:\n case ApiMessageEntityTypes.TextUrl:\n return `<a\n class=\"text-entity-link\"\n href=${getLinkUrl(rawEntityText, entity)}\n data-entity-type=\"${entity.type}\"\n dir=\"auto\"\n >${renderedContent}</a>`;\n case ApiMessageEntityTypes.Spoiler:\n return `<span\n class=\"spoiler\"\n data-entity-type=\"${ApiMessageEntityTypes.Spoiler}\"\n >${renderedContent}</span>`;\n default:\n return renderedContent;\n }\n}\n\nfunction getLinkUrl(entityContent: string, entity: ApiMessageEntity) {\n const { type, url } = entity;\n return type === ApiMessageEntityTypes.TextUrl && url ? url : entityContent;\n}\n\nfunction handleBotCommandClick(e: MouseEvent<HTMLAnchorElement>) {\n getDispatch().sendBotCommand({ command: e.currentTarget.innerText });\n}\n\nfunction handleHashtagClick(e: MouseEvent<HTMLAnchorElement>) {\n getDispatch().setLocalTextSearchQuery({ query: e.currentTarget.innerText });\n getDispatch().searchTextMessagesLocal();\n}\n","import React from '../../../lib/teact/teact';\n\nimport { EDITABLE_INPUT_ID } from '../../../config';\nimport { IS_IOS } from '../../../util/environment';\n\nexport function preventMessageInputBlur(e: React.MouseEvent<HTMLElement>, withBubbling = false) {\n if (\n IS_IOS\n || !document.activeElement\n || document.activeElement.id !== EDITABLE_INPUT_ID\n || (!withBubbling && e.target !== e.currentTarget)\n ) {\n return;\n }\n\n e.preventDefault();\n}\n\nexport function preventMessageInputBlurWithBubbling(e: React.MouseEvent<HTMLElement>) {\n preventMessageInputBlur(e, true);\n}\n","import React, { FC } from '../../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../../lib/teact/teactn';\n\nimport { ApiChat, ApiUser } from '../../../api/types';\n\nimport { selectUser } from '../../../modules/selectors';\n\ntype OwnProps = {\n userId?: string;\n username?: string;\n children: any;\n};\n\ntype StateProps = {\n userOrChat?: ApiUser | ApiChat;\n};\n\nconst MentionLink: FC<OwnProps & StateProps> = ({\n username,\n userOrChat,\n children,\n}) => {\n const {\n openChat,\n openChatByUsername,\n } = getDispatch();\n\n const handleClick = () => {\n if (userOrChat) {\n openChat({ id: userOrChat.id });\n } else if (username) {\n openChatByUsername({ username: username.substring(1) });\n }\n };\n\n return (\n <a onClick={handleClick} className=\"text-entity-link\" dir=\"auto\">\n {children}\n </a>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global, { userId }): StateProps => {\n return {\n userOrChat: userId ? selectUser(global, userId) : undefined,\n };\n },\n)(MentionLink);\n","import { MouseEvent as ReactMouseEvent, RefObject } from 'react';\n\nimport React, {\n FC, useRef, useCallback, useState,\n} from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport Spinner from './Spinner';\nimport RippleEffect from './RippleEffect';\n\nimport './Button.scss';\n\nexport type OwnProps = {\n ref?: RefObject<HTMLButtonElement | HTMLAnchorElement>;\n type?: 'button' | 'submit' | 'reset';\n children: any;\n size?: 'default' | 'smaller' | 'tiny';\n color?: (\n 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'translucent-black' | 'dark'\n );\n backgroundImage?: string;\n className?: string;\n round?: boolean;\n pill?: boolean;\n fluid?: boolean;\n isText?: boolean;\n isLoading?: boolean;\n ariaLabel?: string;\n href?: string;\n download?: string;\n disabled?: boolean;\n ripple?: boolean;\n faded?: boolean;\n tabIndex?: number;\n isRtl?: boolean;\n withClickPropagation?: boolean;\n onClick?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onContextMenu?: (e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => void;\n onMouseDown?: (e: ReactMouseEvent<HTMLButtonElement>) => void;\n onMouseEnter?: NoneToVoidFunction;\n onMouseLeave?: NoneToVoidFunction;\n onFocus?: NoneToVoidFunction;\n};\n\n// Longest animation duration;\nconst CLICKED_TIMEOUT = 400;\n\nconst Button: FC<OwnProps> = ({\n ref,\n type = 'button',\n onClick,\n onContextMenu,\n onMouseDown,\n onMouseEnter,\n onMouseLeave,\n onFocus,\n children,\n size = 'default',\n color = 'primary',\n backgroundImage,\n className,\n round,\n pill,\n fluid,\n isText,\n isLoading,\n ariaLabel,\n href,\n download,\n disabled,\n ripple,\n faded,\n tabIndex,\n isRtl,\n withClickPropagation,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let elementRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);\n if (ref) {\n elementRef = ref;\n }\n\n const [isClicked, setIsClicked] = useState(false);\n\n const fullClassName = buildClassName(\n 'Button',\n className,\n size,\n color,\n round && 'round',\n pill && 'pill',\n fluid && 'fluid',\n disabled && 'disabled',\n isText && 'text',\n isLoading && 'loading',\n ripple && 'has-ripple',\n faded && 'faded',\n isClicked && 'clicked',\n backgroundImage && 'with-image',\n );\n\n const handleClick = useCallback((e: ReactMouseEvent<HTMLButtonElement, MouseEvent>) => {\n if (!disabled && onClick) {\n onClick(e);\n }\n\n setIsClicked(true);\n setTimeout(() => {\n setIsClicked(false);\n }, CLICKED_TIMEOUT);\n }, [disabled, onClick]);\n\n const handleMouseDown = useCallback((e: ReactMouseEvent<HTMLButtonElement>) => {\n if (!withClickPropagation) e.preventDefault();\n if (!disabled && onMouseDown) {\n onMouseDown(e);\n }\n }, [onMouseDown, disabled, withClickPropagation]);\n\n if (href) {\n return (\n <a\n ref={elementRef as RefObject<HTMLAnchorElement>}\n className={fullClassName}\n href={href}\n title={ariaLabel}\n download={download}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n >\n {children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </a>\n );\n }\n\n return (\n // eslint-disable-next-line react/button-has-type\n <button\n ref={elementRef as RefObject<HTMLButtonElement>}\n type={type}\n className={fullClassName}\n onClick={handleClick}\n onContextMenu={onContextMenu}\n onMouseDown={handleMouseDown}\n onMouseEnter={onMouseEnter && !disabled ? onMouseEnter : undefined}\n onMouseLeave={onMouseLeave && !disabled ? onMouseLeave : undefined}\n onFocus={onFocus && !disabled ? onFocus : undefined}\n aria-label={ariaLabel}\n title={ariaLabel}\n tabIndex={tabIndex}\n dir={isRtl ? 'rtl' : undefined}\n style={backgroundImage ? `background-image: url(${backgroundImage})` : undefined}\n >\n {isLoading ? (\n <div>\n <span dir={isRtl ? 'auto' : undefined}>Please wait...</span>\n <Spinner color={isText ? 'blue' : 'white'} />\n </div>\n ) : children}\n {!disabled && ripple && (\n <RippleEffect />\n )}\n </button>\n );\n};\n\nexport default Button;\n","import { ChangeEvent } from 'react';\nimport React, { FC, memo, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\nimport renderText from '../common/helpers/renderText';\n\nimport Spinner from './Spinner';\n\nimport './Checkbox.scss';\n\ntype OwnProps = {\n id?: string;\n name?: string;\n value?: string;\n label: string;\n subLabel?: string;\n checked: boolean;\n disabled?: boolean;\n round?: boolean;\n blocking?: boolean;\n isLoading?: boolean;\n withCheckedCallback?: boolean;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onCheck?: (isChecked: boolean) => void;\n};\n\nconst Checkbox: FC<OwnProps> = ({\n id,\n name,\n value,\n label,\n subLabel,\n checked,\n disabled,\n round,\n blocking,\n isLoading,\n onChange,\n onCheck,\n}) => {\n const lang = useLang();\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {\n if (onChange) {\n onChange(event);\n }\n\n if (onCheck) {\n onCheck(event.currentTarget.checked);\n }\n }, [onChange, onCheck]);\n\n const className = buildClassName(\n 'Checkbox',\n disabled && 'disabled',\n round && 'round',\n isLoading && 'loading',\n blocking && 'blocking',\n );\n\n return (\n <label className={className} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n onChange={handleChange}\n />\n <div className=\"Checkbox-main\">\n <span className=\"label\" dir=\"auto\">{renderText(label)}</span>\n {subLabel && <span className=\"subLabel\" dir=\"auto\">{renderText(subLabel)}</span>}\n </div>\n {isLoading && <Spinner />}\n </label>\n );\n};\n\nexport default memo(Checkbox);\n","import React, { FC, useState, useRef } from '../../lib/teact/teact';\n\nimport Menu from './Menu';\n\nimport './DropdownMenu.scss';\n\ntype OwnProps = {\n className?: string;\n trigger: FC<{ onTrigger: () => void; isOpen?: boolean }>;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n footer?: string;\n forceOpen?: boolean;\n onOpen?: NoneToVoidFunction;\n onClose?: NoneToVoidFunction;\n children: any;\n};\n\nconst DropdownMenu: FC<OwnProps> = ({\n trigger,\n className,\n children,\n positionX = 'left',\n positionY = 'top',\n footer,\n forceOpen,\n onOpen,\n onClose,\n}) => {\n // eslint-disable-next-line no-null/no-null\n const menuRef = useRef<HTMLDivElement>(null);\n // eslint-disable-next-line no-null/no-null\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n\n const toggleIsOpen = () => {\n setIsOpen(!isOpen);\n if (isOpen) {\n if (onClose) onClose();\n } else if (onOpen) onOpen();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<any>) => {\n const menu = menuRef.current;\n\n if (!isOpen || e.keyCode !== 40 || !menu) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(menu.children);\n\n if (!focusedElement || elementChildren.indexOf(focusedElement) === -1) {\n (elementChildren[0] as HTMLElement).focus();\n }\n };\n\n const handleClose = () => {\n setIsOpen(false);\n if (onClose) onClose();\n };\n\n return (\n <div\n ref={dropdownRef}\n className={`DropdownMenu ${className || ''}`}\n onKeyDown={handleKeyDown}\n >\n {trigger({ onTrigger: toggleIsOpen, isOpen })}\n\n <Menu\n ref={menuRef}\n containerRef={dropdownRef}\n isOpen={isOpen || Boolean(forceOpen)}\n className={className || ''}\n positionX={positionX}\n positionY={positionY}\n footer={footer}\n autoClose\n onClose={handleClose}\n shouldSkipTransition={forceOpen}\n >\n {children}\n </Menu>\n </div>\n );\n};\n\nexport default DropdownMenu;\n","import {\n ChangeEvent, FormEvent, RefObject,\n} from 'react';\nimport React, { FC, memo } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\ntype OwnProps = {\n ref?: RefObject<HTMLInputElement>;\n id?: string;\n className?: string;\n value?: string;\n label?: string;\n error?: string;\n success?: string;\n disabled?: boolean;\n readOnly?: boolean;\n placeholder?: string;\n autoComplete?: string;\n maxLength?: number;\n inputMode?: 'text' | 'none' | 'tel' | 'url' | 'email' | 'numeric' | 'decimal' | 'search';\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n onInput?: (e: FormEvent<HTMLInputElement>) => void;\n onKeyPress?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;\n onPaste?: (e: React.ClipboardEvent<HTMLInputElement>) => void;\n};\n\nconst InputText: FC<OwnProps> = ({\n ref,\n id,\n className,\n value,\n label,\n error,\n success,\n disabled,\n readOnly,\n placeholder,\n autoComplete,\n inputMode,\n maxLength,\n onChange,\n onInput,\n onKeyPress,\n onKeyDown,\n onBlur,\n onPaste,\n}) => {\n const lang = useLang();\n const labelText = error || success || label;\n const fullClassName = buildClassName(\n 'input-group',\n value && 'touched',\n error ? 'error' : success && 'success',\n disabled && 'disabled',\n readOnly && 'disabled',\n labelText && 'with-label',\n className,\n );\n\n return (\n <div className={fullClassName} dir={lang.isRtl ? 'rtl' : undefined}>\n <input\n ref={ref}\n className=\"form-control\"\n type=\"text\"\n id={id}\n dir=\"auto\"\n value={value || ''}\n placeholder={placeholder}\n maxLength={maxLength}\n autoComplete={autoComplete}\n inputMode={inputMode}\n disabled={disabled}\n readOnly={readOnly}\n onChange={onChange}\n onInput={onInput}\n onKeyPress={onKeyPress}\n onKeyDown={onKeyDown}\n onBlur={onBlur}\n onPaste={onPaste}\n />\n {labelText && (\n <label htmlFor={id}>{labelText}</label>\n )}\n </div>\n );\n};\n\nexport default memo(InputText);\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Link.scss';\n\ntype OwnProps = {\n children: any;\n className?: string;\n isRtl?: boolean;\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n};\n\nconst Link: FC<OwnProps> = ({\n children, className, isRtl, onClick,\n}) => {\n const handleClick = useCallback((e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n onClick!(e);\n }, [onClick]);\n\n return (\n <a\n href=\"#\"\n className={buildClassName('Link', className)}\n dir={isRtl ? 'rtl' : 'auto'}\n onClick={onClick ? handleClick : undefined}\n >\n {children}\n </a>\n );\n};\n\nexport default Link;\n","import React, { FC, memo } from '../../lib/teact/teact';\n\nimport Spinner from './Spinner';\nimport buildClassName from '../../util/buildClassName';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black' | 'yellow';\n backgroundColor?: 'light' | 'dark';\n onClick?: NoneToVoidFunction;\n};\n\nconst Loading: FC<OwnProps> = ({ color = 'blue', backgroundColor, onClick }) => {\n return (\n <div className={buildClassName('Loading', onClick && 'interactive')} onClick={onClick}>\n <Spinner color={color} backgroundColor={backgroundColor} />\n </div>\n );\n};\n\nexport default memo(Loading);\n","import { RefObject } from 'react';\nimport React, { FC, useEffect, useRef } from '../../lib/teact/teact';\n\nimport useShowTransition from '../../hooks/useShowTransition';\nimport useKeyboardListNavigation from '../../hooks/useKeyboardListNavigation';\nimport useVirtualBackdrop from '../../hooks/useVirtualBackdrop';\nimport useEffectWithPrevDeps from '../../hooks/useEffectWithPrevDeps';\nimport captureEscKeyListener from '../../util/captureEscKeyListener';\nimport buildClassName from '../../util/buildClassName';\nimport { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport useHistoryBack from '../../hooks/useHistoryBack';\nimport { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur';\n\nimport './Menu.scss';\n\ntype OwnProps = {\n ref?: RefObject<HTMLDivElement>;\n containerRef?: RefObject<HTMLElement>;\n isOpen: boolean;\n className?: string;\n style?: string;\n bubbleStyle?: string;\n transformOriginX?: number;\n transformOriginY?: number;\n positionX?: 'left' | 'right';\n positionY?: 'top' | 'bottom';\n autoClose?: boolean;\n shouldSkipTransition?: boolean;\n footer?: string;\n noCloseOnBackdrop?: boolean;\n onKeyDown?: (e: React.KeyboardEvent<any>) => void;\n onCloseAnimationEnd?: () => void;\n onClose?: () => void;\n onMouseEnter?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n onMouseLeave?: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n children: any;\n};\n\nconst ANIMATION_DURATION = 200;\n\nconst Menu: FC<OwnProps> = ({\n ref,\n containerRef,\n isOpen,\n className,\n style,\n bubbleStyle,\n children,\n transformOriginX,\n transformOriginY,\n positionX = 'left',\n positionY = 'top',\n autoClose = false,\n footer,\n noCloseOnBackdrop = false,\n onCloseAnimationEnd,\n onClose,\n onMouseEnter,\n onMouseLeave,\n shouldSkipTransition,\n}) => {\n // eslint-disable-next-line no-null/no-null\n let menuRef = useRef<HTMLDivElement>(null);\n if (ref) {\n menuRef = ref;\n }\n const backdropContainerRef = containerRef || menuRef;\n\n const {\n transitionClassNames,\n } = useShowTransition(\n isOpen,\n onCloseAnimationEnd,\n shouldSkipTransition,\n undefined,\n shouldSkipTransition,\n );\n\n useEffect(\n () => (isOpen && onClose ? captureEscKeyListener(onClose) : undefined),\n [isOpen, onClose],\n );\n\n useHistoryBack(isOpen, onClose, undefined, undefined, autoClose);\n\n useEffectWithPrevDeps(([prevIsOpen]) => {\n if (isOpen || (!isOpen && prevIsOpen === true)) {\n dispatchHeavyAnimationEvent(ANIMATION_DURATION);\n }\n }, [isOpen]);\n\n const handleKeyDown = useKeyboardListNavigation(menuRef, isOpen, autoClose ? onClose : undefined, undefined, true);\n\n useVirtualBackdrop(\n isOpen,\n backdropContainerRef,\n noCloseOnBackdrop ? undefined : onClose,\n );\n\n const bubbleClassName = buildClassName(\n 'bubble menu-container custom-scroll',\n positionY,\n positionX,\n footer && 'with-footer',\n transitionClassNames,\n );\n\n const transformOriginYStyle = transformOriginY !== undefined ? `${transformOriginY}px` : undefined;\n const transformOriginXStyle = transformOriginX !== undefined ? `${transformOriginX}px` : undefined;\n\n return (\n <div\n className={buildClassName('Menu no-selection', className)}\n onKeyDown={isOpen ? handleKeyDown : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={isOpen ? onMouseLeave : undefined}\n style={style}\n >\n {isOpen && (\n // This only prevents click events triggering on underlying elements\n <div className=\"backdrop\" onMouseDown={preventMessageInputBlurWithBubbling} />\n )}\n <div\n ref={menuRef}\n className={bubbleClassName}\n style={`transform-origin: ${transformOriginXStyle || positionX} ${transformOriginYStyle || positionY};${\n bubbleStyle || ''}`}\n onClick={autoClose ? onClose : undefined}\n >\n {children}\n {footer && <div className=\"footer\">{footer}</div>}\n </div>\n </div>\n );\n};\n\nexport default Menu;\n","import React, { FC, useCallback } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\nimport useLang from '../../hooks/useLang';\n\nimport './MenuItem.scss';\n\ntype OnClickHandler = (e: React.SyntheticEvent<HTMLDivElement | HTMLAnchorElement>) => void;\n\ntype OwnProps = {\n icon?: string;\n className?: string;\n children: any;\n onClick?: OnClickHandler;\n href?: string;\n download?: string;\n disabled?: boolean;\n destructive?: boolean;\n ariaLabel?: string;\n};\n\nconst MenuItem: FC<OwnProps> = (props) => {\n const {\n icon,\n className,\n children,\n onClick,\n href,\n download,\n disabled,\n destructive,\n ariaLabel,\n } = props;\n\n const lang = useLang();\n const handleClick = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.keyCode !== 13 && e.keyCode !== 32) {\n return;\n }\n\n if (disabled || !onClick) {\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n\n onClick(e);\n }, [disabled, onClick]);\n\n const fullClassName = buildClassName(\n 'MenuItem',\n className,\n disabled && 'disabled',\n destructive && 'destructive',\n );\n\n const content = (\n <>\n {icon && (\n <i className={`icon-${icon}`} data-char={icon.startsWith('char-') ? icon.replace('char-', '') : undefined} />\n )}\n {children}\n </>\n );\n\n if (href) {\n return (\n <a\n tabIndex={0}\n className={fullClassName}\n href={href}\n download={download}\n aria-label={ariaLabel}\n title={ariaLabel}\n target={href.startsWith(window.location.origin) ? '_self' : '_blank'}\n rel=\"noopener noreferrer\"\n dir={lang.isRtl ? 'rtl' : undefined}\n onClick={onClick}\n >\n {content}\n </a>\n );\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n className={fullClassName}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n aria-label={ariaLabel}\n title={ariaLabel}\n dir={lang.isRtl ? 'rtl' : undefined}\n >\n {content}\n </div>\n );\n};\n\nexport default MenuItem;\n","import React, {\n FC, useCallback, useMemo, useState, memo,\n} from '../../lib/teact/teact';\nimport { debounce } from '../../util/schedulers';\n\nimport './RippleEffect.scss';\n\ninterface Ripple {\n x: number;\n y: number;\n size: number;\n}\n\nconst ANIMATION_DURATION_MS = 700;\n\nconst RippleEffect: FC = () => {\n const [ripples, setRipples] = useState<Ripple[]>([]);\n\n const cleanUpDebounced = useMemo(() => {\n return debounce(() => {\n setRipples([]);\n }, ANIMATION_DURATION_MS, false);\n }, []);\n\n const handleMouseDown = useCallback((e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (e.button !== 0) {\n return;\n }\n\n const container = e.currentTarget as HTMLDivElement;\n const position = container.getBoundingClientRect() as DOMRect;\n\n const rippleSize = container.offsetWidth / 2;\n\n setRipples([\n ...ripples,\n {\n x: e.clientX - position.x - (rippleSize / 2),\n y: e.clientY - position.y - (rippleSize / 2),\n size: rippleSize,\n },\n ]);\n\n requestAnimationFrame(() => {\n cleanUpDebounced();\n });\n }, [ripples, cleanUpDebounced]);\n\n return (\n <div className=\"ripple-container\" onMouseDown={handleMouseDown}>\n {ripples.map(({ x, y, size }) => (\n <span\n style={`left: ${x}px; top: ${y}px; width: ${size}px; height: ${size}px;`}\n />\n ))}\n </div>\n );\n};\n\nexport default memo(RippleEffect);\n","import React, { FC } from '../../lib/teact/teact';\n\nimport buildClassName from '../../util/buildClassName';\n\nimport './Spinner.scss';\n\nconst Spinner: FC<{\n color?: 'blue' | 'white' | 'black' | 'green' | 'gray' | 'yellow';\n backgroundColor?: 'light' | 'dark';\n}> = ({\n color = 'blue',\n backgroundColor,\n}) => {\n return (\n <div className={buildClassName('Spinner', color, backgroundColor && 'with-background', `bg-${backgroundColor}`)}>\n <div />\n </div>\n );\n};\n\nexport default Spinner;\n","export const PAGE_TITLE = 'Telegram';\nexport const INACTIVE_MARKER = ' [Inactive]';\n\nexport const APP_NAME = process.env.APP_NAME || 'Telegram WebZ';\nexport const APP_VERSION = process.env.APP_VERSION || 'dev';\n\nexport const DEBUG = (\n process.env.APP_ENV !== 'production' && process.env.APP_ENV !== 'perf' && process.env.APP_ENV !== 'test'\n);\nexport const DEBUG_MORE = false;\n\nexport const IS_TEST = process.env.APP_ENV === 'test';\nexport const IS_PERF = process.env.APP_ENV === 'perf';\n\nexport const DEBUG_ALERT_MSG = 'Shoot!\\nSomething went wrong, please see the error details in Dev Tools Console.';\nexport const DEBUG_GRAMJS = false;\n\nexport const SESSION_USER_KEY = 'user_auth';\nexport const LEGACY_SESSION_KEY = 'GramJs:sessionId';\n\nexport const GLOBAL_STATE_CACHE_DISABLED = false;\nexport const GLOBAL_STATE_CACHE_KEY = 'tt-global-state';\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 500;\nexport const GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT = 200;\nexport const GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT = 30;\n\nexport const MEDIA_CACHE_DISABLED = false;\nexport const MEDIA_CACHE_NAME = 'tt-media';\nexport const MEDIA_CACHE_NAME_AVATARS = 'tt-media-avatars';\nexport const MEDIA_PROGRESSIVE_CACHE_DISABLED = false;\nexport const MEDIA_PROGRESSIVE_CACHE_NAME = 'tt-media-progressive';\nexport const MEDIA_CACHE_MAX_BYTES = 512 * 1024; // 512 KB\nexport const CUSTOM_BG_CACHE_NAME = 'tt-custom-bg';\nexport const LANG_CACHE_NAME = 'tt-lang-packs-v7';\nexport const ASSET_CACHE_NAME = 'tt-assets';\nexport const AUTODOWNLOAD_FILESIZE_MB_LIMITS = [1, 5, 10, 50, 100, 500];\n\nexport const DOWNLOAD_WORKERS = 16;\nexport const UPLOAD_WORKERS = 16;\n\nconst isBigScreen = typeof window !== 'undefined' && window.innerHeight >= 900;\n\nexport const MIN_PASSWORD_LENGTH = 1;\n\nexport const MESSAGE_LIST_SLICE = isBigScreen ? 60 : 40;\nexport const MESSAGE_LIST_VIEWPORT_LIMIT = MESSAGE_LIST_SLICE * 2;\n\nexport const CHAT_HEIGHT_PX = 72;\nexport const CHAT_LIST_SLICE = isBigScreen ? 30 : 25;\nexport const CHAT_LIST_LOAD_SLICE = 100;\nexport const SHARED_MEDIA_SLICE = 42;\nexport const MESSAGE_SEARCH_SLICE = 42;\nexport const GLOBAL_SEARCH_SLICE = 20;\nexport const MEMBERS_SLICE = 30;\nexport const MEMBERS_LOAD_SLICE = 200;\nexport const PINNED_MESSAGES_LIMIT = 50;\nexport const BLOCKED_LIST_LIMIT = 100;\nexport const PROFILE_PHOTOS_LIMIT = 40;\nexport const PROFILE_SENSITIVE_AREA = 500;\nexport const COMMON_CHATS_LIMIT = 100;\nexport const GROUP_CALL_PARTICIPANTS_LIMIT = 100;\nexport const REACTION_LIST_LIMIT = 100;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\n\nexport const SPONSORED_MESSAGE_CACHE_MS = 300000; // 5 min\n\nexport const DEFAULT_VOLUME = 1;\nexport const DEFAULT_PLAYBACK_RATE = 1;\n\nexport const ANIMATION_LEVEL_MIN = 0;\nexport const ANIMATION_LEVEL_MED = 1;\nexport const ANIMATION_LEVEL_MAX = 2;\nexport const ANIMATION_LEVEL_DEFAULT = ANIMATION_LEVEL_MAX;\n\nexport const DEFAULT_MESSAGE_TEXT_SIZE_PX = 16;\nexport const IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 17;\nexport const MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX = 15;\n\nexport const DRAFT_DEBOUNCE = 10000; // 10s\nexport const SEND_MESSAGE_ACTION_INTERVAL = 3000; // 3s\n\nexport const EDITABLE_INPUT_ID = 'editable-message-text';\nexport const EDITABLE_INPUT_MODAL_ID = 'editable-message-text-modal';\n\n// Screen width where Pinned Message / Audio Player in the Middle Header can be safely displayed\nexport const SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1440; // px\n// Screen width where Pinned Message / Audio Player in the Middle Header shouldn't collapse with ChatInfo\nexport const SAFE_SCREEN_WIDTH_FOR_CHAT_INFO = 1150; // px\n\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN = 1275; // px\nexport const MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN = 925; // px\nexport const MOBILE_SCREEN_MAX_WIDTH = 600; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH = 950; // px\nexport const MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT = 450; // px\n\nexport const LOCAL_MESSAGE_ID_BASE = 1e9;\nexport const TMP_CHAT_ID = '0';\n\nexport const ANIMATION_END_DELAY = 100;\n\nexport const FAST_SMOOTH_MAX_DISTANCE = 1500;\nexport const FAST_SMOOTH_MIN_DURATION = 250;\nexport const FAST_SMOOTH_MAX_DURATION = 600;\nexport const FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE = 500; // px\n\n// Average duration of message sending animation\nexport const API_UPDATE_THROTTLE = Math.round((FAST_SMOOTH_MIN_DURATION + FAST_SMOOTH_MAX_DURATION) / 2);\nexport const API_THROTTLE_RESET_UPDATES = new Set([\n 'newMessage', 'newScheduledMessage', 'deleteMessages', 'deleteScheduledMessages', 'deleteHistory',\n]);\n\nexport const STICKER_SIZE_INLINE_DESKTOP_FACTOR = 13;\nexport const STICKER_SIZE_INLINE_MOBILE_FACTOR = 11;\nexport const STICKER_SIZE_AUTH = 160;\nexport const STICKER_SIZE_AUTH_MOBILE = 120;\nexport const STICKER_SIZE_PICKER = 64;\nexport const STICKER_SIZE_GENERAL_SETTINGS = 48;\nexport const STICKER_SIZE_PICKER_HEADER = 32;\nexport const STICKER_SIZE_SEARCH = 64;\nexport const STICKER_SIZE_MODAL = 64;\nexport const STICKER_SIZE_TWO_FA = 160;\nexport const STICKER_SIZE_DISCUSSION_GROUPS = 140;\nexport const STICKER_SIZE_FOLDER_SETTINGS = 100;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const STICKER_SIZE_JOIN_REQUESTS = 140;\nexport const STICKER_SIZE_INVITES = 140;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const NO_STICKER_SET_ID = 'NO_STICKER_SET';\n\nexport const BASE_EMOJI_KEYWORD_LANG = 'en';\n\nexport const MENU_TRANSITION_DURATION = 200;\nexport const SLIDE_TRANSITION_DURATION = 450;\n\nexport const VIDEO_MOV_TYPE = 'video/quicktime';\nexport const VIDEO_WEBM_TYPE = 'video/webm';\n\nexport const SUPPORTED_IMAGE_CONTENT_TYPES = new Set([\n 'image/png', 'image/gif', 'image/jpeg',\n]);\n\nexport const SUPPORTED_VIDEO_CONTENT_TYPES = new Set([\n 'video/mp4', // video/quicktime added dynamically in environment.ts\n]);\n\nexport const CONTENT_TYPES_WITH_PREVIEW = new Set([\n ...SUPPORTED_IMAGE_CONTENT_TYPES,\n ...SUPPORTED_VIDEO_CONTENT_TYPES,\n]);\n\nexport const CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram.';\n\n// eslint-disable-next-line max-len\nexport const RE_LINK_TEMPLATE = '((ftp|https?):\\\\/\\\\/)?((www\\\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\\\.[a-zA-Z0-9()]{1,63})\\\\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)';\nexport const RE_MENTION_TEMPLATE = '(@[\\\\w\\\\d_-]+)';\nexport const RE_TG_LINK = /^tg:(\\/\\/)?([?=&\\d\\w_-]+)?/gm;\nexport const RE_TME_LINK = /^(?:https?:\\/\\/)?(?:t\\.me\\/)/gm;\n\n// eslint-disable-next-line max-len\nexport const COUNTRIES_WITH_12H_TIME_FORMAT = new Set(['AU', 'BD', 'CA', 'CO', 'EG', 'HN', 'IE', 'IN', 'JO', 'MX', 'MY', 'NI', 'NZ', 'PH', 'PK', 'SA', 'SV', 'US']);\n\n// MTProto constants\nexport const SERVICE_NOTIFICATIONS_USER_ID = '777000';\nexport const REPLIES_USER_ID = '1271266957'; // TODO For Test connection ID must be equal to 708513\nexport const ALL_FOLDER_ID = 0;\nexport const ARCHIVED_FOLDER_ID = 1;\nexport const DELETED_COMMENTS_CHANNEL_ID = '-777';\nexport const MAX_MEDIA_FILES_FOR_ALBUM = 10;\nexport const MAX_ACTIVE_PINNED_CHATS = 5;\nexport const SCHEDULED_WHEN_ONLINE = 0x7FFFFFFE;\nexport const DEFAULT_LANG_CODE = 'en';\nexport const DEFAULT_LANG_PACK = 'android';\nexport const LANG_PACKS = ['android', 'ios', 'tdesktop', 'macos'] as const;\nexport const TIPS_USERNAME = 'TelegramTips';\nexport const LOCALIZED_TIPS = ['ar', 'pt-br', 'id', 'it', 'ko', 'ms', 'pl', 'es', 'tr'];\nexport const FEEDBACK_URL = 'https://bugs.telegram.org/?tag_ids=41&sort=time';\nexport const LIGHT_THEME_BG_COLOR = '#A2AF8E';\nexport const DARK_THEME_BG_COLOR = '#0F0F0F';\nexport const DARK_THEME_PATTERN_COLOR = '#0a0a0a8c';\nexport const DEFAULT_PATTERN_COLOR = 'rgba(90, 110, 70, 0.6)';\n\n// Group calls\nexport const GROUP_CALL_VOLUME_MULTIPLIER = 100;\nexport const GROUP_CALL_DEFAULT_VOLUME = 100 * GROUP_CALL_VOLUME_MULTIPLIER;\nexport const ENABLE_THUMBNAIL_VIDEO = false;\n","import { useEffect } from '../lib/teact/teact';\nimport usePrevious from './usePrevious';\n\nconst useEffectWithPrevDeps = <T extends any[]>(cb: (args: T | []) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious<T>(dependencies);\n return useEffect(() => {\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n\nexport default useEffectWithPrevDeps;\n","import { useCallback, useState } from '../lib/teact/teact';\n\nconst useFlag = (initial = false): [boolean, AnyToVoidFunction, AnyToVoidFunction] => {\n const [value, setValue] = useState(initial);\n\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n\n return [value, setTrue, setFalse];\n};\n\nexport default useFlag;\n","import { useCallback, useState } from '../lib/teact/teact';\n\nconst useForceUpdate = () => {\n const [, setTrigger] = useState<boolean>(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\n\nexport default useForceUpdate;\n","import { useEffect } from '../lib/teact/teact';\n\nconst ANIMATION_START_EVENT = 'tt-event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'tt-event-heavy-animation-end';\n\nlet timeout: number | undefined;\nlet isAnimating = false;\n\n// Make sure to end even if end callback was not called (which was some hardly-reproducible bug)\nconst AUTO_END_TIMEOUT = 1000;\n\nconst useHeavyAnimationCheck = (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n isDisabled = false,\n) => {\n useEffect(() => {\n if (isDisabled) {\n return undefined;\n }\n\n if (isAnimating) {\n handleAnimationStart();\n }\n\n document.addEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n document.addEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n document.removeEventListener(ANIMATION_END_EVENT, handleAnimationEnd);\n document.removeEventListener(ANIMATION_START_EVENT, handleAnimationStart);\n };\n }, [isDisabled, handleAnimationEnd, handleAnimationStart]);\n};\n\nexport function isHeavyAnimating() {\n return isAnimating;\n}\n\nexport function dispatchHeavyAnimationEvent(duration = AUTO_END_TIMEOUT) {\n if (!isAnimating) {\n isAnimating = true;\n document.dispatchEvent(new Event(ANIMATION_START_EVENT));\n }\n\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n // Race condition may happen if another `dispatchHeavyAnimationEvent` is called before `onEnd`\n function onEnd() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n isAnimating = false;\n document.dispatchEvent(new Event(ANIMATION_END_EVENT));\n }\n\n timeout = window.setTimeout(onEnd, duration);\n\n return onEnd;\n}\n\nexport default useHeavyAnimationCheck;\n","import { useCallback, useEffect, useRef } from '../lib/teact/teact';\n\nimport { IS_IOS } from '../util/environment';\nimport usePrevious from './usePrevious';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { areSortedArraysEqual } from '../util/iteratees';\n\ntype HistoryState = {\n currentIndex: number;\n nextStateIndexToReplace: number;\n isHistoryAltered: boolean;\n isDisabled: boolean;\n isEdge: boolean;\n currentIndexes: number[];\n};\n\n// Carefully selected by swiping and observing visual changes\n// TODO: may be different on other devices such as iPad, maybe take dpi into account?\nconst SAFARI_EDGE_BACK_GESTURE_LIMIT = 300;\nconst SAFARI_EDGE_BACK_GESTURE_DURATION = 350;\nexport const LOCATION_HASH = window.location.hash;\nconst PATH_BASE = `${window.location.pathname}${window.location.search}`;\n\nconst historyState: HistoryState = {\n currentIndex: 0,\n nextStateIndexToReplace: -1,\n isHistoryAltered: false,\n isDisabled: false,\n isEdge: false,\n currentIndexes: [],\n};\n\nexport const disableHistoryBack = () => {\n historyState.isDisabled = true;\n};\n\nconst handleTouchStart = (event: TouchEvent) => {\n const x = event.touches[0].pageX;\n\n if (x <= SAFARI_EDGE_BACK_GESTURE_LIMIT || x >= window.innerWidth - SAFARI_EDGE_BACK_GESTURE_LIMIT) {\n historyState.isEdge = true;\n }\n};\n\nconst handleTouchEnd = () => {\n if (historyState.isEdge) {\n setTimeout(() => {\n historyState.isEdge = false;\n }, SAFARI_EDGE_BACK_GESTURE_DURATION);\n }\n};\n\nif (IS_IOS) {\n window.addEventListener('touchstart', handleTouchStart);\n window.addEventListener('touchend', handleTouchEnd);\n window.addEventListener('popstate', handleTouchEnd);\n}\n\nwindow.history.replaceState({ index: historyState.currentIndex }, '', PATH_BASE);\n\nexport default function useHistoryBack(\n isActive: boolean | undefined,\n onBack: ((noDisableAnimation: boolean) => void) | undefined,\n onForward?: (state: any) => void,\n currentState?: any,\n shouldReplaceNext = false,\n hashes?: string[],\n) {\n const indexRef = useRef(-1);\n const isForward = useRef(false);\n const prevIsActive = usePrevious(isActive);\n const isClosed = useRef(true);\n const indexHashRef = useRef<{ index: number; hash: string }[]>([]);\n const prevHashes = usePrevious(hashes);\n const isHashChangedFromEvent = useRef<boolean>(false);\n\n const handleChange = useCallback((isForceClose = false) => {\n if (!hashes) {\n if (isActive && !isForceClose) {\n isClosed.current = false;\n\n if (isForward.current) {\n isForward.current = false;\n historyState.currentIndexes.push(indexRef.current);\n } else {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n\n historyState.currentIndexes.push(index);\n\n window.history[(\n (\n historyState.currentIndexes.includes(historyState.nextStateIndexToReplace - 1)\n && window.history.state.index !== 0\n && historyState.nextStateIndexToReplace === index\n && !shouldReplaceNext\n )\n ? 'replaceState'\n : 'pushState'\n )]({\n index,\n state: currentState,\n }, '');\n\n indexRef.current = index;\n\n if (shouldReplaceNext) {\n historyState.nextStateIndexToReplace = historyState.currentIndex + 1;\n }\n }, 0);\n }\n }\n\n if ((isForceClose || !isActive) && !isClosed.current) {\n if ((indexRef.current === historyState.currentIndex || !shouldReplaceNext)) {\n historyState.isHistoryAltered = true;\n window.history.back();\n\n setTimeout(() => {\n historyState.nextStateIndexToReplace = -1;\n }, 400);\n }\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(indexRef.current), 1);\n\n isClosed.current = true;\n }\n } else {\n const prev = prevHashes || [];\n if (prev.length < hashes.length) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes.push(index);\n\n window.history.pushState({\n index,\n state: currentState,\n }, '', `#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current.push({\n index,\n hash: hashes[hashes.length - 1],\n });\n }, 0);\n } else {\n const delta = prev.length - hashes.length;\n if (isHashChangedFromEvent.current) {\n isHashChangedFromEvent.current = false;\n } else {\n if (hashes.length !== indexHashRef.current.length) {\n if (delta > 0) {\n const last = indexHashRef.current[indexHashRef.current.length - delta - 1];\n let realDelta = delta;\n if (last) {\n const indexLast = historyState.currentIndexes.findIndex(\n (l) => l === last.index,\n );\n realDelta = historyState.currentIndexes.length - indexLast - 1;\n }\n historyState.isHistoryAltered = true;\n window.history.go(-realDelta);\n const removed = indexHashRef.current.splice(indexHashRef.current.length - delta - 1, delta);\n removed.forEach(({ index }) => {\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(index), 1);\n });\n }\n }\n\n if (hashes.length > 0) {\n setTimeout(() => {\n const index = ++historyState.currentIndex;\n historyState.currentIndexes[historyState.currentIndexes.length - 1] = index;\n\n window.history.replaceState({\n index,\n state: currentState,\n }, '', `${PATH_BASE}#${hashes[hashes.length - 1]}`);\n\n indexHashRef.current[indexHashRef.current.length - 1] = {\n index,\n hash: hashes[hashes.length - 1],\n };\n }, 0);\n }\n }\n }\n }\n }, [currentState, hashes, isActive, prevHashes, shouldReplaceNext]);\n\n useEffect(() => {\n const handlePopState = (event: PopStateEvent) => {\n if (historyState.isHistoryAltered) {\n setTimeout(() => {\n historyState.isHistoryAltered = false;\n }, 0);\n return;\n }\n const { index: i } = event.state;\n const index = i || 0;\n try {\n const currIndex = hashes ? indexHashRef.current[indexHashRef.current.length - 1].index : indexRef.current;\n\n const prev = historyState.currentIndexes[historyState.currentIndexes.indexOf(currIndex) - 1];\n\n if (historyState.isDisabled) return;\n\n if ((!isClosed.current && (index === 0 || index === prev)) || (hashes && (index === 0 || index === prev))) {\n if (hashes) {\n isHashChangedFromEvent.current = true;\n indexHashRef.current.pop();\n }\n\n historyState.currentIndexes.splice(historyState.currentIndexes.indexOf(currIndex), 1);\n\n if (onBack) {\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onBack(!historyState.isEdge);\n isClosed.current = true;\n }\n } else if (index === currIndex && isClosed.current && onForward && !hashes) {\n isForward.current = true;\n if (historyState.isEdge) {\n getDispatch()\n .disableHistoryAnimations();\n }\n onForward(event.state.state);\n }\n } catch (e) {\n // Forward navigation for hashed is not supported\n }\n };\n\n const hasChanged = hashes\n ? (!prevHashes || !areSortedArraysEqual(prevHashes, hashes))\n : prevIsActive !== isActive;\n\n if (!historyState.isDisabled && hasChanged) {\n handleChange();\n }\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, [\n currentState, handleChange, hashes, isActive, onBack, onForward, prevHashes, prevIsActive, shouldReplaceNext,\n ]);\n\n return {\n forceClose: () => handleChange(true),\n };\n}\n","import { RefObject } from 'react';\nimport { useState, useCallback, useEffect } from '../lib/teact/teact';\n\nconst useKeyboardListNavigation = (\n elementRef: RefObject<HTMLElement>,\n isOpen: boolean,\n onSelectWithEnter?: (index: number) => void,\n itemSelector?: string,\n noCaptureFocus?: boolean,\n) => {\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n useEffect(() => {\n setFocusedIndex(-1);\n\n const element = elementRef.current;\n if (isOpen && element && !noCaptureFocus) {\n element.tabIndex = -1;\n element.focus();\n }\n }, [elementRef, isOpen, noCaptureFocus]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent<any>) => {\n const element = elementRef.current;\n\n if (!element) {\n return;\n }\n\n if (e.keyCode === 13 && onSelectWithEnter) {\n onSelectWithEnter(focusedIndex);\n return;\n }\n\n if (e.keyCode !== 38 && e.keyCode !== 40) {\n return;\n }\n\n const focusedElement = document.activeElement;\n const elementChildren = Array.from(itemSelector ? element.querySelectorAll(itemSelector) : element.children);\n\n let newIndex = (focusedElement && elementChildren.indexOf(focusedElement)) || focusedIndex;\n\n if (e.keyCode === 38 && newIndex > 0) {\n newIndex--;\n } else if (e.keyCode === 40 && newIndex < elementChildren.length - 1) {\n newIndex++;\n } else if (elementChildren.length === 1) {\n newIndex = 0;\n } else {\n return;\n }\n\n const item = elementChildren[newIndex] as HTMLElement;\n if (item) {\n setFocusedIndex(newIndex);\n item.focus();\n }\n }, [elementRef, onSelectWithEnter, itemSelector, focusedIndex]);\n\n return handleKeyDown;\n};\n\nexport default useKeyboardListNavigation;\n","import * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nconst useLang = (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\n\nexport default useLang;\n","import { useEffect } from '../lib/teact/teact';\n\nimport {\n BundleModules, Bundles, getModuleFromMemory, loadModule, addLoadListener,\n} from '../util/moduleLoader';\n\nimport useForceUpdate from './useForceUpdate';\n\nconst useModuleLoader = <B extends Bundles, M extends BundleModules<B>>(\n bundleName: B, moduleName: M, noLoad = false, autoUpdate = false,\n) => {\n const module = getModuleFromMemory(bundleName, moduleName);\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n if (!autoUpdate) {\n return undefined;\n }\n\n return addLoadListener(forceUpdate);\n }, [autoUpdate, forceUpdate]);\n\n useEffect(() => {\n if (!noLoad && !module) {\n loadModule(bundleName, moduleName).then(forceUpdate);\n }\n }, [bundleName, forceUpdate, module, moduleName, noLoad]);\n\n return module;\n};\n\nexport default useModuleLoader;\n","import usePrevious from './usePrevious';\n\nconst useOnChange = <T extends any[]>(cb: (args: T | []) => void, dependencies: T) => {\n const prevDeps = usePrevious<T>(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n cb(prevDeps || []);\n }\n};\n\nexport default useOnChange;\n","import { useRef } from '../lib/teact/teact';\n\nfunction usePrevious<T extends any>(next: T): T | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined: true): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean): Exclude<T, undefined> | undefined;\nfunction usePrevious<T extends any>(next: T, shouldSkipUndefined?: boolean) {\n const ref = useRef<T>();\n const { current } = ref;\n if (!shouldSkipUndefined || next !== undefined) {\n ref.current = next;\n }\n\n return current;\n}\n\nexport default usePrevious;\n","import { useRef, useState } from '../lib/teact/teact';\nimport buildClassName from '../util/buildClassName';\n\nconst CLOSE_DURATION = 350;\n\nconst useShowTransition = (\n isOpen = false,\n onCloseTransitionEnd?: () => void,\n noOpenTransition = false,\n className: string | false = 'fast',\n noCloseTransition = false,\n) => {\n const [isClosed, setIsClosed] = useState(!isOpen);\n const closeTimeoutRef = useRef<number>();\n // СSS class should be added in a separate tick to turn on CSS transition.\n const [hasOpenClassName, setHasOpenClassName] = useState(isOpen && noOpenTransition);\n\n if (isOpen) {\n setIsClosed(false);\n setHasOpenClassName(true);\n\n if (closeTimeoutRef.current) {\n window.clearTimeout(closeTimeoutRef.current);\n closeTimeoutRef.current = undefined;\n }\n } else {\n setHasOpenClassName(false);\n\n if (!isClosed && !closeTimeoutRef.current) {\n const exec = () => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n };\n\n if (noCloseTransition) {\n exec();\n } else {\n closeTimeoutRef.current = window.setTimeout(exec, CLOSE_DURATION);\n }\n }\n }\n\n // `noCloseTransition`, when set to true, should remove the open class immediately\n const shouldHaveOpenClassName = hasOpenClassName && !(noCloseTransition && !isOpen);\n const isClosing = Boolean(closeTimeoutRef.current);\n const shouldRender = isOpen || isClosing;\n const transitionClassNames = buildClassName(\n className && 'opacity-transition',\n className,\n shouldHaveOpenClassName && 'open',\n shouldRender && 'shown',\n isClosing && 'closing',\n );\n\n return {\n shouldRender,\n transitionClassNames,\n };\n};\n\nexport default useShowTransition;\n","import { RefObject } from 'react';\nimport { useEffect } from '../lib/teact/teact';\n\nconst BACKDROP_CLASSNAME = 'backdrop';\n\n// This effect implements closing menus by clicking outside of them\n// without adding extra elements to the DOM\nexport default function useVirtualBackdrop(\n isOpen: boolean,\n menuRef: RefObject<HTMLElement>,\n onClose?: () => void | undefined,\n) {\n useEffect(() => {\n const handleEvent = (e: Event) => {\n const menu = menuRef.current;\n const target = e.target as HTMLElement | null;\n if (!menu || !target) {\n return;\n }\n\n if (\n !menu.contains(e.target as Node | null)\n || target.classList.contains(BACKDROP_CLASSNAME)\n ) {\n e.preventDefault();\n e.stopPropagation();\n if (onClose) {\n onClose();\n }\n }\n };\n\n if (isOpen && onClose) {\n document.addEventListener('mousedown', handleEvent);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleEvent);\n };\n }, [isOpen, menuRef, onClose]);\n}\n","import { DEBUG } from '../../config';\n\ntype Handler = (e: Event) => void;\ntype DelegationRegistry = Map<HTMLElement, Handler>;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst documentEventCounters: Record<string, number> = {};\nconst delegationRegistryByEventType: Record<string, DelegationRegistry> = {};\nconst delegatedEventTypesByElement = new Map<HTMLElement, Set<string>>();\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n addDelegatedListener(eventType, element, handler);\n } else {\n element.addEventListener(eventType, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventType = resolveEventType(propName, element);\n if (canUseEventDelegation(eventType, element, asCapture)) {\n removeDelegatedListener(eventType, element);\n } else {\n element.removeEventListener(eventType, handler, asCapture);\n }\n}\n\nfunction resolveEventType(propName: string, element: HTMLElement) {\n const eventType = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventType === 'change' && element.tagName !== 'SELECT') {\n // React behavior repeated here.\n // https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput\n return 'input';\n }\n\n if (eventType === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventType === 'focus') {\n return 'focusin';\n }\n\n if (eventType === 'blur') {\n return 'focusout';\n }\n\n return eventType;\n}\n\nfunction canUseEventDelegation(realEventType: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventType)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventType: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventType]) {\n documentEventCounters[eventType] = 0;\n document.addEventListener(eventType, handleEvent);\n }\n\n resolveDelegationRegistry(eventType).set(element, handler);\n resolveDelegatedEventTypes(element).add(eventType);\n documentEventCounters[eventType]++;\n}\n\nfunction removeDelegatedListener(eventType: string, element: HTMLElement) {\n documentEventCounters[eventType]--;\n if (!documentEventCounters[eventType]) {\n // Synchronous deletion on 0 will cause perf degradation in the case of 1 element\n // which is not a real case, so it's ok to do it this way\n document.removeEventListener(eventType, handleEvent);\n }\n\n delegationRegistryByEventType[eventType].delete(element);\n delegatedEventTypesByElement.get(element)!.delete(eventType);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventTypes = delegatedEventTypesByElement.get(element);\n if (!eventTypes) {\n return;\n }\n\n eventTypes.forEach((eventType) => removeDelegatedListener(eventType, element));\n delegatedEventTypesByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistryByEventType[realEvent.type];\n\n if (events) {\n let furtherCallsPrevented = false;\n let current: HTMLElement = realEvent.target as HTMLElement;\n\n const stopPropagation = () => {\n furtherCallsPrevented = true;\n };\n\n const preventDefault = () => {\n realEvent.preventDefault();\n };\n\n // Proxy is a simplest way to provide an access to the event property\n const event = new Proxy(realEvent, {\n get(target, p) {\n if (p === 'currentTarget') {\n return current;\n }\n if (p === 'stopPropagation' || p === 'stopImmediatePropagation') {\n return stopPropagation;\n }\n if (p === 'preventDefault') {\n // \"this\" is changed to proxy and one can't call methods via it\n return preventDefault;\n }\n return Reflect.get(target, p);\n },\n });\n\n // This can also be limited by teact root\n while (current && current !== document.body) {\n const handler = events.get(current);\n if (handler) {\n handler(event);\n if (furtherCallsPrevented) {\n return;\n }\n }\n\n current = current.parentNode as HTMLElement;\n }\n }\n}\n\nfunction resolveDelegationRegistry(eventType: string) {\n if (!delegationRegistryByEventType[eventType]) {\n delegationRegistryByEventType[eventType] = new Map();\n }\n\n return delegationRegistryByEventType[eventType];\n}\n\nfunction resolveDelegatedEventTypes(element: HTMLElement) {\n const existing = delegatedEventTypesByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set<string>();\n delegatedEventTypesByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n const documentListenersCount = Object.keys(documentEventCounters).length;\n const delegatedHandlersCount1 = Object.values(documentEventCounters)\n .reduce((acc, counter) => acc + counter, 0);\n const delegationRegistriesCount = Object.keys(delegationRegistryByEventType).length;\n const delegatedHandlersCount2 = Object.values(delegationRegistryByEventType)\n .reduce((acc, delegationRegistry) => acc + delegationRegistry.size, 0);\n const delegationElementsCount = delegatedEventTypesByElement.size;\n const delegatedEventTypesCount = Array.from(delegatedEventTypesByElement.values())\n .reduce((acc, eventTypes) => acc + eventTypes.size, 0);\n\n // eslint-disable-next-line no-console\n console.warn('DELEGATED EVENTS STATS', {\n delegatedHandlersCount1,\n delegatedHandlersCount2,\n delegatedEventTypesCount,\n delegationRegistriesCount,\n delegationElementsCount,\n documentListenersCount,\n });\n });\n}\n","import {\n hasElementChanged,\n isComponentElement,\n isEmptyElement,\n isRealElement,\n isTextElement,\n mountComponent,\n renderComponent,\n unmountTree,\n getTarget,\n setTarget,\n VirtualElement,\n VirtualElementComponent,\n VirtualRealElement,\n} from './teact';\nimport generateIdFor from '../../util/generateIdFor';\nimport { DEBUG } from '../../config';\nimport { addEventListener, removeEventListener } from './dom-events';\n\ntype VirtualDomHead = {\n children: [VirtualElement] | [];\n};\n\nconst FILTERED_ATTRIBUTES = new Set(['key', 'ref', 'teactFastList', 'teactOrderKey']);\nconst HTML_ATTRIBUTES = new Set(['dir', 'role']);\nconst MAPPED_ATTRIBUTES: { [k: string]: string } = {\n autoPlay: 'autoplay',\n autoComplete: 'autocomplete',\n};\nconst INDEX_KEY_PREFIX = '__indexKey#';\n\nconst headsByElement: Record<string, VirtualDomHead> = {};\n// eslint-disable-next-line @typescript-eslint/naming-convention\nlet DEBUG_virtualTreeSize = 1;\n\nfunction render($element?: VirtualElement, parentEl?: HTMLElement | null) {\n if (!parentEl) {\n return undefined;\n }\n\n let headId = parentEl.getAttribute('data-teact-head-id');\n if (!headId) {\n headId = generateIdFor(headsByElement);\n headsByElement[headId] = { children: [] };\n parentEl.setAttribute('data-teact-head-id', headId);\n }\n\n const $head = headsByElement[headId];\n $head.children = [renderWithVirtual(parentEl, $head.children[0], $element, $head, 0) as VirtualElement];\n\n if (process.env.APP_ENV === 'perf') {\n DEBUG_virtualTreeSize = 0;\n DEBUG_addToVirtualTreeSize($head);\n\n return DEBUG_virtualTreeSize;\n }\n\n return undefined;\n}\n\nfunction renderWithVirtual(\n parentEl: HTMLElement,\n $current: VirtualElement | undefined,\n $new: VirtualElement | undefined,\n $parent: VirtualRealElement | VirtualDomHead,\n index: number,\n {\n skipComponentUpdate = false,\n forceIndex = false,\n fragment,\n moveDirection,\n }: {\n skipComponentUpdate?: boolean;\n forceIndex?: boolean;\n fragment?: DocumentFragment;\n moveDirection?: 'up' | 'down';\n } = {},\n) {\n const isCurrentComponent = $current && isComponentElement($current);\n const isNewComponent = $new && isComponentElement($new);\n\n if (\n !skipComponentUpdate\n && isCurrentComponent && isNewComponent\n && !hasElementChanged($current!, $new!)\n ) {\n $new = updateComponent($current as VirtualElementComponent, $new as VirtualElementComponent);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && isNewComponent && ($new as VirtualElementComponent).componentInstance.isMounted) {\n setupComponentUpdateListener($new as VirtualElementComponent, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isNewComponent) {\n $new = initComponent($new as VirtualElementComponent, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n\n if (forceIndex && parentEl.childNodes[index]) {\n parentEl.insertBefore(node, parentEl.childNodes[index]);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n } else if ($current && !$new) {\n parentEl.removeChild(getTarget($current)!);\n unmountTree($current);\n } else if ($current && $new) {\n if (hasElementChanged($current, $new)) {\n if (isNewComponent) {\n $new = initComponent($new as VirtualElementComponent, $parent, index, parentEl);\n }\n\n const node = createNode($new);\n setTarget($new, node);\n parentEl.replaceChild(node, getTarget($current)!);\n unmountTree($current);\n } else {\n const areComponents = isCurrentComponent && isNewComponent;\n const currentTarget = getTarget($current);\n\n if (!areComponents) {\n setTarget($new, currentTarget!);\n setTarget($current, undefined as any); // Help GC\n\n if ('props' in $current && 'props' in $new) {\n $new.props.ref = $current.props.ref;\n }\n }\n\n if (isRealElement($new)) {\n if (moveDirection) {\n const node = currentTarget!;\n const nextSibling = parentEl.childNodes[moveDirection === 'up' ? index : index + 1];\n\n if (nextSibling) {\n parentEl.insertBefore(node, nextSibling);\n } else {\n (fragment || parentEl).appendChild(node);\n }\n }\n\n if (!areComponents) {\n updateAttributes(($current as VirtualRealElement), $new, currentTarget as HTMLElement);\n }\n\n $new.children = renderChildren(\n ($current as VirtualRealElement),\n $new,\n areComponents ? parentEl : currentTarget as HTMLElement,\n );\n }\n }\n }\n\n return $new;\n}\n\nfunction initComponent(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n if (!isComponentElement($element)) {\n return $element;\n }\n\n const { componentInstance } = $element;\n\n if (!componentInstance.isMounted) {\n $element = mountComponent(componentInstance);\n setupComponentUpdateListener($element, $parent, index, parentEl);\n\n const $firstChild = $element.children[0];\n if (isComponentElement($firstChild)) {\n $element.children = [initComponent($firstChild, $element, 0, parentEl)];\n }\n\n componentInstance.isMounted = true;\n }\n\n return $element;\n}\n\nfunction updateComponent($current: VirtualElementComponent, $new: VirtualElementComponent) {\n $current.componentInstance.props = $new.componentInstance.props;\n\n return renderComponent($current.componentInstance);\n}\n\nfunction setupComponentUpdateListener(\n $element: VirtualElementComponent, $parent: VirtualRealElement | VirtualDomHead, index: number, parentEl: HTMLElement,\n) {\n const { componentInstance } = $element;\n\n componentInstance.onUpdate = () => {\n $parent.children[index] = renderWithVirtual(\n parentEl,\n $parent.children[index],\n componentInstance.$element,\n $parent,\n index,\n { skipComponentUpdate: true },\n ) as VirtualElementComponent;\n };\n}\n\nfunction createNode($element: VirtualElement): Node {\n if (isEmptyElement($element)) {\n return document.createTextNode('');\n }\n\n if (isTextElement($element)) {\n return document.createTextNode($element.value);\n }\n\n if (isComponentElement($element)) {\n return createNode($element.children[0] as VirtualElement);\n }\n\n const { tag, props, children = [] } = $element;\n const element = document.createElement(tag);\n\n if (typeof props.ref === 'object') {\n props.ref.current = element;\n }\n\n Object.entries(props).forEach(([key, value]) => {\n if (props[key] !== undefined) {\n setAttribute(element, key, value);\n }\n });\n\n $element.children = children.map(($child, i) => (\n renderWithVirtual(element, undefined, $child, $element, i) as VirtualElement\n ));\n\n return element;\n}\n\nfunction renderChildren(\n $current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement,\n) {\n if ($new.props.teactFastList) {\n return renderFastListChildren($current, $new, currentEl);\n }\n\n const currentChildrenLength = $current.children.length;\n const newChildrenLength = $new.children.length;\n const maxLength = Math.max(currentChildrenLength, newChildrenLength);\n const newChildren = [];\n const fragment = newChildrenLength > currentChildrenLength + 1 ? document.createDocumentFragment() : undefined;\n\n for (let i = 0; i < maxLength; i++) {\n const $newChild = renderWithVirtual(\n currentEl,\n $current.children[i],\n $new.children[i],\n $new,\n i,\n i >= currentChildrenLength ? { fragment } : undefined,\n );\n\n if ($newChild) {\n newChildren.push($newChild);\n }\n }\n\n if (fragment) {\n currentEl.appendChild(fragment);\n }\n\n return newChildren;\n}\n\nfunction renderFastListChildren($current: VirtualRealElement, $new: VirtualRealElement, currentEl: HTMLElement) {\n const newKeys = new Set(\n $new.children.map(($newChild) => {\n const key = 'props' in $newChild && $newChild.props.key;\n\n // eslint-disable-next-line no-null/no-null\n if (DEBUG && isRealElement($newChild) && (key === undefined || key === null)) {\n // eslint-disable-next-line no-console\n console.warn('Missing `key` in `teactFastList`');\n }\n\n return key;\n }),\n );\n\n let currentRemainingIndex = 0;\n const remainingByKey = $current.children\n .reduce((acc, $currentChild, i) => {\n let key = 'props' in $currentChild ? $currentChild.props.key : undefined;\n // eslint-disable-next-line no-null/no-null\n const isKeyPresent = key !== undefined && key !== null;\n\n // First we handle removed children\n if (isKeyPresent && !newKeys.has(key)) {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n } else if (!isKeyPresent) {\n const $newChild = $new.children[i];\n const newChildKey = ($newChild && 'props' in $newChild) ? $newChild.props.key : undefined;\n // If a non-key element remains at the same index we preserve it with a virtual `key`\n if ($newChild && !newChildKey) {\n key = `${INDEX_KEY_PREFIX}${i}`;\n } else {\n renderWithVirtual(currentEl, $currentChild, undefined, $new, -1);\n\n return acc;\n }\n }\n\n // Then we build up info about remaining children\n acc[key] = {\n $element: $currentChild,\n index: currentRemainingIndex++,\n order: 'props' in $currentChild ? $currentChild.props.teactOrderKey : undefined,\n };\n return acc;\n }, {} as Record<string, { $element: VirtualElement; index: number; order?: number }>);\n\n let newChildren: VirtualElement[] = [];\n\n let fragmentQueue: VirtualElement[] | undefined;\n let fragmentIndex: number | undefined;\n\n let currentPreservedIndex = 0;\n\n $new.children.forEach(($newChild, i) => {\n const key = 'props' in $newChild ? $newChild.props.key : `${INDEX_KEY_PREFIX}${i}`;\n const currentChildInfo = remainingByKey[key];\n\n if (!currentChildInfo) {\n // All new nodes are queued to be inserted with fragments if possible.\n if (!fragmentQueue) {\n fragmentQueue = [];\n fragmentIndex = i;\n }\n\n fragmentQueue.push($newChild);\n return;\n }\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n fragmentIndex = undefined;\n fragmentQueue = undefined;\n }\n\n // This is a \"magic\" `teactOrderKey` property that tells us the element is updated\n const order = 'props' in $newChild ? $newChild.props.teactOrderKey : undefined;\n const shouldMoveNode = currentChildInfo.index !== currentPreservedIndex && currentChildInfo.order !== order;\n const isMovingDown = shouldMoveNode && currentPreservedIndex > currentChildInfo.index;\n\n // When the node goes down, preserved indexing actually breaks, so the \"magic\" should help.\n if (!shouldMoveNode || isMovingDown) {\n currentPreservedIndex++;\n }\n\n newChildren.push(\n renderWithVirtual(currentEl, currentChildInfo.$element, $newChild, $new, i, {\n forceIndex: true,\n moveDirection: shouldMoveNode ? (isMovingDown ? 'down' : 'up') : undefined,\n })!,\n );\n });\n\n if (fragmentQueue) {\n newChildren = newChildren.concat(flushFragmentQueue(fragmentQueue, fragmentIndex!, currentEl, $new));\n }\n\n return newChildren;\n}\n\nfunction flushFragmentQueue(\n fragmentQueue: VirtualElement[], fragmentIndex: number, parentEl: HTMLElement, $parent: VirtualRealElement,\n) {\n if (fragmentQueue.length === 1) {\n return [renderWithVirtual(parentEl, undefined, fragmentQueue[0], $parent, fragmentIndex, { forceIndex: true })!];\n } else if (fragmentQueue.length > 1) {\n const fragment = document.createDocumentFragment();\n const newChildren = fragmentQueue.map(($fragmentChild) => (\n renderWithVirtual(parentEl, undefined, $fragmentChild, $parent, fragmentIndex!, { fragment })!\n ));\n\n if (parentEl.childNodes[fragmentIndex]) {\n parentEl.insertBefore(fragment, parentEl.childNodes[fragmentIndex]);\n } else {\n parentEl.appendChild(fragment);\n }\n\n return newChildren;\n }\n\n throw new Error('Unexpected input');\n}\n\nfunction updateAttributes($current: VirtualRealElement, $new: VirtualRealElement, element: HTMLElement) {\n const currentEntries = Object.entries($current.props);\n const newEntries = Object.entries($new.props);\n\n currentEntries.forEach(([key, currentValue]) => {\n const newValue = $new.props[key];\n\n if (\n currentValue !== undefined\n && (\n newValue === undefined\n || (currentValue !== newValue && key.startsWith('on'))\n )\n ) {\n removeAttribute(element, key, currentValue);\n }\n });\n\n newEntries.forEach(([key, newValue]) => {\n const currentValue = $current.props[key];\n\n if (newValue !== undefined && newValue !== currentValue) {\n setAttribute(element, key, newValue);\n }\n });\n}\n\nfunction setAttribute(element: HTMLElement, key: string, value: any) {\n // An optimization attempt\n if (key === 'className') {\n element.className = value;\n // An optimization attempt\n } else if (key === 'value') {\n if ((element as HTMLInputElement).value !== value) {\n (element as HTMLInputElement).value = value;\n }\n } else if (key === 'style') {\n element.style.cssText = value;\n } else if (key === 'dangerouslySetInnerHTML') {\n // eslint-disable-next-line no-underscore-dangle\n element.innerHTML = value.__html;\n } else if (key.startsWith('on')) {\n addEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || key.startsWith('aria-') || HTML_ATTRIBUTES.has(key)) {\n element.setAttribute(key, value);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n (element as any)[MAPPED_ATTRIBUTES[key] || key] = value;\n }\n}\n\nfunction removeAttribute(element: HTMLElement, key: string, value: any) {\n if (key === 'className') {\n element.className = '';\n } else if (key === 'value') {\n (element as HTMLInputElement).value = '';\n } else if (key === 'style') {\n element.style.cssText = '';\n } else if (key === 'dangerouslySetInnerHTML') {\n element.innerHTML = '';\n } else if (key.startsWith('on')) {\n removeEventListener(element, key, value, key.endsWith('Capture'));\n } else if (key.startsWith('data-') || key.startsWith('aria-') || HTML_ATTRIBUTES.has(key)) {\n element.removeAttribute(key);\n } else if (!FILTERED_ATTRIBUTES.has(key)) {\n delete (element as any)[MAPPED_ATTRIBUTES[key] || key];\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nfunction DEBUG_addToVirtualTreeSize($current: VirtualRealElement | VirtualDomHead) {\n DEBUG_virtualTreeSize += $current.children.length;\n\n $current.children.forEach(($child) => {\n if (isRealElement($child)) {\n DEBUG_addToVirtualTreeSize($child);\n }\n });\n}\n\nconst TeactDOM = { render };\nexport default TeactDOM;\n","import { DEBUG, DEBUG_MORE } from '../../config';\nimport {\n fastRaf, fastRafPrimary, onTickEnd, onTickEndPrimary, throttleWithPrimaryRaf, throttleWithRaf,\n} from '../../util/schedulers';\nimport { flatten, orderBy } from '../../util/iteratees';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { handleError } from '../../util/handleError';\nimport { removeAllDelegatedListeners } from './dom-events';\n\nexport type Props = AnyLiteral;\nexport type FC<P extends Props = any> = (props: P) => any;\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport type FC_withDebug = FC & {\n DEBUG_contentComponentName?: string;\n};\n\nexport enum VirtualElementTypesEnum {\n Empty,\n Text,\n Tag,\n Component,\n}\n\ninterface VirtualElementEmpty {\n type: VirtualElementTypesEnum.Empty;\n target?: Node;\n}\n\ninterface VirtualElementText {\n type: VirtualElementTypesEnum.Text;\n target?: Node;\n value: string;\n}\n\nexport interface VirtualElementTag {\n type: VirtualElementTypesEnum.Tag;\n target?: Node;\n tag: string;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport interface VirtualElementComponent {\n type: VirtualElementTypesEnum.Component;\n componentInstance: ComponentInstance;\n props: Props;\n children: VirtualElementChildren;\n}\n\nexport type StateHookSetter<T> = (newValue: ((current: T) => T) | T) => void;\n\ninterface ComponentInstance {\n $element: VirtualElementComponent;\n Component: FC;\n name: string;\n props: Props;\n renderedValue?: any;\n isMounted: boolean;\n hooks: {\n state: {\n cursor: number;\n byCursor: {\n value: any;\n nextValue: any;\n setter: StateHookSetter<any>;\n }[];\n };\n effects: {\n cursor: number;\n byCursor: {\n effect: () => void;\n dependencies?: readonly any[];\n cleanup?: Function;\n }[];\n };\n memos: {\n cursor: number;\n byCursor: {\n current: any;\n dependencies: any[];\n }[];\n };\n };\n prepareForFrame?: () => void;\n forceUpdate?: () => void;\n onUpdate?: () => void;\n}\n\nexport type VirtualElement =\n VirtualElementEmpty\n | VirtualElementText\n | VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualRealElement =\n VirtualElementTag\n | VirtualElementComponent;\nexport type VirtualElementChildren = VirtualElement[];\n\nconst Fragment = Symbol('Fragment');\n\nconst DEBUG_RENDER_THRESHOLD = 7;\nconst DEBUG_EFFECT_THRESHOLD = 7;\nconst DEBUG_SILENT_RENDERS_FOR = new Set(['TeactMemoWrapper', 'TeactNContainer', 'Button', 'ListItem', 'MenuItem']);\n\nlet renderingInstance: ComponentInstance;\n\nexport function isEmptyElement($element: VirtualElement): $element is VirtualElementEmpty {\n return $element.type === VirtualElementTypesEnum.Empty;\n}\n\nexport function isTextElement($element: VirtualElement): $element is VirtualElementText {\n return $element.type === VirtualElementTypesEnum.Text;\n}\n\nexport function isTagElement($element: VirtualElement): $element is VirtualElementTag {\n return $element.type === VirtualElementTypesEnum.Tag;\n}\n\nexport function isComponentElement($element: VirtualElement): $element is VirtualElementComponent {\n return $element.type === VirtualElementTypesEnum.Component;\n}\n\nexport function isRealElement($element: VirtualElement): $element is VirtualRealElement {\n return isTagElement($element) || isComponentElement($element);\n}\n\nfunction createElement(\n source: string | FC | typeof Fragment,\n props: Props,\n ...children: any[]\n): VirtualRealElement | VirtualElementChildren {\n if (!props) {\n props = {};\n }\n\n children = flatten(children);\n\n if (source === Fragment) {\n return children;\n } else if (typeof source === 'function') {\n return createComponentInstance(source, props, children);\n } else {\n return buildTagElement(source, props, children);\n }\n}\n\nfunction createComponentInstance(Component: FC, props: Props, children: any[]): VirtualElementComponent {\n let parsedChildren: any | any[] | undefined;\n if (children.length === 0) {\n parsedChildren = undefined;\n } else if (children.length === 1) {\n [parsedChildren] = children;\n } else {\n parsedChildren = children;\n }\n\n const componentInstance: ComponentInstance = {\n $element: {} as VirtualElementComponent,\n Component,\n name: Component.name,\n props: {\n ...props,\n ...(parsedChildren && { children: parsedChildren }),\n },\n isMounted: false,\n hooks: {\n state: {\n cursor: 0,\n byCursor: [],\n },\n effects: {\n cursor: 0,\n byCursor: [],\n },\n memos: {\n cursor: 0,\n byCursor: [],\n },\n },\n };\n\n componentInstance.$element = buildComponentElement(componentInstance);\n\n return componentInstance.$element;\n}\n\nfunction buildComponentElement(\n componentInstance: ComponentInstance,\n children: VirtualElementChildren = [],\n): VirtualElementComponent {\n const { props } = componentInstance;\n\n return {\n componentInstance,\n type: VirtualElementTypesEnum.Component,\n props,\n children,\n };\n}\n\nfunction buildTagElement(tag: string, props: Props, children: any[]): VirtualElementTag {\n return {\n type: VirtualElementTypesEnum.Tag,\n tag,\n props,\n children: dropEmptyTail(children).map(buildChildElement),\n };\n}\n\n// We only need placeholders in the middle of collection (to ensure other elements order).\nfunction dropEmptyTail(children: any[]) {\n let i = children.length - 1;\n\n for (; i >= 0; i--) {\n if (!isEmptyPlaceholder(children[i])) {\n break;\n }\n }\n\n return i + 1 < children.length ? children.slice(0, i + 1) : children;\n}\n\nfunction isEmptyPlaceholder(child: any) {\n // eslint-disable-next-line no-null/no-null\n return child === false || child === null || child === undefined;\n}\n\nfunction buildChildElement(child: any): VirtualElement {\n if (isEmptyPlaceholder(child)) {\n return buildEmptyElement();\n } else if (isRealElement(child)) {\n return child;\n } else {\n return buildTextElement(child);\n }\n}\n\nfunction buildTextElement(value: any): VirtualElementText {\n return {\n type: VirtualElementTypesEnum.Text,\n value: String(value),\n };\n}\n\nfunction buildEmptyElement(): VirtualElementEmpty {\n return { type: VirtualElementTypesEnum.Empty };\n}\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst DEBUG_components: AnyLiteral = {};\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn('COMPONENTS', orderBy(Object.values(DEBUG_components), 'renderCount', 'desc'));\n});\n\nexport function renderComponent(componentInstance: ComponentInstance) {\n renderingInstance = componentInstance;\n componentInstance.hooks.state.cursor = 0;\n componentInstance.hooks.effects.cursor = 0;\n componentInstance.hooks.memos.cursor = 0;\n\n const { Component, props } = componentInstance;\n let newRenderedValue;\n\n try {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n const componentName = componentInstance.name;\n if (!DEBUG_components[componentName]) {\n DEBUG_components[componentName] = {\n componentName,\n renderCount: 0,\n renderTimes: [],\n };\n }\n\n if (DEBUG_MORE) {\n if (!DEBUG_SILENT_RENDERS_FOR.has(componentName)) {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Render ${componentName}`);\n }\n }\n\n DEBUG_startAt = performance.now();\n }\n\n newRenderedValue = Component(props);\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_RENDER_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow component render: ${componentName}, ${Math.round(duration)} ms`);\n }\n DEBUG_components[componentName].renderTimes.push(duration);\n DEBUG_components[componentName].renderCount++;\n }\n } catch (err: any) {\n handleError(err);\n\n newRenderedValue = componentInstance.renderedValue;\n }\n\n if (componentInstance.isMounted && newRenderedValue === componentInstance.renderedValue) {\n return componentInstance.$element;\n }\n\n componentInstance.renderedValue = newRenderedValue;\n\n const newChild = buildChildElement(newRenderedValue);\n componentInstance.$element = buildComponentElement(componentInstance, [newChild]);\n\n return componentInstance.$element;\n}\n\nexport function hasElementChanged($old: VirtualElement, $new: VirtualElement) {\n if (typeof $old !== typeof $new) {\n return true;\n } else if ($old.type !== $new.type) {\n return true;\n } else if (isTextElement($old) && isTextElement($new)) {\n return $old.value !== $new.value;\n } else if (isTagElement($old) && isTagElement($new)) {\n return ($old.tag !== $new.tag) || ($old.props.key !== $new.props.key);\n } else if (isComponentElement($old) && isComponentElement($new)) {\n return (\n $old.componentInstance.Component !== $new.componentInstance.Component\n ) || (\n $old.props.key !== $new.props.key\n );\n }\n\n return false;\n}\n\nexport function unmountTree($element: VirtualElement) {\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else {\n if (isTagElement($element)) {\n if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n }\n\n if ($element.props.ref) {\n $element.props.ref.current = undefined; // Help GC\n }\n }\n\n if ($element.target) {\n $element.target = undefined; // Help GC\n }\n\n if (!isRealElement($element)) {\n return;\n }\n }\n\n $element.children.forEach(unmountTree);\n}\n\nexport function mountComponent(componentInstance: ComponentInstance) {\n renderComponent(componentInstance);\n componentInstance.isMounted = true;\n return componentInstance.$element;\n}\n\nfunction unmountComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n // We need to clean refs before running effect cleanups\n componentInstance.hooks.memos.byCursor.forEach((memoContainer) => {\n memoContainer.current = undefined;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err: any) {\n handleError(err);\n }\n }\n });\n\n componentInstance.isMounted = false;\n\n helpGc(componentInstance);\n}\n\n// We need to remove all references to DOM objects. We also clean all other references, just in case\nfunction helpGc(componentInstance: ComponentInstance) {\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = undefined;\n hook.effect = undefined as any;\n hook.dependencies = undefined;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = undefined;\n hook.nextValue = undefined;\n hook.setter = undefined as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = undefined as any;\n });\n\n componentInstance.hooks = undefined as any;\n componentInstance.$element = undefined as any;\n componentInstance.renderedValue = undefined;\n componentInstance.Component = undefined as any;\n componentInstance.props = undefined as any;\n componentInstance.forceUpdate = undefined;\n componentInstance.onUpdate = undefined;\n}\n\nfunction prepareComponentForFrame(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted) {\n return;\n }\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = hook.nextValue;\n });\n\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(() => prepareComponentForFrame(componentInstance));\n componentInstance.forceUpdate = throttleWithRaf(() => forceUpdateComponent(componentInstance));\n}\n\nfunction forceUpdateComponent(componentInstance: ComponentInstance) {\n if (!componentInstance.isMounted || !componentInstance.onUpdate) {\n return;\n }\n\n const currentElement = componentInstance.$element;\n\n renderComponent(componentInstance);\n\n if (componentInstance.$element !== currentElement) {\n componentInstance.onUpdate();\n }\n}\n\nexport function getTarget($element: VirtualElement): Node | undefined {\n if (isComponentElement($element)) {\n return getTarget($element.children[0]);\n } else {\n return $element.target;\n }\n}\n\nexport function setTarget($element: VirtualElement, target: Node) {\n if (isComponentElement($element)) {\n setTarget($element.children[0], target);\n } else {\n $element.target = target;\n }\n}\n\nexport function useState<T>(): [T, StateHookSetter<T>];\nexport function useState<T>(initial: T): [T, StateHookSetter<T>];\nexport function useState<T>(initial?: T): [T, StateHookSetter<T>] {\n const { cursor, byCursor } = renderingInstance.hooks.state;\n\n if (byCursor[cursor] === undefined) {\n byCursor[cursor] = {\n value: initial,\n nextValue: initial,\n setter: ((componentInstance) => (newValue: ((current: T) => T) | T) => {\n if (byCursor[cursor].nextValue !== newValue) {\n byCursor[cursor].nextValue = typeof newValue === 'function'\n ? (newValue as (current: T) => T)(byCursor[cursor].value)\n : newValue;\n\n if (!componentInstance.prepareForFrame || !componentInstance.forceUpdate) {\n componentInstance.prepareForFrame = throttleWithPrimaryRaf(\n () => prepareComponentForFrame(componentInstance),\n );\n componentInstance.forceUpdate = throttleWithRaf(\n () => forceUpdateComponent(componentInstance),\n );\n }\n\n componentInstance.prepareForFrame();\n componentInstance.forceUpdate();\n\n if (DEBUG_MORE) {\n if (componentInstance.name !== 'TeactNContainer') {\n // eslint-disable-next-line no-console\n console.log(\n '[Teact.useState]',\n componentInstance.name,\n // `componentInstance.Component` may be set to `null` by GC helper\n componentInstance.Component && (componentInstance.Component as FC_withDebug).DEBUG_contentComponentName\n ? `> ${(componentInstance.Component as FC_withDebug).DEBUG_contentComponentName}`\n : '',\n `Forced update at cursor #${cursor}, next value: `,\n byCursor[cursor].nextValue,\n );\n }\n }\n }\n })(renderingInstance),\n };\n }\n\n renderingInstance.hooks.state.cursor++;\n\n return [\n byCursor[cursor].value,\n byCursor[cursor].setter,\n ];\n}\n\nfunction useLayoutEffectBase(\n schedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n primarySchedulerFn: typeof onTickEnd | typeof requestAnimationFrame,\n effect: () => Function | void,\n dependencies?: readonly any[],\n debugKey?: string,\n) {\n const { cursor, byCursor } = renderingInstance.hooks.effects;\n const componentInstance = renderingInstance;\n\n function execCleanup() {\n if (!componentInstance.isMounted) {\n return;\n }\n\n const { cleanup } = byCursor[cursor];\n if (typeof cleanup === 'function') {\n try {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n cleanup();\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Teact] Slow cleanup at effect cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`,\n );\n }\n }\n } catch (err: any) {\n handleError(err);\n }\n }\n }\n\n function exec() {\n if (!componentInstance.isMounted) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n byCursor[cursor].cleanup = effect() as Function;\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startAt!;\n const componentName = componentInstance.name;\n if (duration > DEBUG_EFFECT_THRESHOLD) {\n // eslint-disable-next-line no-console\n console.warn(`[Teact] Slow effect at cursor #${cursor}: ${componentName}, ${Math.round(duration)} ms`);\n }\n }\n }\n\n if (byCursor[cursor] !== undefined && dependencies && byCursor[cursor].dependencies) {\n if (dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies![i])) {\n if (debugKey) {\n const causedBy = dependencies.reduce((res, newValue, i) => {\n const prevValue = byCursor[cursor].dependencies![i];\n if (newValue !== prevValue) {\n res.push(`${i}: ${prevValue} => ${newValue}`);\n }\n\n return res;\n }, []);\n\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by dependencies.`, causedBy.join(', '));\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\n if (debugKey) {\n // eslint-disable-next-line no-console\n console.log(`[Teact] Effect \"${debugKey}\" caused by missing dependencies.`);\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n\n byCursor[cursor] = {\n effect,\n dependencies,\n cleanup: byCursor[cursor] ? byCursor[cursor].cleanup : undefined,\n };\n\n renderingInstance.hooks.effects.cursor++;\n}\n\nexport function useEffect(effect: () => Function | void, dependencies?: readonly any[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, fastRafPrimary, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: readonly any[], debugKey?: string) {\n return useLayoutEffectBase(onTickEnd, onTickEndPrimary, effect, dependencies, debugKey);\n}\n\nexport function useMemo<T extends any>(resolver: () => T, dependencies: any[], debugKey?: string): T {\n const { cursor, byCursor } = renderingInstance.hooks.memos;\n let { current } = byCursor[cursor] || {};\n\n if (\n byCursor[cursor] === undefined\n || dependencies.some((dependency, i) => dependency !== byCursor[cursor].dependencies[i])\n ) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.useMemo] ${renderingInstance.name} (${debugKey}): Update is caused by:`,\n byCursor[cursor]\n ? getUnequalProps(dependencies, byCursor[cursor].dependencies).join(', ')\n : '[first render]',\n );\n }\n\n current = resolver();\n }\n\n byCursor[cursor] = {\n current,\n dependencies,\n };\n\n renderingInstance.hooks.memos.cursor++;\n\n return current;\n}\n\nexport function useCallback<F extends AnyFunction>(newCallback: F, dependencies: any[], debugKey?: string): F {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n return useMemo(() => newCallback, dependencies, debugKey);\n}\n\nexport function useRef<T>(initial: T): { current: T };\nexport function useRef<T>(): { current: T | undefined }; // TT way (empty is `undefined`)\nexport function useRef<T>(initial: null): { current: T | null }; // React way (empty is `null`)\n// eslint-disable-next-line no-null/no-null\nexport function useRef<T>(initial?: T | null) {\n return useMemo(() => ({\n current: initial,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }), []);\n}\n\nexport function memo<T extends FC>(Component: T, areEqual = arePropsShallowEqual, debugKey?: string) {\n return function TeactMemoWrapper(props: Props) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const propsRef = useRef(props);\n const renderedRef = useRef();\n\n if (!renderedRef.current || (propsRef.current && !areEqual(propsRef.current, props))) {\n if (DEBUG && debugKey) {\n // eslint-disable-next-line no-console\n console.log(\n `[Teact.memo] ${Component.name} (${debugKey}): Update is caused by:`,\n getUnequalProps(propsRef.current!, props).join(', '),\n );\n }\n\n propsRef.current = props;\n renderedRef.current = createElement(Component, props) as VirtualElementComponent;\n }\n\n return renderedRef.current;\n } as T;\n}\n\n// We need to keep it here for JSX.\nconst Teact = {\n createElement,\n Fragment,\n};\n\nexport default Teact;\n","import React, {\n FC, FC_withDebug, Props, useEffect, useState,\n} from './teact';\n\nimport { DEBUG, DEBUG_MORE } from '../../config';\nimport useForceUpdate from '../../hooks/useForceUpdate';\nimport generateIdFor from '../../util/generateIdFor';\nimport { fastRaf, throttleWithTickEnd } from '../../util/schedulers';\nimport arePropsShallowEqual, { getUnequalProps } from '../../util/arePropsShallowEqual';\nimport { orderBy } from '../../util/iteratees';\nimport {\n GlobalState, GlobalActions, ActionTypes, DispatchOptions,\n} from '../../global/types';\nimport { handleError } from '../../util/handleError';\nimport { isHeavyAnimating } from '../../hooks/useHeavyAnimationCheck';\n\nexport default React;\n\ntype ActionPayload = AnyLiteral;\n\ntype Reducer = (\n global: GlobalState,\n actions: GlobalActions,\n payload: any,\n) => GlobalState | void;\n\ntype MapStateToProps<OwnProps = undefined> = ((global: GlobalState, ownProps: OwnProps) => AnyLiteral);\n\nlet currentGlobal = {} as GlobalState;\n\nconst reducers: Record<string, Reducer[]> = {};\nconst callbacks: Function[] = [updateContainers];\nconst actions = {} as GlobalActions;\nconst containers = new Map<string, {\n mapStateToProps: MapStateToProps<any>;\n ownProps: Props;\n mappedProps?: Props;\n forceUpdate: Function;\n areMappedPropsChanged: boolean;\n DEBUG_updates: number;\n DEBUG_componentName: string;\n}>();\n\nconst runCallbacksThrottled = throttleWithTickEnd(runCallbacks);\n\nfunction runCallbacks(forceOnHeavyAnimation = false) {\n if (!forceOnHeavyAnimation && isHeavyAnimating()) {\n fastRaf(runCallbacksThrottled);\n return;\n }\n\n callbacks.forEach((cb) => cb(currentGlobal));\n}\n\nexport function setGlobal(newGlobal?: GlobalState, options?: DispatchOptions) {\n if (typeof newGlobal === 'object' && newGlobal !== currentGlobal) {\n currentGlobal = newGlobal;\n if (options?.forceSyncOnIOs) {\n runCallbacks(true);\n } else {\n runCallbacksThrottled(options?.forceOnHeavyAnimation);\n }\n }\n}\n\nexport function getGlobal() {\n return currentGlobal;\n}\n\nexport function getDispatch() {\n return actions;\n}\n\nfunction onDispatch(name: string, payload?: ActionPayload, options?: DispatchOptions) {\n if (reducers[name]) {\n reducers[name].forEach((reducer) => {\n const newGlobal = reducer(currentGlobal, actions, payload);\n if (newGlobal) {\n setGlobal(newGlobal, options);\n }\n });\n }\n}\n\nfunction updateContainers() {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startAt: number | undefined;\n if (DEBUG) {\n DEBUG_startAt = performance.now();\n }\n\n // eslint-disable-next-line no-restricted-syntax\n for (const container of containers.values()) {\n const {\n mapStateToProps, ownProps, mappedProps, forceUpdate,\n } = container;\n\n let newMappedProps;\n\n try {\n newMappedProps = mapStateToProps(currentGlobal, ownProps);\n } catch (err: any) {\n handleError(err);\n\n return;\n }\n\n if (DEBUG) {\n if (Object.values(newMappedProps).some(Number.isNaN)) {\n // eslint-disable-next-line no-console\n console.warn(\n // eslint-disable-next-line max-len\n `[TeactN] Some of \\`${container.DEBUG_componentName}\\` mappers contain NaN values. This may cause redundant updates because of incorrect equality check.`,\n );\n }\n }\n\n if (Object.keys(newMappedProps).length && !arePropsShallowEqual(mappedProps!, newMappedProps)) {\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log(\n '[TeactN] Will update',\n container.DEBUG_componentName,\n 'caused by',\n getUnequalProps(mappedProps!, newMappedProps).join(', '),\n );\n }\n\n container.mappedProps = newMappedProps;\n container.areMappedPropsChanged = true;\n container.DEBUG_updates++;\n\n forceUpdate();\n }\n }\n\n if (DEBUG) {\n const updateTime = performance.now() - DEBUG_startAt!;\n if (updateTime > 7) {\n // eslint-disable-next-line no-console\n console.warn(`[TeactN] Slow containers update: ${Math.round(updateTime)} ms`);\n }\n }\n}\n\nexport function addReducer(name: ActionTypes, reducer: Reducer) {\n if (!reducers[name]) {\n reducers[name] = [];\n\n actions[name] = (payload?: ActionPayload, options?: DispatchOptions) => {\n onDispatch(name, payload, options);\n };\n }\n\n reducers[name].push(reducer);\n}\n\nexport function addCallback(cb: Function) {\n callbacks.push(cb);\n}\n\nexport function removeCallback(cb: Function) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n}\n\nexport function withGlobal<OwnProps>(\n mapStateToProps: MapStateToProps<OwnProps> = () => ({}),\n) {\n return (Component: FC) => {\n return function TeactNContainer(props: OwnProps) {\n (TeactNContainer as FC_withDebug).DEBUG_contentComponentName = Component.name;\n\n const [id] = useState(generateIdFor(containers));\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n return () => {\n containers.delete(id);\n };\n }, [id]);\n\n let container = containers.get(id);\n if (!container) {\n container = {\n mapStateToProps,\n ownProps: props,\n areMappedPropsChanged: false,\n forceUpdate,\n DEBUG_updates: 0,\n DEBUG_componentName: Component.name,\n };\n\n containers.set(id, container);\n }\n\n if (container.areMappedPropsChanged) {\n container.areMappedPropsChanged = false;\n }\n\n if (!container.mappedProps || !arePropsShallowEqual(container.ownProps, props)) {\n container.ownProps = props;\n\n try {\n container.mappedProps = mapStateToProps(currentGlobal, props);\n } catch (err: any) {\n handleError(err);\n }\n }\n\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <Component {...container.mappedProps} {...props} />;\n };\n };\n}\n\nif (DEBUG) {\n (window as any).getGlobal = getGlobal;\n\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn(\n 'GLOBAL CONTAINERS',\n orderBy(\n Array.from(containers.values())\n .map(({ DEBUG_componentName, DEBUG_updates }) => ({ DEBUG_componentName, DEBUG_updates })),\n 'DEBUG_updates',\n 'desc',\n ),\n );\n });\n}\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n// Version 2c193ce 28.05.2021\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nexport function removeVS16s(rawEmoji) {\n return rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji;\n}\n\n// This file is generated by source/emoji/scripts/generate.sh\n// eslint-disable-next-line max-len\nexport default /(?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f|\\u2696\\ufe0f|\\u2708\\ufe0f|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)((?:\\ud83c[\\udffb-\\udfff]|\\ufe0f)\\u200d[\\u2640\\u2642]\\ufe0f)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f\\u200d\\u26a7\\ufe0f|\\ud83c\\udff3\\ufe0f\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f|\\u2764\\ufe0f\\u200d\\ud83d\\udd25|\\u2764\\ufe0f\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f|\\ud83e\\uddde\\u200d\\u2640\\ufe0f|\\ud83e\\uddde\\u200d\\u2642\\ufe0f|\\ud83e\\udddf\\u200d\\u2640\\ufe0f|\\ud83e\\udddf\\u200d\\u2642\\ufe0f|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f/g;\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { initApi, callApi } from '../../../api/gramjs';\nimport { GlobalState } from '../../../global/types';\n\nimport {\n LANG_CACHE_NAME,\n CUSTOM_BG_CACHE_NAME,\n MEDIA_CACHE_NAME,\n MEDIA_CACHE_NAME_AVATARS,\n MEDIA_PROGRESSIVE_CACHE_NAME,\n IS_TEST,\n} from '../../../config';\nimport { IS_MOV_SUPPORTED, IS_WEBM_SUPPORTED, PLATFORM_ENV } from '../../../util/environment';\nimport { unsubscribe } from '../../../util/notifications';\nimport * as cacheApi from '../../../util/cacheApi';\nimport { updateAppBadge } from '../../../util/appBadge';\nimport {\n storeSession,\n loadStoredSession,\n clearStoredSession,\n importLegacySession,\n clearLegacySessions,\n} from '../../../util/sessions';\nimport { forceWebsync } from '../../../util/websync';\n\naddReducer('initApi', (global: GlobalState, actions) => {\n (async () => {\n if (!IS_TEST) {\n await importLegacySession();\n void clearLegacySessions();\n }\n\n void initApi(actions.apiUpdate, {\n userAgent: navigator.userAgent,\n platform: PLATFORM_ENV,\n sessionData: loadStoredSession(),\n isTest: window.location.search.includes('test'),\n isMovSupported: IS_MOV_SUPPORTED,\n isWebmSupported: IS_WEBM_SUPPORTED,\n });\n })();\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n void callApi('provideAuthPhoneNumber', phoneNumber.replace(/[^\\d]/g, ''));\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthCode', (global, actions, payload) => {\n const { code } = payload!;\n\n void callApi('provideAuthCode', code);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('setAuthPassword', (global, actions, payload) => {\n const { password } = payload!;\n\n void callApi('provideAuthPassword', password);\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('uploadProfilePhoto', (global, actions, payload) => {\n const { file } = payload!;\n\n void callApi('uploadProfilePhoto', file);\n});\n\naddReducer('signUp', (global, actions, payload) => {\n const { firstName, lastName } = payload!;\n\n void callApi('provideAuthRegistration', { firstName, lastName });\n\n return {\n ...global,\n authIsLoading: true,\n authError: undefined,\n };\n});\n\naddReducer('returnToAuthPhoneNumber', (global) => {\n void callApi('restartAuth');\n\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('goToAuthQrCode', (global) => {\n void callApi('restartAuthWithQr');\n\n return {\n ...global,\n authIsLoadingQrCode: true,\n authError: undefined,\n };\n});\n\naddReducer('saveSession', (global, actions, payload) => {\n const { sessionData } = payload;\n\n if (sessionData) {\n storeSession(payload.sessionData, global.currentUserId);\n } else {\n clearStoredSession();\n }\n});\n\naddReducer('signOut', () => {\n (async () => {\n try {\n await unsubscribe();\n await callApi('destroy');\n await forceWebsync(false);\n } catch (err) {\n // Do nothing\n }\n\n getDispatch().reset();\n })();\n});\n\naddReducer('reset', () => {\n clearStoredSession();\n\n void cacheApi.clear(MEDIA_CACHE_NAME);\n void cacheApi.clear(MEDIA_CACHE_NAME_AVATARS);\n void cacheApi.clear(MEDIA_PROGRESSIVE_CACHE_NAME);\n void cacheApi.clear(CUSTOM_BG_CACHE_NAME);\n\n const langCachePrefix = LANG_CACHE_NAME.replace(/\\d+$/, '');\n const langCacheVersion = (LANG_CACHE_NAME.match(/\\d+$/) || [0])[0];\n for (let i = 0; i < langCacheVersion; i++) {\n void cacheApi.clear(`${langCachePrefix}${i === 0 ? '' : i}`);\n }\n\n void clearLegacySessions();\n\n updateAppBadge(0);\n\n getDispatch().init();\n});\n\naddReducer('disconnect', () => {\n (async () => {\n await callApi('disconnect');\n })();\n});\n\naddReducer('loadNearestCountry', (global) => {\n if (global.connectionState !== 'connectionStateReady') {\n return;\n }\n\n (async () => {\n const authNearestCountry = await callApi('fetchNearestCountry');\n\n setGlobal({\n ...getGlobal(),\n authNearestCountry,\n });\n })();\n});\n\naddReducer('setDeviceToken', (global, actions, deviceToken) => {\n setGlobal({\n ...global,\n push: {\n deviceToken,\n subscribedAt: Date.now(),\n },\n });\n});\n\naddReducer('deleteDeviceToken', (global) => {\n const newGlobal = { ...global };\n delete newGlobal.push;\n setGlobal(newGlobal);\n});\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\nimport {\n ApiPrivacyKey, PrivacyVisibility, ProfileEditProgress, InputPrivacyRules, InputPrivacyContact,\n UPLOADING_WALLPAPER_SLUG,\n} from '../../../types';\n\nimport { COUNTRIES_WITH_12H_TIME_FORMAT } from '../../../config';\nimport { callApi } from '../../../api/gramjs';\nimport { buildCollectionByKey } from '../../../util/iteratees';\nimport { subscribe, unsubscribe } from '../../../util/notifications';\nimport { setTimeFormat } from '../../../util/langProvider';\nimport { selectUser } from '../../selectors';\nimport {\n addUsers, addBlockedContact, updateChats, updateUser, removeBlockedContact, replaceSettings, updateNotifySettings,\n addNotifyExceptions,\n} from '../../reducers';\nimport { isUserId } from '../../helpers';\n\naddReducer('updateProfile', (global, actions, payload) => {\n const {\n photo, firstName, lastName, bio: about, username,\n } = payload!;\n\n (async () => {\n const { currentUserId } = global;\n if (!currentUserId) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.InProgress,\n },\n });\n\n if (photo) {\n await callApi('updateProfilePhoto', photo);\n }\n\n if (firstName || lastName || about) {\n const result = await callApi('updateProfile', { firstName, lastName, about });\n if (result) {\n global = getGlobal();\n const currentUser = currentUserId && selectUser(global, currentUserId);\n\n if (currentUser) {\n setGlobal(updateUser(\n global,\n currentUser.id,\n {\n firstName,\n lastName,\n fullInfo: {\n ...currentUser.fullInfo,\n bio: about,\n },\n },\n ));\n }\n }\n }\n\n if (username) {\n const result = await callApi('updateUsername', username);\n if (result && currentUserId) {\n setGlobal(updateUser(getGlobal(), currentUserId, { username }));\n }\n }\n\n setGlobal({\n ...getGlobal(),\n profileEdit: {\n progress: ProfileEditProgress.Complete,\n },\n });\n })();\n});\n\naddReducer('checkUsername', (global, actions, payload) => {\n const { username } = payload!;\n\n (async () => {\n // No need to check the username if profile update is already in progress\n if (global.profileEdit && global.profileEdit.progress === ProfileEditProgress.InProgress) {\n return;\n }\n\n setGlobal({\n ...global,\n profileEdit: {\n progress: global.profileEdit ? global.profileEdit.progress : ProfileEditProgress.Idle,\n isUsernameAvailable: undefined,\n },\n });\n\n const isUsernameAvailable = await callApi('checkUsername', username);\n\n global = getGlobal();\n setGlobal({\n ...global,\n profileEdit: {\n ...global.profileEdit!,\n isUsernameAvailable,\n },\n });\n })();\n});\n\naddReducer('loadWallpapers', () => {\n (async () => {\n const result = await callApi('fetchWallpapers');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: result.wallpapers,\n },\n });\n })();\n});\n\naddReducer('uploadWallpaper', (global, actions, payload) => {\n const file = payload;\n const previewBlobUrl = URL.createObjectURL(file);\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n {\n slug: UPLOADING_WALLPAPER_SLUG,\n document: {\n fileName: '',\n size: file.size,\n mimeType: file.type,\n previewBlobUrl,\n },\n },\n ...(global.settings.loadedWallpapers || []),\n ],\n },\n });\n\n (async () => {\n const result = await callApi('uploadWallpaper', file);\n if (!result) {\n return;\n }\n\n const { wallpaper } = result;\n\n global = getGlobal();\n if (!global.settings.loadedWallpapers) {\n return;\n }\n\n const firstWallpaper = global.settings.loadedWallpapers[0];\n if (!firstWallpaper || firstWallpaper.slug !== UPLOADING_WALLPAPER_SLUG) {\n return;\n }\n\n const withLocalMedia = {\n ...wallpaper,\n document: {\n ...wallpaper.document,\n previewBlobUrl,\n },\n };\n\n setGlobal({\n ...global,\n settings: {\n ...global.settings,\n loadedWallpapers: [\n withLocalMedia,\n ...global.settings.loadedWallpapers.slice(1),\n ],\n },\n });\n })();\n});\n\naddReducer('loadBlockedContacts', () => {\n (async () => {\n const result = await callApi('fetchBlockedContacts');\n\n if (!result) {\n return;\n }\n\n let newGlobal = getGlobal();\n\n if (result.users?.length) {\n newGlobal = addUsers(newGlobal, buildCollectionByKey(result.users, 'id'));\n }\n if (result.chats?.length) {\n newGlobal = updateChats(newGlobal, buildCollectionByKey(result.chats, 'id'));\n }\n\n newGlobal = {\n ...newGlobal,\n blocked: {\n ...newGlobal.blocked,\n ids: [...(newGlobal.blocked.ids || []), ...result.blockedIds],\n totalCount: result.totalCount,\n },\n };\n\n setGlobal(newGlobal);\n })();\n});\n\naddReducer('blockContact', (global, actions, payload) => {\n const { contactId, accessHash } = payload!;\n\n (async () => {\n const result = await callApi('blockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(addBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('unblockContact', (global, actions, payload) => {\n const { contactId } = payload!;\n let accessHash: string | undefined;\n const isPrivate = isUserId(contactId);\n\n if (isPrivate) {\n const user = selectUser(global, contactId);\n if (!user) {\n return;\n }\n\n accessHash = user.accessHash;\n }\n\n (async () => {\n const result = await callApi('unblockContact', contactId, accessHash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal(removeBlockedContact(newGlobal, contactId));\n })();\n});\n\naddReducer('loadAuthorizations', () => {\n (async () => {\n const result = await callApi('fetchAuthorizations');\n if (!result) {\n return;\n }\n\n setGlobal({\n ...getGlobal(),\n activeSessions: result,\n });\n })();\n});\n\naddReducer('terminateAuthorization', (global, actions, payload) => {\n const { hash } = payload!;\n\n (async () => {\n const result = await callApi('terminateAuthorization', hash);\n if (!result) {\n return;\n }\n\n const newGlobal = getGlobal();\n\n setGlobal({\n ...newGlobal,\n activeSessions: newGlobal.activeSessions.filter((session) => session.hash !== hash),\n });\n })();\n});\n\naddReducer('terminateAllAuthorizations', () => {\n (async () => {\n const result = await callApi('terminateAllAuthorizations');\n if (!result) {\n return;\n }\n\n const global = getGlobal();\n\n setGlobal({\n ...global,\n activeSessions: global.activeSessions.filter((session) => session.isCurrent),\n });\n })();\n});\n\naddReducer('loadNotificationExceptions', (global) => {\n const { serverTimeOffset } = global;\n\n (async () => {\n const result = await callApi('fetchNotificationExceptions', { serverTimeOffset });\n if (!result) {\n return;\n }\n\n setGlobal(addNotifyExceptions(getGlobal(), result));\n })();\n});\n\naddReducer('loadNotificationSettings', (global) => {\n const { serverTimeOffset } = global;\n (async () => {\n const result = await callApi('fetchNotificationSettings', {\n serverTimeOffset,\n });\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateNotificationSettings', (global, actions, payload) => {\n const { peerType, isSilent, shouldShowPreviews } = payload!;\n\n (async () => {\n const result = await callApi('updateNotificationSettings', peerType, { isSilent, shouldShowPreviews });\n\n if (!result) {\n return;\n }\n\n setGlobal(updateNotifySettings(getGlobal(), peerType, isSilent, shouldShowPreviews));\n })();\n});\n\naddReducer('updateWebNotificationSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), payload));\n const newGlobal = getGlobal();\n const { hasPushNotifications, hasWebNotifications } = newGlobal.settings.byKey;\n if (hasWebNotifications && hasPushNotifications) {\n await subscribe();\n } else {\n await unsubscribe();\n }\n })();\n});\n\naddReducer('updateContactSignUpNotification', (global, actions, payload) => {\n const { isSilent } = payload!;\n\n (async () => {\n const result = await callApi('updateContactSignUpNotification', isSilent);\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { hasContactJoinedNotifications: !isSilent }));\n })();\n});\n\naddReducer('loadLanguages', () => {\n (async () => {\n const result = await callApi('fetchLanguages');\n if (!result) {\n return;\n }\n\n setGlobal(replaceSettings(getGlobal(), { languages: result }));\n })();\n});\n\naddReducer('loadPrivacySettings', () => {\n (async () => {\n const [\n phoneNumberSettings, lastSeenSettings, profilePhotoSettings, forwardsSettings, chatInviteSettings,\n ] = await Promise.all([\n callApi('fetchPrivacySettings', 'phoneNumber'),\n callApi('fetchPrivacySettings', 'lastSeen'),\n callApi('fetchPrivacySettings', 'profilePhoto'),\n callApi('fetchPrivacySettings', 'forwards'),\n callApi('fetchPrivacySettings', 'chatInvite'),\n ]);\n\n if (\n !phoneNumberSettings || !lastSeenSettings || !profilePhotoSettings || !forwardsSettings || !chatInviteSettings\n ) {\n return;\n }\n\n const global = getGlobal();\n\n global.settings.privacy.phoneNumber = phoneNumberSettings;\n global.settings.privacy.lastSeen = lastSeenSettings;\n global.settings.privacy.profilePhoto = profilePhotoSettings;\n global.settings.privacy.forwards = forwardsSettings;\n global.settings.privacy.chatInvite = chatInviteSettings;\n\n setGlobal(global);\n })();\n});\n\naddReducer('setPrivacyVisibility', (global, actions, payload) => {\n const { privacyKey, visibility } = payload!;\n\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility,\n allowedIds: [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\naddReducer('setPrivacySettings', (global, actions, payload) => {\n const { privacyKey, isAllowList, contactsIds } = payload!;\n const {\n privacy: { [privacyKey as ApiPrivacyKey]: settings },\n } = global.settings;\n\n if (!settings) {\n return;\n }\n\n const rules = buildInputPrivacyRules(global, {\n visibility: settings.visibility,\n allowedIds: isAllowList ? contactsIds : [...settings.allowUserIds, ...settings.allowChatIds],\n deniedIds: !isAllowList ? contactsIds : [...settings.blockUserIds, ...settings.blockChatIds],\n });\n\n (async () => {\n const result = await callApi('setPrivacySettings', privacyKey, rules);\n\n if (result) {\n const newGlobal = getGlobal();\n\n newGlobal.settings.privacy[privacyKey as ApiPrivacyKey] = result;\n\n setGlobal(newGlobal);\n }\n })();\n});\n\nfunction buildInputPrivacyRules(global: GlobalState, {\n visibility,\n allowedIds,\n deniedIds,\n}: {\n visibility: PrivacyVisibility;\n allowedIds: string[];\n deniedIds: string[];\n}): InputPrivacyRules {\n const {\n users: { byId: usersById },\n chats: { byId: chatsById },\n } = global;\n\n const rules: InputPrivacyRules = {\n visibility,\n };\n let users: InputPrivacyContact[];\n let chats: InputPrivacyContact[];\n\n const collectUsers = (userId: string) => {\n if (!isUserId(userId)) {\n return undefined;\n }\n const { id, accessHash } = usersById[userId] || {};\n if (!id) {\n return undefined;\n }\n\n return { id, accessHash };\n };\n\n const collectChats = (userId: string) => {\n if (isUserId(userId)) {\n return undefined;\n }\n const chat = chatsById[userId];\n\n return chat ? { id: chat.id } : undefined;\n };\n\n if (visibility === 'contacts' || visibility === 'nobody') {\n users = allowedIds.map(collectUsers).filter(Boolean) as InputPrivacyContact[];\n chats = allowedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\n\n if (users.length > 0) {\n rules.allowedUsers = users;\n }\n if (chats.length > 0) {\n rules.allowedChats = chats;\n }\n }\n\n if (visibility === 'everybody' || visibility === 'contacts') {\n users = deniedIds.map(collectUsers).filter(Boolean) as InputPrivacyContact[];\n chats = deniedIds.map(collectChats).filter(Boolean) as InputPrivacyContact[];\n\n if (users.length > 0) {\n rules.blockedUsers = users;\n }\n if (chats.length > 0) {\n rules.blockedChats = chats;\n }\n }\n\n return rules;\n}\n\naddReducer('updateIsOnline', (global, actions, payload) => {\n callApi('updateIsOnline', payload);\n});\n\naddReducer('loadContentSettings', () => {\n (async () => {\n const result = await callApi('fetchContentSettings');\n if (!result) return;\n\n setGlobal(replaceSettings(getGlobal(), result));\n })();\n});\n\naddReducer('updateContentSettings', (global, actions, payload) => {\n (async () => {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: payload }));\n\n const result = await callApi('updateContentSettings', payload);\n if (!result) {\n setGlobal(replaceSettings(getGlobal(), { isSensitiveEnabled: !payload }));\n }\n })();\n});\n\naddReducer('loadCountryList', (global, actions, payload = {}) => {\n let { langCode } = payload;\n if (!langCode) langCode = global.settings.byKey.language;\n\n (async () => {\n const countryList = await callApi('fetchCountryList', { langCode });\n if (!countryList) return;\n\n setGlobal({\n ...getGlobal(),\n countryList,\n });\n })();\n});\n\naddReducer('ensureTimeFormat', (global, actions) => {\n if (global.authNearestCountry) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(global.authNearestCountry.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n\n (async () => {\n if (getGlobal().settings.byKey.wasTimeFormatSetManually) {\n return;\n }\n\n const nearestCountryCode = await callApi('fetchNearestCountry');\n if (nearestCountryCode) {\n const timeFormat = COUNTRIES_WITH_12H_TIME_FORMAT.has(nearestCountryCode.toUpperCase()) ? '12h' : '24h';\n actions.setSettingOption({ timeFormat });\n setTimeFormat(timeFormat);\n }\n })();\n});\n\naddReducer('loadAppConfig', () => {\n (async () => {\n const appConfig = await callApi('fetchAppConfig');\n\n if (!appConfig) return;\n\n setGlobal({\n ...getGlobal(),\n appConfig,\n });\n })();\n});\n","import {\n addReducer, getDispatch, getGlobal, setGlobal,\n} from '../../../lib/teact/teactn';\n\nimport { GlobalState } from '../../../global/types';\n\nimport {\n ApiUpdate,\n ApiUpdateAuthorizationState,\n ApiUpdateAuthorizationError,\n ApiUpdateConnectionState,\n ApiUpdateSession,\n ApiUpdateCurrentUser, ApiUpdateServerTimeOffset,\n} from '../../../api/types';\nimport { DEBUG, SESSION_USER_KEY } from '../../../config';\nimport { subscribe } from '../../../util/notifications';\nimport { updateUser } from '../../reducers';\nimport { setLanguage } from '../../../util/langProvider';\nimport { selectNotifySettings } from '../../selectors';\nimport { forceWebsync } from '../../../util/websync';\nimport { getShippingError } from '../../../util/getReadableErrorText';\n\naddReducer('apiUpdate', (global, actions, update: ApiUpdate) => {\n if (DEBUG) {\n if (update['@type'] !== 'updateUserStatus' && update['@type'] !== 'updateServerTimeOffset') {\n // eslint-disable-next-line no-console\n console.log('[GramJs] UPDATE', update['@type'], { update });\n }\n }\n\n switch (update['@type']) {\n case 'updateApiReady':\n onUpdateApiReady(global);\n break;\n\n case 'updateAuthorizationState':\n onUpdateAuthorizationState(update);\n break;\n\n case 'updateAuthorizationError':\n onUpdateAuthorizationError(update);\n break;\n\n case 'updateConnectionState':\n onUpdateConnectionState(update);\n break;\n\n case 'updateSession':\n onUpdateSession(update);\n break;\n\n case 'updateServerTimeOffset':\n onUpdateServerTimeOffset(update);\n break;\n\n case 'updateCurrentUser':\n onUpdateCurrentUser(update);\n break;\n\n case 'error': {\n if (update.error.message === 'SESSION_REVOKED') {\n actions.signOut();\n }\n\n const paymentShippingError = getShippingError(update.error);\n if (paymentShippingError) {\n actions.addPaymentError({ error: paymentShippingError });\n } else if (actions.showDialog) {\n actions.showDialog({ data: update.error });\n }\n\n break;\n }\n }\n});\n\nfunction onUpdateApiReady(global: GlobalState) {\n const { hasWebNotifications, hasPushNotifications } = selectNotifySettings(global);\n if (hasWebNotifications && hasPushNotifications) {\n void subscribe();\n }\n void setLanguage(global.settings.byKey.language);\n}\n\nfunction onUpdateAuthorizationState(update: ApiUpdateAuthorizationState) {\n let global = getGlobal();\n\n const wasAuthReady = global.authState === 'authorizationStateReady';\n const authState = update.authorizationState;\n\n setGlobal({\n ...global,\n authState,\n authIsLoading: false,\n });\n\n global = getGlobal();\n\n switch (authState) {\n case 'authorizationStateLoggingOut':\n void forceWebsync(false);\n\n setGlobal({\n ...global,\n isLoggingOut: true,\n });\n break;\n case 'authorizationStateWaitCode':\n setGlobal({\n ...global,\n authIsCodeViaApp: update.isCodeViaApp,\n });\n break;\n case 'authorizationStateWaitPassword':\n setGlobal({\n ...global,\n authHint: update.hint,\n });\n break;\n case 'authorizationStateWaitQrCode':\n setGlobal({\n ...global,\n authIsLoadingQrCode: false,\n authQrCode: update.qrCode,\n });\n break;\n case 'authorizationStateReady': {\n if (wasAuthReady) {\n break;\n }\n\n void forceWebsync(true);\n\n setGlobal({\n ...global,\n isLoggingOut: false,\n });\n\n break;\n }\n }\n}\n\nfunction onUpdateAuthorizationError(update: ApiUpdateAuthorizationError) {\n setGlobal({\n ...getGlobal(),\n authError: update.message,\n });\n}\n\nfunction onUpdateConnectionState(update: ApiUpdateConnectionState) {\n const { connectionState } = update;\n const global = getGlobal();\n\n if (connectionState === global.connectionState) {\n return;\n }\n\n setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateBroken') {\n getDispatch().signOut();\n }\n}\n\nfunction onUpdateSession(update: ApiUpdateSession) {\n const { sessionData } = update;\n const { authRememberMe, authState } = getGlobal();\n const isEmpty = !sessionData || !sessionData.mainDcId;\n\n if (!authRememberMe || authState !== 'authorizationStateReady' || isEmpty) {\n return;\n }\n\n getDispatch().saveSession({ sessionData });\n}\n\nfunction onUpdateServerTimeOffset(update: ApiUpdateServerTimeOffset) {\n const global = getGlobal();\n\n if (global.serverTimeOffset === update.serverTimeOffset) {\n return;\n }\n\n setGlobal({\n ...global,\n serverTimeOffset: update.serverTimeOffset,\n });\n}\n\nfunction onUpdateCurrentUser(update: ApiUpdateCurrentUser) {\n const { currentUser } = update;\n\n setGlobal({\n ...updateUser(getGlobal(), currentUser.id, currentUser),\n currentUserId: currentUser.id,\n });\n\n updateSessionUserId(currentUser.id);\n}\n\nfunction updateSessionUserId(currentUserId: string) {\n const sessionUserAuth = localStorage.getItem(SESSION_USER_KEY);\n if (!sessionUserAuth) return;\n\n const userAuth = JSON.parse(sessionUserAuth);\n userAuth.id = currentUserId;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify(userAuth));\n}\n","import { addReducer, getGlobal, setGlobal } from '../../../lib/teact/teactn';\n\nimport { ANIMATION_LEVEL_MAX } from '../../../config';\nimport {\n IS_ANDROID, IS_IOS, IS_MAC_OS, IS_SAFARI, IS_TOUCH_ENV,\n} from '../../../util/environment';\nimport { setLanguage } from '../../../util/langProvider';\nimport switchTheme from '../../../util/switchTheme';\nimport { selectTheme } from '../../selectors';\nimport { startWebsync } from '../../../util/websync';\nimport { ensurePermanentWebVersion } from '../../../util/permanentWebVersion';\n\nconst HISTORY_ANIMATION_DURATION = 450;\n\nsubscribeToSystemThemeChange();\n\naddReducer('init', (global) => {\n const { animationLevel, messageTextSize, language } = global.settings.byKey;\n const theme = selectTheme(global);\n\n void setLanguage(language, undefined, true);\n\n document.documentElement.style.setProperty(\n '--composer-text-size', `${Math.max(messageTextSize, IS_IOS ? 16 : 15)}px`,\n );\n document.documentElement.style.setProperty('--message-meta-height', `${Math.floor(messageTextSize * 1.3125)}px`);\n document.documentElement.style.setProperty('--message-text-size', `${messageTextSize}px`);\n document.documentElement.setAttribute('data-message-text-size', messageTextSize.toString());\n document.body.classList.add('initial');\n document.body.classList.add(`animation-level-${animationLevel}`);\n document.body.classList.add(IS_TOUCH_ENV ? 'is-touch-env' : 'is-pointer-env');\n\n switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\n\n ensurePermanentWebVersion();\n startWebsync();\n\n if (IS_IOS) {\n document.body.classList.add('is-ios');\n } else if (IS_ANDROID) {\n document.body.classList.add('is-android');\n } else if (IS_MAC_OS) {\n document.body.classList.add('is-macos');\n }\n if (IS_SAFARI) {\n document.body.classList.add('is-safari');\n }\n});\n\naddReducer('setIsUiReady', (global, actions, payload) => {\n const { uiReadyState } = payload!;\n\n if (uiReadyState === 2) {\n document.body.classList.remove('initial');\n }\n\n return {\n ...global,\n uiReadyState,\n };\n});\n\naddReducer('setAuthPhoneNumber', (global, actions, payload) => {\n const { phoneNumber } = payload!;\n\n return {\n ...global,\n authPhoneNumber: phoneNumber,\n };\n});\n\naddReducer('setAuthRememberMe', (global, actions, payload) => {\n return {\n ...global,\n authRememberMe: Boolean(payload),\n };\n});\n\naddReducer('clearAuthError', (global) => {\n return {\n ...global,\n authError: undefined,\n };\n});\n\naddReducer('disableHistoryAnimations', () => {\n setTimeout(() => {\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: false,\n });\n document.body.classList.remove('no-animate');\n }, HISTORY_ANIMATION_DURATION);\n\n setGlobal({\n ...getGlobal(),\n shouldSkipHistoryAnimations: true,\n }, { forceSyncOnIOs: true });\n});\n\nfunction subscribeToSystemThemeChange() {\n function handleSystemThemeChange() {\n const currentThemeMatch = document.documentElement.className.match(/theme-(\\w+)/);\n const currentTheme = currentThemeMatch ? currentThemeMatch[1] : 'light';\n const global = getGlobal();\n const nextTheme = selectTheme(global);\n const { animationLevel } = global.settings.byKey;\n\n if (nextTheme !== currentTheme) {\n switchTheme(nextTheme, animationLevel === ANIMATION_LEVEL_MAX);\n // Force-update component containers\n setGlobal({ ...global });\n }\n }\n\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n if (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n } else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n }\n}\n","import { addReducer } from '../../../lib/teact/teactn';\nimport { ISettings, IThemeSettings, ThemeKey } from '../../../types';\nimport { replaceSettings, replaceThemeSettings } from '../../reducers';\n\naddReducer('setSettingOption', (global, actions, payload?: Partial<ISettings>) => {\n return replaceSettings(global, payload);\n});\n\naddReducer('setThemeSettings', (global, actions, payload: { theme: ThemeKey } & Partial<IThemeSettings>) => {\n const { theme, ...settings } = payload;\n\n return replaceThemeSettings(global, theme, settings);\n});\n","import {\n ApiChat,\n ApiUser,\n ApiChatBannedRights,\n ApiChatAdminRights,\n ApiChatFolder,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { NotifyException, NotifySettings } from '../../types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { ARCHIVED_FOLDER_ID, REPLIES_USER_ID } from '../../config';\nimport { orderBy } from '../../util/iteratees';\nimport { getUserFirstOrLastName } from './users';\nimport { formatDateToString, formatTime } from '../../util/dateFormat';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\n\nconst FOREVER_BANNED_DATE = Date.now() / 1000 + 31622400; // 366 days\n\nconst VERIFIED_PRIORITY_BASE = 3e9;\nconst PINNED_PRIORITY_BASE = 3e8;\n\nexport function isUserId(entityId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof entityId === 'number') {\n return entityId > 0;\n }\n\n return !entityId.startsWith('-');\n}\n\nexport function isChatGroup(chat: ApiChat) {\n return isChatBasicGroup(chat) || isChatSuperGroup(chat);\n}\n\nexport function isChatBasicGroup(chat: ApiChat) {\n return chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatSuperGroup(chat: ApiChat) {\n return chat.type === 'chatTypeSuperGroup';\n}\n\nexport function isChatChannel(chat: ApiChat) {\n return chat.type === 'chatTypeChannel';\n}\n\nexport function isCommonBoxChat(chat: ApiChat) {\n return chat.type === 'chatTypePrivate' || chat.type === 'chatTypeBasicGroup';\n}\n\nexport function isChatWithRepliesBot(chatId: string) {\n return chatId === REPLIES_USER_ID;\n}\n\nexport function getChatTypeString(chat: ApiChat) {\n switch (chat.type) {\n case 'chatTypePrivate':\n return 'PrivateChat';\n case 'chatTypeBasicGroup':\n case 'chatTypeSuperGroup':\n return 'AccDescrGroup';\n case 'chatTypeChannel':\n return 'AccDescrChannel';\n default:\n return 'Chat';\n }\n}\n\nexport function getPrivateChatUserId(chat: ApiChat) {\n if (chat.type !== 'chatTypePrivate' && chat.type !== 'chatTypeSecret') {\n return undefined;\n }\n return chat.id;\n}\n\n// TODO Get rid of `user`\nexport function getChatTitle(lang: LangFn, chat: ApiChat, user?: ApiUser, isSelf = false) {\n if (isSelf || (user && chat.id === user.id && user.isSelf)) {\n return lang('SavedMessages');\n }\n return chat.title || lang('HiddenName');\n}\n\nexport function getChatDescription(chat: ApiChat) {\n if (!chat.fullInfo) {\n return undefined;\n }\n return chat.fullInfo.about;\n}\n\nexport function getChatLink(chat: ApiChat) {\n const { username } = chat;\n if (username) {\n return `https://t.me/${username}`;\n }\n\n const { inviteLink } = chat.fullInfo || {};\n\n return inviteLink;\n}\n\nexport function getChatAvatarHash(\n owner: ApiChat | ApiUser,\n size: 'normal' | 'big' = 'normal',\n) {\n if (!owner.avatarHash) {\n return undefined;\n }\n\n switch (size) {\n case 'big':\n return `profile${owner.id}?${owner.avatarHash}`;\n default:\n return `avatar${owner.id}?${owner.avatarHash}`;\n }\n}\n\nexport function isChatSummaryOnly(chat: ApiChat) {\n return !chat.lastMessage;\n}\n\nexport function isChatAdmin(chat: ApiChat) {\n return Boolean(chat.adminRights);\n}\n\nexport function getHasAdminRight(chat: ApiChat, key: keyof ApiChatAdminRights) {\n return chat.adminRights ? chat.adminRights[key] : false;\n}\n\nexport function isUserRightBanned(chat: ApiChat, key: keyof ApiChatBannedRights) {\n return Boolean(\n (chat.currentUserBannedRights?.[key])\n || (chat.defaultBannedRights?.[key]),\n );\n}\n\nexport function getCanPostInChat(chat: ApiChat, threadId: number) {\n if (threadId !== MAIN_THREAD_ID) {\n return true;\n }\n\n if (chat.isRestricted || chat.migratedTo || chat.isNotJoined || isChatWithRepliesBot(chat.id)) {\n return false;\n }\n\n if (chat.isCreator) {\n return true;\n }\n\n if (isUserId(chat.id)) {\n return true;\n }\n\n if (isChatChannel(chat)) {\n return getHasAdminRight(chat, 'postMessages');\n }\n\n return isChatAdmin(chat) || !isUserRightBanned(chat, 'sendMessages');\n}\n\nexport interface IAllowedAttachmentOptions {\n canAttachMedia: boolean;\n canAttachPolls: boolean;\n canSendStickers: boolean;\n canSendGifs: boolean;\n canAttachEmbedLinks: boolean;\n}\n\nexport function getAllowedAttachmentOptions(chat?: ApiChat, isChatWithBot = false): IAllowedAttachmentOptions {\n if (!chat) {\n return {\n canAttachMedia: false,\n canAttachPolls: false,\n canSendStickers: false,\n canSendGifs: false,\n canAttachEmbedLinks: false,\n };\n }\n\n const isAdmin = isChatAdmin(chat);\n\n return {\n canAttachMedia: isAdmin || !isUserRightBanned(chat, 'sendMedia'),\n canAttachPolls: (isAdmin || !isUserRightBanned(chat, 'sendPolls')) && (!isUserId(chat.id) || isChatWithBot),\n canSendStickers: isAdmin || !isUserRightBanned(chat, 'sendStickers'),\n canSendGifs: isAdmin || !isUserRightBanned(chat, 'sendGifs'),\n canAttachEmbedLinks: isAdmin || !isUserRightBanned(chat, 'embedLinks'),\n };\n}\n\nexport function getMessageSendingRestrictionReason(\n lang: LangFn,\n currentUserBannedRights?: ApiChatBannedRights,\n defaultBannedRights?: ApiChatBannedRights,\n) {\n if (currentUserBannedRights?.sendMessages) {\n const { untilDate } = currentUserBannedRights;\n return untilDate && untilDate < FOREVER_BANNED_DATE\n ? lang(\n 'Channel.Persmission.Denied.SendMessages.Until',\n lang(\n 'formatDateAtTime',\n [formatDateToString(new Date(untilDate * 1000), lang.code), formatTime(lang, untilDate * 1000)],\n ),\n )\n : lang('Channel.Persmission.Denied.SendMessages.Forever');\n }\n\n if (defaultBannedRights?.sendMessages) {\n return lang('Channel.Persmission.Denied.SendMessages.DefaultRestrictedText');\n }\n\n return undefined;\n}\n\nexport function getChatSlowModeOptions(chat?: ApiChat) {\n if (!chat || !chat.fullInfo) {\n return undefined;\n }\n\n return chat.fullInfo.slowMode;\n}\n\nexport function getChatOrder(chat: ApiChat) {\n return Math.max(chat.joinDate || 0, chat.draftDate || 0, chat.lastMessage?.date || 0);\n}\n\nexport function isChatArchived(chat: ApiChat) {\n return chat.folderId === ARCHIVED_FOLDER_ID;\n}\n\nexport function selectIsChatMuted(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record<string, NotifyException> = {},\n) {\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].isMuted !== undefined) {\n return notifyExceptions[chat.id].isMuted;\n }\n\n return (\n chat.isMuted\n || (isUserId(chat.id) && !notifySettings.hasPrivateChatsNotifications)\n || (isChatChannel(chat) && !notifySettings.hasBroadcastNotifications)\n || (isChatGroup(chat) && !notifySettings.hasGroupNotifications)\n );\n}\n\nexport function selectShouldShowMessagePreview(\n chat: ApiChat, notifySettings: NotifySettings, notifyExceptions: Record<string, NotifyException> = {},\n) {\n const {\n hasPrivateChatsMessagePreview = true,\n hasBroadcastMessagePreview = true,\n hasGroupMessagePreview = true,\n } = notifySettings;\n // If this chat is in exceptions they take precedence\n if (notifyExceptions[chat.id] && notifyExceptions[chat.id].shouldShowPreviews !== undefined) {\n return notifyExceptions[chat.id].shouldShowPreviews;\n }\n\n return (isUserId(chat.id) && hasPrivateChatsMessagePreview)\n || (isChatChannel(chat) && hasBroadcastMessagePreview)\n || (isChatGroup(chat) && hasGroupMessagePreview);\n}\n\nexport function getCanDeleteChat(chat: ApiChat) {\n return isChatBasicGroup(chat) || ((isChatSuperGroup(chat) || isChatChannel(chat)) && chat.isCreator);\n}\n\nexport function getFolderDescriptionText(lang: LangFn, folder: ApiChatFolder, chatsCount?: number) {\n const {\n id, title, emoticon, description, pinnedChatIds,\n excludedChatIds, includedChatIds,\n excludeArchived, excludeMuted, excludeRead,\n ...filters\n } = folder;\n\n // If folder has multiple additive filters or uses include/exclude lists,\n // we display folder chats count\n if (\n chatsCount !== undefined && (\n Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds?.length)\n || (includedChatIds?.length)\n )) {\n return lang('Chats', chatsCount);\n }\n\n // Otherwise, we return a short description of a single filter\n if (filters.bots) {\n return lang('FilterBots');\n } else if (filters.groups) {\n return lang('FilterGroups');\n } else if (filters.channels) {\n return lang('FilterChannels');\n } else if (filters.contacts) {\n return lang('FilterContacts');\n } else if (filters.nonContacts) {\n return lang('FilterNonContacts');\n } else {\n return undefined;\n }\n}\n\nexport function getMessageSenderName(lang: LangFn, chatId: string, sender?: ApiUser) {\n if (!sender || isUserId(chatId)) {\n return undefined;\n }\n\n if (sender.isSelf) {\n return lang('FromYou');\n }\n\n return getUserFirstOrLastName(sender);\n}\n\nexport function sortChatIds(\n chatIds: string[],\n chatsById: Record<string, ApiChat>,\n shouldPrioritizeVerified = false,\n priorityIds?: string[],\n) {\n return orderBy(chatIds, (id) => {\n const chat = chatsById[id];\n if (!chat) {\n return 0;\n }\n\n let priority = 0;\n\n if (chat.lastMessage) {\n priority += chat.lastMessage.date;\n }\n\n if (shouldPrioritizeVerified && chat.isVerified) {\n priority += VERIFIED_PRIORITY_BASE; // ~100 years in seconds\n }\n\n if (priorityIds && priorityIds.includes(id)) {\n priority = Date.now() + PINNED_PRIORITY_BASE + (priorityIds.length - priorityIds.indexOf(id));\n }\n\n return priority;\n }, 'desc');\n}\n\nexport function filterChatsByName(\n lang: LangFn,\n chatIds: string[],\n chatsById: Record<string, ApiChat>,\n query?: string,\n currentUserId?: string,\n) {\n if (!query) {\n return chatIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return chatIds.filter((id) => {\n const chat = chatsById[id];\n if (!chat) {\n return false;\n }\n\n return searchWords(getChatTitle(lang, chat, undefined, id === currentUserId));\n });\n}\n","import {\n ApiChat, ApiMessage, ApiMessageEntityTypes, ApiReactions, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport {\n CONTENT_NOT_SUPPORTED,\n LOCAL_MESSAGE_ID_BASE,\n RE_LINK_TEMPLATE,\n SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\nimport { getUserFullName } from './users';\nimport { IS_OPUS_SUPPORTED, isWebpSupported } from '../../util/environment';\nimport { getChatTitle, isUserId } from './chats';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\n\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\n\nexport type MessageKey = `msg${string}-${number}`;\n\nexport function getMessageKey(message: ApiMessage): MessageKey {\n const { chatId, id } = message;\n\n return buildMessageKey(chatId, id);\n}\n\nexport function buildMessageKey(chatId: string, msgId: number): MessageKey {\n return `msg${chatId}-${msgId}`;\n}\n\nexport function parseMessageKey(key: MessageKey) {\n const match = key.match(/^msg(-?\\d+)-(\\d+)/)!;\n\n return { chatId: match[1], messageId: Number(match[2]) };\n}\n\nexport function getMessageOriginalId(message: ApiMessage) {\n return message.previousLocalId || message.id;\n}\n\nexport function getMessageText(message: ApiMessage) {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact, invoice,\n } = message.content;\n\n if (text) {\n return text.text;\n }\n\n if (sticker || photo || video || audio || voice || document || contact || poll || webPage || invoice) {\n return undefined;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function getMessageCustomShape(message: ApiMessage): boolean | number {\n const {\n text, sticker, photo, video, audio, voice, document, poll, webPage, contact,\n } = message.content;\n\n if (sticker || (video?.isRound)) {\n return true;\n }\n\n if (!text || photo || video || audio || voice || document || poll || webPage || contact) {\n return false;\n }\n\n // This is a \"dual-intent\" method used to limit calls of `parseEmojiOnlyString`.\n return parseEmojiOnlyString(text.text) || false;\n}\n\nexport function getMessageSingleEmoji(message: ApiMessage) {\n const { text } = message.content;\n if (!(text && text.text.length <= 6)) {\n return undefined;\n }\n\n if (getMessageCustomShape(message) !== 1) {\n return undefined;\n }\n\n return text.text;\n}\n\nexport function getFirstLinkInMessage(message: ApiMessage) {\n const { text } = message.content;\n\n let match: RegExpMatchArray | null | undefined;\n if (text?.entities) {\n let link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.TextUrl);\n if (link) {\n match = link.url!.match(RE_LINK);\n }\n\n if (!match) {\n link = text.entities.find((entity) => entity.type === ApiMessageEntityTypes.Url);\n if (link) {\n const { offset, length } = link;\n match = text.text.substring(offset, offset + length).match(RE_LINK);\n }\n }\n }\n\n if (!match && text) {\n match = text.text.match(RE_LINK);\n }\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function matchLinkInMessageText(message: ApiMessage) {\n const { text } = message.content;\n const match = text && text.text.match(RE_LINK);\n\n if (!match) {\n return undefined;\n }\n\n return {\n url: match[0],\n domain: match[3],\n };\n}\n\nexport function isOwnMessage(message: ApiMessage) {\n return message.isOutgoing;\n}\n\nexport function isReplyMessage(message: ApiMessage) {\n return Boolean(message.replyToMessageId);\n}\n\nexport function isForwardedMessage(message: ApiMessage) {\n return Boolean(message.forwardInfo);\n}\n\nexport function isActionMessage(message: ApiMessage) {\n return Boolean(message.content.action);\n}\n\nexport function isServiceNotificationMessage(message: ApiMessage) {\n return message.chatId === SERVICE_NOTIFICATIONS_USER_ID && Math.round(message.id) !== message.id;\n}\n\nexport function isAnonymousOwnMessage(message: ApiMessage) {\n return Boolean(message.senderId) && !isUserId(message.senderId!) && isOwnMessage(message);\n}\n\nexport function getSenderTitle(lang: LangFn, sender: ApiUser | ApiChat) {\n return isUserId(sender.id) ? getUserFullName(sender as ApiUser) : getChatTitle(lang, sender as ApiChat);\n}\n\nexport function getSendingState(message: ApiMessage) {\n if (!message.sendingState) {\n return 'succeeded';\n }\n\n return message.sendingState === 'messageSendingStateFailed' ? 'failed' : 'pending';\n}\n\nexport function isMessageLocal(message: ApiMessage) {\n return message.id >= LOCAL_MESSAGE_ID_BASE;\n}\n\nexport function isHistoryClearMessage(message: ApiMessage) {\n return message.content.action && message.content.action.type === 'historyClear';\n}\n\nexport function getMessageContentFilename(message: ApiMessage) {\n const { content } = message;\n\n const video = content.webPage ? content.webPage.video : content.video;\n const photo = content.webPage ? content.webPage.photo : content.photo;\n const document = content.webPage ? content.webPage.document : content.document;\n if (document) {\n return document.fileName;\n }\n\n if (video) {\n return video.fileName;\n }\n\n if (content.sticker) {\n const extension = content.sticker.isLottie ? 'tgs' : content.sticker.isGif\n ? 'webm' : isWebpSupported() ? 'webp' : 'png';\n return `${content.sticker.id}.${extension}`;\n }\n\n if (content.audio) {\n return content.audio.fileName;\n }\n\n const baseFilename = getMessageKey(message);\n\n if (photo) {\n return `${baseFilename}.jpg`;\n }\n\n if (content.voice) {\n return IS_OPUS_SUPPORTED ? `${baseFilename}.ogg` : `${baseFilename}.wav`;\n }\n\n return baseFilename;\n}\n\nexport function areReactionsEmpty(reactions: ApiReactions) {\n return !reactions.results.some((l) => l.count > 0);\n}\n","import type { TextPart } from '../../components/common/helpers/renderTextWithEntities';\n\nimport { LangFn } from '../../hooks/useLang';\nimport { ApiMessage, ApiMessageEntityTypes } from '../../api/types';\nimport { CONTENT_NOT_SUPPORTED } from '../../config';\nimport { getMessageText } from './messages';\nimport trimText from '../../util/trimText';\n\nconst SPOILER_CHARS = ['⠺', '⠵', '⠞', '⠟'];\nexport const TRUNCATED_SUMMARY_LENGTH = 80;\n\nexport function getMessageSummaryText(\n lang: LangFn,\n message: ApiMessage,\n noEmoji = false,\n truncateLength = TRUNCATED_SUMMARY_LENGTH,\n) {\n const emoji = !noEmoji && getMessageSummaryEmoji(message);\n const emojiWithSpace = emoji ? `${emoji} ` : '';\n const text = trimText(getMessageTextWithSpoilers(message), truncateLength);\n const description = getMessageSummaryDescription(lang, message, text);\n\n return `${emojiWithSpace}${description}`;\n}\n\nexport function getMessageTextWithSpoilers(message: ApiMessage) {\n const text = getMessageText(message);\n if (!text) {\n return undefined;\n }\n\n const { entities } = message.content.text || {};\n if (!entities?.length) {\n return text;\n }\n\n return entities.reduce((accText, { type, offset, length }) => {\n if (type !== ApiMessageEntityTypes.Spoiler) {\n return accText;\n }\n\n const spoiler = generateBrailleSpoiler(length);\n\n\n return `${accText.substr(0, offset)}${spoiler}${accText.substr(offset + length, accText.length)}`;\n }, text);\n}\n\nexport function getMessageSummaryEmoji(message: ApiMessage) {\n const {\n photo, video, audio, voice, document, sticker, poll,\n } = message.content;\n\n if (message.groupedId || photo) {\n return '🖼';\n }\n\n if (video) {\n return '📹';\n }\n\n if (sticker) {\n return sticker.emoji;\n }\n\n if (audio) {\n return '🎧';\n }\n\n if (voice) {\n return '🎤';\n }\n\n if (document) {\n return '📎';\n }\n\n if (poll) {\n return '📊';\n }\n\n return undefined;\n}\n\nexport function getMessageSummaryDescription(lang: LangFn, message: ApiMessage, truncatedText?: string | TextPart[]) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n if (message.groupedId) {\n return truncatedText || lang('lng_in_dlg_album');\n }\n\n if (photo) {\n return truncatedText || lang('AttachPhoto');\n }\n\n if (video) {\n return truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo');\n }\n\n if (sticker) {\n return lang('AttachSticker').trim();\n }\n\n if (audio) {\n return getMessageAudioCaption(message) || lang('AttachMusic');\n }\n\n if (voice) {\n return truncatedText || lang('AttachAudio');\n }\n\n if (document) {\n return truncatedText || document.fileName;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return poll.summary.question;\n }\n\n if (invoice) {\n return 'Invoice';\n }\n\n if (text) {\n return truncatedText;\n }\n\n return CONTENT_NOT_SUPPORTED;\n}\n\nexport function generateBrailleSpoiler(length: number) {\n return new Array(length)\n .fill(undefined)\n .map(() => SPOILER_CHARS[Math.floor(Math.random() * SPOILER_CHARS.length)])\n .join('');\n}\n\nfunction getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text?.text);\n}\n","import {\n ApiAudio, ApiMediaFormat, ApiMessage, ApiMessageSearchType, ApiPhoto, ApiVideo, ApiDimensions,\n} from '../../api/types';\n\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, IS_SAFARI } from '../../util/environment';\nimport { getMessageKey, isMessageLocal, matchLinkInMessageText } from './messages';\nimport { getDocumentHasPreview } from '../../components/common/helpers/documentInfo';\n\ntype Target =\n 'micro'\n | 'pictogram'\n | 'inline'\n | 'viewerPreview'\n | 'viewerFull'\n | 'download';\n\nexport function getMessageContent(message: ApiMessage) {\n return message.content;\n}\n\nexport function hasMessageMedia(message: ApiMessage) {\n return Boolean((\n getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageContact(message)\n || getMessagePoll(message)\n || getMessageAction(message)\n || getMessageAudio(message)\n || getMessageVoice(message)\n ));\n}\n\nexport function getMessagePhoto(message: ApiMessage) {\n return message.content.photo;\n}\n\nexport function getMessageVideo(message: ApiMessage) {\n return message.content.video;\n}\n\nexport function getMessageRoundVideo(message: ApiMessage) {\n const { video } = message.content;\n\n return video?.isRound ? video : undefined;\n}\n\nexport function getMessageAction(message: ApiMessage) {\n return message.content.action;\n}\n\nexport function getMessageAudio(message: ApiMessage) {\n return message.content.audio;\n}\n\nexport function getMessageVoice(message: ApiMessage) {\n return message.content.voice;\n}\n\nexport function getMessageSticker(message: ApiMessage) {\n return message.content.sticker;\n}\n\nexport function getMessageDocument(message: ApiMessage) {\n return message.content.document;\n}\n\nexport function isMessageDocumentPhoto(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'photo' : undefined;\n}\n\nexport function isMessageDocumentVideo(message: ApiMessage) {\n const document = getMessageDocument(message);\n return document ? document.mediaType === 'video' : undefined;\n}\n\nexport function getMessageContact(message: ApiMessage) {\n return message.content.contact;\n}\n\nexport function getMessagePoll(message: ApiMessage) {\n return message.content.poll;\n}\n\nexport function getMessageInvoice(message: ApiMessage) {\n return message.content.invoice;\n}\n\nexport function getMessageWebPage(message: ApiMessage) {\n return message.content.webPage;\n}\n\nexport function getMessageWebPagePhoto(message: ApiMessage) {\n return getMessageWebPage(message)?.photo;\n}\n\nexport function getMessageWebPageDocument(message: ApiMessage) {\n return getMessageWebPage(message)?.document;\n}\n\nexport function getMessageWebPageVideo(message: ApiMessage): ApiVideo | undefined {\n return getMessageWebPage(message)?.video;\n}\n\nexport function getMessageMediaThumbnail(message: ApiMessage) {\n const media = getMessagePhoto(message)\n || getMessageVideo(message)\n || getMessageDocument(message)\n || getMessageSticker(message)\n || getMessageWebPagePhoto(message)\n || getMessageWebPageVideo(message);\n\n if (!media) {\n return undefined;\n }\n\n return media.thumbnail;\n}\n\nexport function getMessageMediaThumbDataUri(message: ApiMessage) {\n return getMessageMediaThumbnail(message)?.dataUri;\n}\n\nexport function getMessageMediaHash(\n message: ApiMessage,\n target: Target,\n) {\n const {\n photo, video, sticker, audio, voice, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n const messageVideo = video || webPageVideo;\n const messagePhoto = photo || webPagePhoto;\n\n if (!(messagePhoto || messageVideo || sticker || audio || voice || document)) {\n return undefined;\n }\n\n const mediaId = (messagePhoto || messageVideo || sticker || audio || voice || document)!.id;\n const base = `${getMessageKey(message)}${mediaId ? `:${mediaId}` : ''}`;\n\n if (messageVideo) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? getVideoOrAudioBaseHash(messageVideo, base) : undefined;\n case 'viewerPreview':\n return `${base}?size=m`;\n case 'viewerFull':\n return getVideoOrAudioBaseHash(messageVideo, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (messagePhoto) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return !hasMessageLocalBlobUrl(message) ? `${base}?size=x` : undefined;\n case 'viewerPreview':\n return `${base}?size=x`;\n case 'viewerFull':\n case 'download':\n return `${base}?size=z`;\n }\n }\n\n if (document) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n case 'inline':\n case 'viewerPreview':\n if (!getDocumentHasPreview(document) || hasMessageLocalBlobUrl(message)) {\n return undefined;\n }\n\n return `${base}?size=m`;\n case 'viewerFull':\n case 'download':\n return base;\n }\n }\n\n if (sticker) {\n switch (target) {\n case 'micro':\n return undefined;\n case 'pictogram':\n return `${base}?size=m`;\n case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (audio) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return getAudioHasCover(audio) ? `${base}?size=m` : undefined;\n case 'inline':\n return getVideoOrAudioBaseHash(audio, base);\n case 'download':\n return `${base}?download`;\n }\n }\n\n if (voice) {\n switch (target) {\n case 'micro':\n case 'pictogram':\n return undefined;\n case 'inline':\n return base;\n case 'download':\n return `${base}?download`;\n }\n }\n\n return undefined;\n}\n\nfunction getVideoOrAudioBaseHash(media: ApiAudio | ApiVideo, base: string) {\n if (IS_PROGRESSIVE_SUPPORTED && IS_SAFARI) {\n return `${base}?fileSize=${media.size}&mimeType=${media.mimeType}`;\n }\n\n return base;\n}\n\nexport function getAudioHasCover(media: ApiAudio) {\n return media.thumbnailSizes && media.thumbnailSizes.length > 0;\n}\n\nexport function getMessageMediaFormat(\n message: ApiMessage, target: Target,\n): ApiMediaFormat {\n const {\n sticker, video, audio, voice,\n } = message.content;\n\n const fullVideo = video || getMessageWebPageVideo(message);\n\n if (sticker && target === 'inline' && sticker.isLottie) {\n return ApiMediaFormat.Lottie;\n } else if (fullVideo && IS_PROGRESSIVE_SUPPORTED && (\n target === 'viewerFull' || target === 'inline'\n )) {\n return ApiMediaFormat.Progressive;\n } else if (audio || voice) {\n // Safari\n if (voice && !IS_OPUS_SUPPORTED) {\n return ApiMediaFormat.BlobUrl;\n }\n\n return ApiMediaFormat.Progressive;\n }\n\n return ApiMediaFormat.BlobUrl;\n}\n\nexport function getMessageFileName(message: ApiMessage) {\n const {\n photo, video, document,\n } = message.content;\n const webPagePhoto = getMessageWebPagePhoto(message);\n const webPageVideo = getMessageWebPageVideo(message);\n\n if (photo || webPagePhoto) {\n return `photo${message.date}.jpeg`;\n }\n\n const { fileName } = video || webPageVideo || document || {};\n\n return fileName;\n}\n\nexport function getMessageFileSize(message: ApiMessage) {\n const { video, document } = message.content;\n const webPageVideo = getMessageWebPageVideo(message);\n const { size } = video || webPageVideo || document || {};\n\n return size;\n}\n\nexport function hasMessageLocalBlobUrl(message: ApiMessage) {\n const { photo, video, document } = message.content;\n\n return (photo?.blobUrl) || (video?.blobUrl) || (document?.previewBlobUrl);\n}\n\nexport function getChatMediaMessageIds(\n messages: Record<number, ApiMessage>, listedIds: number[], isFromSharedMedia = false,\n) {\n return getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n}\n\nexport function getPhotoFullDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'z')\n || photo.sizes.find((size) => size.type === 'y')\n || getPhotoInlineDimensions(photo)\n );\n}\n\nexport function getPhotoInlineDimensions(photo: ApiPhoto): ApiDimensions | undefined {\n return (\n photo.sizes.find((size) => size.type === 'x')\n || photo.sizes.find((size) => size.type === 'm')\n || photo.sizes.find((size) => size.type === 's')\n || photo.thumbnail\n );\n}\n\nexport function getVideoDimensions(video: ApiVideo): ApiDimensions | undefined {\n if (video.width && video.height) {\n return video as ApiDimensions;\n }\n\n return undefined;\n}\n\nexport function getMediaTransferState(message: ApiMessage, progress?: number, isLoadNeeded = false) {\n const isUploading = isMessageLocal(message);\n const isTransferring = isUploading || isLoadNeeded;\n const transferProgress = Number(progress);\n\n return {\n isUploading, isTransferring, transferProgress,\n };\n}\n\nexport function getMessageContentIds(\n messages: Record<number, ApiMessage>, messageIds: number[], contentType: ApiMessageSearchType | 'inlineMedia',\n) {\n let validator: Function;\n\n switch (contentType) {\n case 'media':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessagePhoto(message) || (video && !video.isRound && !video.isGif);\n };\n break;\n\n case 'documents':\n validator = getMessageDocument;\n break;\n\n case 'links':\n validator = (message: ApiMessage) => getMessageWebPage(message) || matchLinkInMessageText(message);\n break;\n\n case 'audio':\n validator = getMessageAudio;\n break;\n\n case 'voice':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return getMessageVoice(message) || (video && video.isRound);\n };\n break;\n\n case 'inlineMedia':\n validator = (message: ApiMessage) => {\n const video = getMessageVideo(message);\n return (\n getMessagePhoto(message)\n || (video && !video.isRound && !video.isGif)\n || isMessageDocumentPhoto(message)\n || isMessageDocumentVideo(message)\n );\n };\n break;\n\n default:\n return [] as Array<number>;\n }\n\n return messageIds.reduce((result, messageId) => {\n if (messages[messageId] && validator(messages[messageId])) {\n result.push(messageId);\n }\n\n return result;\n }, [] as Array<number>);\n}\n\nexport function getMediaDuration(message: ApiMessage) {\n const { audio, voice, video } = getMessageContent(message);\n const media = audio || voice || video || getMessageWebPageVideo(message);\n if (!media) {\n return undefined;\n }\n\n return media.duration;\n}\n","export function buildChatThreadKey(chatId: string, threadId: number) {\n return `${chatId}_${threadId}`;\n}\n","import { ApiFieldError } from '../../api/types';\n\nconst STRIPE_ERRORS: Record<string, ApiFieldError> = {\n missing_payment_information: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n invalid_number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n number: {\n field: 'cardNumber',\n message: 'Incorrect card number',\n },\n exp_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n exp_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n invalid_expiry_year: {\n field: 'expiry',\n message: 'Incorrect year',\n },\n invalid_expiry_month: {\n field: 'expiry',\n message: 'Incorrect month',\n },\n cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n invalid_cvc: {\n field: 'cvv',\n message: 'Incorrect CVV',\n },\n};\n\nexport function getStripeError(error: {\n code: string;\n message: string;\n param?: string;\n}) {\n const { message: description, code, param } = error;\n const { field, message } = param ? STRIPE_ERRORS[param] : STRIPE_ERRORS[code];\n\n return { field, message, description };\n}\n","import { ApiChat, ApiUser, ApiUserStatus } from '../../api/types';\n\nimport { SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport { formatFullDate, formatTime } from '../../util/dateFormat';\nimport { orderBy } from '../../util/iteratees';\nimport { LangFn } from '../../hooks/useLang';\nimport { getServerTime } from '../../util/serverTime';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\n\nconst USER_COLOR_KEYS = [1, 8, 5, 2, 7, 4, 6];\n\nexport function getUserFirstOrLastName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n return user.firstName || user.lastName;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted';\n }\n\n default:\n return undefined;\n }\n}\n\nexport function getUserFullName(user?: ApiUser) {\n if (!user) {\n return undefined;\n }\n\n if (isDeletedUser(user)) {\n return 'Deleted account';\n }\n\n switch (user.type) {\n case 'userTypeBot':\n case 'userTypeRegular': {\n if (user.firstName && user.lastName) {\n return `${user.firstName} ${user.lastName}`;\n }\n\n if (user.firstName) {\n return user.firstName;\n }\n\n if (user.lastName) {\n return user.lastName;\n }\n\n break;\n }\n\n case 'userTypeDeleted':\n case 'userTypeUnknown': {\n return 'Deleted account';\n }\n }\n\n return undefined;\n}\n\nexport function getUserStatus(\n lang: LangFn, user: ApiUser, userStatus: ApiUserStatus | undefined, serverTimeOffset: number,\n) {\n if (user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return lang('ServiceNotifications').toLowerCase();\n }\n\n if (user.type && user.type === 'userTypeBot') {\n return lang('Bot');\n }\n\n if (!userStatus) {\n return '';\n }\n\n switch (userStatus.type) {\n case 'userStatusEmpty': {\n return lang('ALongTimeAgo');\n }\n\n case 'userStatusLastMonth': {\n return lang('WithinAMonth');\n }\n\n case 'userStatusLastWeek': {\n return lang('WithinAWeek');\n }\n\n case 'userStatusOffline': {\n const { wasOnline } = userStatus;\n\n if (!wasOnline) return lang('LastSeen.Offline');\n\n const now = new Date(new Date().getTime() + serverTimeOffset * 1000);\n const wasOnlineDate = new Date(wasOnline * 1000);\n\n if (wasOnlineDate >= now) {\n return lang('LastSeen.JustNow');\n }\n\n const diff = new Date(now.getTime() - wasOnlineDate.getTime());\n\n // within a minute\n if (diff.getTime() / 1000 < 60) {\n return lang('LastSeen.JustNow');\n }\n\n // within an hour\n if (diff.getTime() / 1000 < 60 * 60) {\n const minutes = Math.floor(diff.getTime() / 1000 / 60);\n return lang('LastSeen.MinutesAgo', minutes);\n }\n\n // today\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const serverToday = new Date(today.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverToday) {\n // up to 6 hours ago\n if (diff.getTime() / 1000 < 6 * 60 * 60) {\n const hours = Math.floor(diff.getTime() / 1000 / 60 / 60);\n return lang('LastSeen.HoursAgo', hours);\n }\n\n // other\n return lang('LastSeen.TodayAt', formatTime(lang, wasOnlineDate));\n }\n\n // yesterday\n const yesterday = new Date();\n yesterday.setDate(now.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const serverYesterday = new Date(yesterday.getTime() + serverTimeOffset * 1000);\n if (wasOnlineDate > serverYesterday) {\n return lang('LastSeen.YesterdayAt', formatTime(lang, wasOnlineDate));\n }\n\n return lang('LastSeen.AtDate', formatFullDate(lang, wasOnlineDate));\n }\n\n case 'userStatusOnline': {\n return lang('Online');\n }\n\n case 'userStatusRecently': {\n return lang('Lately');\n }\n\n default:\n return undefined;\n }\n}\n\nexport function isUserOnline(user: ApiUser, userStatus?: ApiUserStatus) {\n const { id, type } = user;\n\n if (!userStatus) {\n return false;\n }\n\n if (id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return userStatus.type === 'userStatusOnline' && type !== 'userTypeBot';\n}\n\nexport function isDeletedUser(user: ApiUser) {\n if (user.noStatus || user.type === 'userTypeBot' || user.id === SERVICE_NOTIFICATIONS_USER_ID) {\n return false;\n }\n\n return user.type === 'userTypeDeleted'\n || user.type === 'userTypeUnknown';\n}\n\nexport function isUserBot(user: ApiUser) {\n return user.type === 'userTypeBot';\n}\n\nexport function getCanAddContact(user: ApiUser) {\n return !user.isContact && !isUserBot(user);\n}\n\nexport function sortUserIds(\n userIds: string[],\n usersById: Record<string, ApiUser>,\n userStatusesById: Record<string, ApiUserStatus>,\n priorityIds?: string[],\n serverTimeOffset = 0,\n) {\n return orderBy(userIds, (id) => {\n const now = getServerTime(serverTimeOffset);\n\n if (priorityIds && priorityIds.includes(id)) {\n // Assuming that online status expiration date can't be as far as two days from now,\n // this should place prioritized on top of the list.\n // Then we subtract index of `id` in `priorityIds` to preserve selected order\n return now + (48 * 60 * 60) - (priorityIds.length - priorityIds.indexOf(id));\n }\n\n const user = usersById[id];\n const userStatus = userStatusesById[id];\n if (!user || !userStatus) {\n return 0;\n }\n\n if (userStatus.type === 'userStatusOnline') {\n return userStatus.expires;\n } else if (userStatus.type === 'userStatusOffline' && userStatus.wasOnline) {\n return userStatus.wasOnline;\n }\n\n switch (userStatus.type) {\n case 'userStatusRecently':\n return now - 60 * 60 * 24;\n case 'userStatusLastWeek':\n return now - 60 * 60 * 24 * 7;\n case 'userStatusLastMonth':\n return now - 60 * 60 * 24 * 7 * 30;\n default:\n return 0;\n }\n }, 'desc');\n}\n\nexport function filterUsersByName(\n userIds: string[],\n usersById: Record<string, ApiUser>,\n query?: string,\n currentUserId?: string,\n savedMessagesLang?: string,\n) {\n if (!query) {\n return userIds;\n }\n\n const searchWords = prepareSearchWordsForNeedle(query);\n\n return userIds.filter((id) => {\n const user = usersById[id];\n if (!user) {\n return false;\n }\n\n const name = id === currentUserId ? savedMessagesLang : getUserFullName(user);\n return (name && searchWords(name)) || searchWords(user.username);\n });\n}\n\nexport function getUserIdDividend(userId: string) {\n // Workaround for old-fashioned IDs stored locally\n if (typeof userId === 'number') {\n return Math.abs(userId);\n }\n\n return Math.abs(Number(userId));\n}\n\n// eslint-disable-next-line max-len\n// https://github.com/telegramdesktop/tdesktop/blob/371510cfe23b0bd226de8c076bc49248fbe40c26/Telegram/SourceFiles/data/data_peer.cpp#L53\nexport function getUserColorKey(peer: ApiUser | ApiChat | undefined) {\n const index = peer ? getUserIdDividend(peer.id) % 7 : 0;\n\n return USER_COLOR_KEYS[index];\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiPhoto } from '../../api/types';\n\nimport { ARCHIVED_FOLDER_ID } from '../../config';\nimport { omit } from '../../util/iteratees';\nimport { selectChatListType } from '../selectors';\n\nexport function replaceChatListIds(\n global: GlobalState,\n type: 'active' | 'archived',\n newIds: string[] | undefined,\n): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n listIds: {\n ...global.chats.listIds,\n [type]: newIds,\n },\n },\n };\n}\n\nexport function updateChatListIds(global: GlobalState, type: 'active' | 'archived', idsUpdate: string[]): GlobalState {\n const { [type]: listIds } = global.chats.listIds;\n const newIds = listIds?.length\n ? idsUpdate.filter((id) => !listIds.includes(id))\n : idsUpdate;\n\n if (listIds && !newIds.length) {\n return global;\n }\n\n return replaceChatListIds(global, type, [\n ...(listIds || []),\n ...newIds,\n ]);\n}\n\nexport function replaceChats(global: GlobalState, newById: Record<string, ApiChat>): GlobalState {\n return {\n ...global,\n chats: {\n ...global.chats,\n byId: newById,\n },\n };\n}\n\nexport function updateChat(\n global: GlobalState, chatId: string, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n): GlobalState {\n const { byId } = global.chats;\n\n const updatedChat = getUpdatedChat(global, chatId, chatUpdate, photo);\n if (!updatedChat) {\n return global;\n }\n\n return replaceChats(global, {\n ...byId,\n [chatId]: updatedChat,\n });\n}\n\nexport function updateChats(global: GlobalState, newById: Record<string, ApiChat>): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record<string, ApiChat>, id) => {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n }\n\n return acc;\n }, {});\n\n global = replaceChats(global, {\n ...global.chats.byId,\n ...updatedById,\n });\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addChats(global: GlobalState, newById: Record<string, ApiChat>): GlobalState {\n const { byId } = global.chats;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce<Record<string, ApiChat>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedChat = getUpdatedChat(global, id, newById[id]);\n if (updatedChat) {\n acc[id] = updatedChat;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceChats(global, {\n ...byId,\n ...addedById,\n });\n\n return global;\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedChat(\n global: GlobalState, chatId: string, chatUpdate: Partial<ApiChat>, photo?: ApiPhoto,\n) {\n const { byId } = global.chats;\n const chat = byId[chatId];\n const shouldOmitMinInfo = chatUpdate.isMin && chat && !chat.isMin;\n const updatedChat: ApiChat = {\n ...chat,\n ...(shouldOmitMinInfo ? omit(chatUpdate, ['isMin', 'accessHash']) : chatUpdate),\n ...(photo && { photos: [photo, ...(chat.photos || [])] }),\n };\n\n if (!updatedChat.id || !updatedChat.type) {\n return undefined;\n }\n\n return updatedChat;\n}\n\nexport function updateChatListType(\n global: GlobalState,\n chatId: string,\n folderId?: number,\n): GlobalState {\n const listType = folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n\n let currentListIds = global.chats.listIds;\n (Object.keys(currentListIds) as Array<keyof typeof currentListIds>).forEach((listTypeKey) => {\n const currentFolderList = currentListIds[listTypeKey] || [];\n if (listTypeKey === listType && !currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: [...currentFolderList, chatId],\n };\n } else if (listTypeKey !== listType && currentFolderList.includes(chatId)) {\n currentListIds = {\n ...currentListIds,\n [listTypeKey]: currentFolderList.filter((id) => id !== chatId),\n };\n }\n });\n\n global = {\n ...global,\n chats: {\n ...global.chats,\n listIds: currentListIds,\n },\n };\n\n global = updateChat(global, chatId, { folderId: folderId || undefined });\n\n return global;\n}\n\nexport function updateChatListSecondaryInfo(\n global: GlobalState,\n type: 'active' | 'archived',\n info: {\n orderedPinnedIds?: string[];\n totalChatCount: number;\n },\n): GlobalState {\n const totalCountKey = type === 'active' ? 'all' : 'archived';\n\n return {\n ...global,\n chats: {\n ...global.chats,\n ...(info.orderedPinnedIds && {\n orderedPinnedIds: {\n ...global.chats.orderedPinnedIds,\n [type]: info.orderedPinnedIds,\n },\n }),\n totalCount: {\n ...global.chats.totalCount,\n [totalCountKey]: info.totalChatCount,\n },\n isFullyLoaded: {\n ...global.chats.isFullyLoaded,\n [type]: false,\n },\n },\n };\n}\n\nexport function leaveChat(global: GlobalState, leftChatId: string): GlobalState {\n const listType = selectChatListType(global, leftChatId);\n if (!listType) {\n return global;\n }\n\n const { [listType]: listIds } = global.chats.listIds;\n\n if (listIds) {\n global = replaceChatListIds(global, listType, listIds.filter((listId) => listId !== leftChatId));\n }\n\n global = updateChat(global, leftChatId, { isNotJoined: true });\n\n return global;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker, ApiStickerSet, ApiVideo } from '../../api/types';\nimport { buildCollectionByKey, unique } from '../../util/iteratees';\nimport { selectStickersForEmoji } from '../selectors';\n\nexport function updateStickerSets(\n global: GlobalState,\n category: 'added' | 'featured' | 'search',\n hash: string,\n sets: ApiStickerSet[],\n resultIds?: string[],\n): GlobalState {\n const updatedSets = sets.map((stickerSet) => {\n const existing = global.stickers.setsById[stickerSet.id];\n if (!existing) {\n return stickerSet;\n }\n\n return {\n ...existing,\n ...stickerSet,\n };\n });\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n setsById: {\n ...global.stickers.setsById,\n ...buildCollectionByKey(updatedSets, 'id'),\n },\n [category]: {\n ...global.stickers[category],\n hash,\n ...(\n category === 'search'\n ? { resultIds }\n : { setIds: sets.map(({ id }) => id) }\n ),\n },\n },\n };\n}\n\nexport function updateStickerSet(\n global: GlobalState, stickerSetId: string, update: Partial<ApiStickerSet>,\n): GlobalState {\n const currentStickerSet = global.stickers.setsById[stickerSetId] || {};\n const addedSets = global.stickers.added.setIds || [];\n let setIds: string[] = addedSets;\n if (update.installedDate && addedSets && !addedSets.includes(stickerSetId)) {\n setIds = [stickerSetId, ...setIds];\n }\n\n if (!update.installedDate && addedSets?.includes(stickerSetId)) {\n setIds = setIds.filter((id) => id !== stickerSetId);\n }\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n added: {\n ...global.stickers.added,\n setIds,\n },\n setsById: {\n ...global.stickers.setsById,\n [stickerSetId]: {\n ...currentStickerSet,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateGifSearch(\n global: GlobalState, isNew: boolean, results: ApiVideo[], nextOffset?: string,\n): GlobalState {\n const { results: currentResults } = global.gifs.search;\n\n let newResults!: ApiVideo[];\n if (isNew || !currentResults) {\n newResults = results;\n } else {\n const currentIds = new Set(currentResults.map((gif) => gif.id));\n newResults = [\n ...currentResults,\n ...results.filter((gif) => !currentIds.has(gif.id)),\n ];\n }\n\n return {\n ...global,\n gifs: {\n ...global.gifs,\n search: {\n ...global.gifs.search,\n offset: nextOffset,\n results: newResults,\n },\n },\n };\n}\n\nexport function replaceAnimatedEmojis(global: GlobalState, stickerSet: ApiStickerSet): GlobalState {\n return {\n ...global,\n animatedEmojis: stickerSet,\n };\n}\n\nexport function updateStickersForEmoji(\n global: GlobalState, emoji: string, remoteStickers?: ApiSticker[], hash?: string,\n): GlobalState {\n const localStickers = selectStickersForEmoji(global, emoji);\n const allStickers = [...localStickers, ...(remoteStickers || [])];\n const uniqueIds = unique(allStickers.map(({ id }) => id));\n const byId = buildCollectionByKey(allStickers, 'id');\n const stickers = uniqueIds.map((id) => byId[id]);\n\n return {\n ...global,\n stickers: {\n ...global.stickers,\n forEmoji: {\n emoji,\n stickers,\n hash,\n },\n },\n };\n}\n\nexport function rebuildStickersForEmoji(global: GlobalState): GlobalState {\n const { emoji, stickers, hash } = global.stickers.forEmoji || {};\n if (!emoji) {\n return global;\n }\n\n return updateStickersForEmoji(global, emoji, stickers, hash);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiUser, ApiUserStatus } from '../../api/types';\n\nimport { omit, pick } from '../../util/iteratees';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nexport function replaceUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n byId: newById,\n },\n };\n}\n\nfunction updateContactList(global: GlobalState, updatedUsers: ApiUser[]): GlobalState {\n const { userIds: contactUserIds } = global.contactList || {};\n\n if (!contactUserIds) return global;\n\n const newContactUserIds = updatedUsers\n .filter((user) => user?.isContact && !contactUserIds.includes(user.id))\n .map((user) => user.id);\n\n if (newContactUserIds.length === 0) return global;\n\n return {\n ...global,\n contactList: {\n userIds: [\n ...newContactUserIds,\n ...contactUserIds,\n ],\n },\n };\n}\n\nexport function updateUser(global: GlobalState, userId: string, userUpdate: Partial<ApiUser>): GlobalState {\n const { byId } = global.users;\n\n const updatedUser = getUpdatedUser(global, userId, userUpdate);\n if (!updatedUser) {\n return global;\n }\n\n global = updateContactList(global, [updatedUser]);\n\n return replaceUsers(global, {\n ...byId,\n [userId]: updatedUser,\n });\n}\n\nexport function updateUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n const updatedById = Object.keys(newById).reduce((acc: Record<string, ApiUser>, id) => {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n }\n\n return acc;\n }, {});\n\n global = replaceUsers(global, {\n ...global.users.byId,\n ...updatedById,\n });\n\n global = updateContactList(global, Object.values(updatedById));\n\n return global;\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUsers(global: GlobalState, newById: Record<string, ApiUser>): GlobalState {\n const { byId } = global.users;\n let isUpdated = false;\n\n const addedById = Object.keys(newById).reduce<Record<string, ApiUser>>((acc, id) => {\n if (!byId[id] || (byId[id].isMin && !newById[id].isMin)) {\n const updatedUser = getUpdatedUser(global, id, newById[id]);\n if (updatedUser) {\n acc[id] = updatedUser;\n if (!isUpdated) {\n isUpdated = true;\n }\n }\n }\n return acc;\n }, {});\n\n if (!isUpdated) {\n return global;\n }\n\n global = replaceUsers(global, {\n ...byId,\n ...addedById,\n });\n\n global = updateContactList(global, Object.values(addedById));\n\n return global;\n}\n\n// @optimization Don't spread/unspread global for each element, do it in a batch\nfunction getUpdatedUser(global: GlobalState, userId: string, userUpdate: Partial<ApiUser>) {\n const { byId } = global.users;\n const user = byId[userId];\n const shouldOmitMinInfo = userUpdate.isMin && user && !user.isMin;\n\n const updatedUser = {\n ...user,\n ...(shouldOmitMinInfo ? omit(userUpdate, ['isMin', 'accessHash']) : userUpdate),\n };\n\n if (!updatedUser.id || !updatedUser.type) {\n return undefined;\n }\n\n return updatedUser;\n}\n\nexport function deleteContact(global: GlobalState, userId: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\n\n global = {\n ...global,\n contactList: {\n userIds: userIds ? userIds.filter((id) => id !== userId) : MEMO_EMPTY_ARRAY,\n },\n };\n\n return replaceUsers(global, {\n ...byId,\n [userId]: {\n ...byId[userId],\n isContact: undefined,\n },\n });\n}\n\nexport function updateUserSearch(\n global: GlobalState,\n searchStatePartial: Partial<GlobalState['userSearch']>,\n) {\n return {\n ...global,\n userSearch: {\n ...global.userSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateUserSearchFetchingStatus(\n global: GlobalState, newState: boolean,\n) {\n return updateUserSearch(global, {\n fetchingStatus: newState,\n });\n}\n\nexport function updateUserBlockedState(global: GlobalState, userId: string, isBlocked: boolean) {\n const { byId } = global.users;\n const user = byId[userId];\n if (!user || !user.fullInfo) {\n return global;\n }\n\n return updateUser(global, userId, {\n ...user,\n fullInfo: {\n ...user.fullInfo,\n isBlocked,\n },\n });\n}\n\nexport function replaceUserStatuses(global: GlobalState, newById: Record<string, ApiUserStatus>): GlobalState {\n return {\n ...global,\n users: {\n ...global.users,\n statusesById: newById,\n },\n };\n}\n\n// @optimization Allows to avoid redundant updates which cause a lot of renders\nexport function addUserStatuses(global: GlobalState, newById: Record<string, ApiUserStatus>): GlobalState {\n const { statusesById } = global.users;\n\n const newKeys = Object.keys(newById).filter((id) => !statusesById[id]);\n if (!newKeys.length) {\n return global;\n }\n\n global = replaceUserStatuses(global, {\n ...statusesById,\n ...pick(newById, newKeys),\n });\n\n return global;\n}\n","import { GlobalState } from '../../global/types';\nimport { GlobalSearchContent } from '../../types';\nimport { ApiGlobalMessageSearchType, ApiMessage } from '../../api/types';\nimport { areSortedArraysEqual } from '../../util/iteratees';\n\nconst getComplexKey = (message: ApiMessage) => `${message.chatId}_${message.id}`;\n\nexport function updateGlobalSearch(\n global: GlobalState,\n searchStatePartial: Partial<GlobalState['globalSearch']>,\n) {\n return {\n ...global,\n globalSearch: {\n ...global.globalSearch,\n ...searchStatePartial,\n },\n };\n}\n\nexport function updateGlobalSearchContent(\n global: GlobalState,\n currentContent: GlobalSearchContent | undefined,\n): GlobalState {\n return updateGlobalSearch(global, { currentContent });\n}\n\nexport function updateGlobalSearchResults(\n global: GlobalState,\n newFoundMessages: ApiMessage[],\n totalCount: number,\n type: ApiGlobalMessageSearchType,\n nextRate?: number,\n): GlobalState {\n const { resultsByType } = global.globalSearch || {};\n const newFoundMessagesById = newFoundMessages.reduce((result, message) => {\n result[getComplexKey(message)] = message;\n\n return result;\n }, {} as Record<string, ApiMessage>);\n const foundIdsForType = resultsByType?.[type]?.foundIds;\n\n if (foundIdsForType !== undefined\n && Object.keys(newFoundMessagesById).every(\n (newId) => foundIdsForType.includes(getComplexKey(newFoundMessagesById[newId])),\n )\n ) {\n return updateGlobalSearchFetchingStatus(global, { messages: false });\n }\n\n const prevFoundIds = foundIdsForType || [];\n const newFoundIds = newFoundMessages.map((message) => getComplexKey(message));\n const foundIds = Array.prototype.concat(prevFoundIds, newFoundIds);\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n global = updateGlobalSearchFetchingStatus(global, { messages: false });\n\n return updateGlobalSearch(global, {\n resultsByType: {\n ...(global.globalSearch || {}).resultsByType,\n [type]: {\n totalCount,\n nextOffsetId: nextRate,\n foundIds: foundOrPrevFoundIds,\n },\n },\n });\n}\n\nexport function updateGlobalSearchFetchingStatus(\n global: GlobalState, newState: { chats?: boolean; messages?: boolean },\n) {\n return updateGlobalSearch(global, {\n fetchingStatus: {\n ...global.globalSearch.fetchingStatus,\n ...newState,\n },\n });\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiMessageSearchType } from '../../api/types';\n\nimport { areSortedArraysEqual, unique } from '../../util/iteratees';\nimport { SharedMediaType } from '../../types';\nimport { buildChatThreadKey } from '../helpers';\n\ninterface TextSearchParams {\n isActive: boolean;\n query?: string;\n results?: {\n totalCount?: number;\n nextOffsetId?: number;\n foundIds?: number[];\n };\n}\n\ninterface MediaSearchParams {\n currentType?: SharedMediaType;\n resultsByType?: Partial<Record<SharedMediaType, {\n totalCount?: number;\n nextOffsetId: number;\n foundIds: number[];\n }>>;\n}\n\nfunction replaceLocalTextSearch(\n global: GlobalState,\n chatThreadKey: string,\n searchParams: TextSearchParams,\n): GlobalState {\n return {\n ...global,\n localTextSearch: {\n byChatThreadKey: {\n ...global.localTextSearch.byChatThreadKey,\n [chatThreadKey]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalTextSearch(\n global: GlobalState,\n chatId: string,\n threadId: number,\n isActive: boolean,\n query?: string,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n isActive,\n query,\n });\n}\n\nexport function replaceLocalTextSearchResults(\n global: GlobalState,\n chatId: string,\n threadId: number,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n\n return replaceLocalTextSearch(global, chatThreadKey, {\n ...global.localTextSearch.byChatThreadKey[chatThreadKey],\n results: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n });\n}\n\nexport function updateLocalTextSearchResults(\n global: GlobalState,\n chatId: string,\n threadId: number,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const { results } = global.localTextSearch.byChatThreadKey[chatThreadKey] || {};\n const prevFoundIds = (results?.foundIds) || [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalTextSearchResults(global, chatId, threadId, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction replaceLocalMediaSearch(\n global: GlobalState,\n chatId: string,\n searchParams: MediaSearchParams,\n): GlobalState {\n return {\n ...global,\n localMediaSearch: {\n byChatId: {\n ...global.localMediaSearch.byChatId,\n [chatId]: searchParams,\n },\n },\n };\n}\n\nexport function updateLocalMediaSearchType(\n global: GlobalState,\n chatId: string,\n currentType: SharedMediaType | undefined,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n currentType,\n });\n}\n\nexport function replaceLocalMediaSearchResults(\n global: GlobalState,\n chatId: string,\n type: ApiMessageSearchType,\n foundIds?: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n return replaceLocalMediaSearch(global, chatId, {\n ...global.localMediaSearch.byChatId[chatId],\n resultsByType: {\n ...(global.localMediaSearch.byChatId[chatId] || {}).resultsByType,\n [type]: {\n foundIds,\n totalCount,\n nextOffsetId,\n },\n },\n });\n}\n\nexport function updateLocalMediaSearchResults(\n global: GlobalState,\n chatId: string,\n type: SharedMediaType,\n newFoundIds: number[],\n totalCount?: number,\n nextOffsetId?: number,\n): GlobalState {\n const { resultsByType } = global.localMediaSearch.byChatId[chatId] || {};\n const prevFoundIds = resultsByType?.[type] ? resultsByType[type]!.foundIds : [];\n const foundIds = orderFoundIds(unique(Array.prototype.concat(prevFoundIds, newFoundIds)));\n const foundOrPrevFoundIds = areSortedArraysEqual(prevFoundIds, foundIds) ? prevFoundIds : foundIds;\n\n return replaceLocalMediaSearchResults(global, chatId, type, foundOrPrevFoundIds, totalCount, nextOffsetId);\n}\n\nfunction orderFoundIds(listedIds: number[]) {\n return listedIds.sort((a, b) => b - a);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress, ManagementState } from '../../types';\n\nexport function updateManagementProgress(global: GlobalState, progress: ManagementProgress): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n progress,\n },\n };\n}\n\nexport function updateManagement(global: GlobalState, chatId: string, update: Partial<ManagementState>): GlobalState {\n return {\n ...global,\n management: {\n ...global.management,\n byChatId: {\n ...global.management.byChatId,\n [chatId]: {\n ...(global.management.byChatId[chatId] || {}),\n ...update,\n },\n },\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport {\n ISettings, IThemeSettings, ThemeKey, NotifyException,\n} from '../../types';\nimport { ApiNotifyException } from '../../api/types';\nimport { updateUserBlockedState } from './users';\n\nexport function replaceSettings(global: GlobalState, newSettings?: Partial<ISettings>): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n byKey: {\n ...global.settings.byKey,\n ...newSettings,\n },\n },\n };\n}\n\nexport function replaceThemeSettings(\n global: GlobalState, theme: ThemeKey, newSettings?: Partial<IThemeSettings>,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n themes: {\n ...global.settings.themes,\n [theme]: {\n ...(global.settings.themes[theme] || {}),\n ...newSettings,\n },\n },\n },\n };\n}\n\nexport function addNotifyExceptions(\n global: GlobalState, notifyExceptions: ApiNotifyException[],\n): GlobalState {\n notifyExceptions.forEach((notifyException) => {\n const { chatId, ...exceptionData } = notifyException;\n global = addNotifyException(global, chatId, exceptionData);\n });\n\n return global;\n}\n\nexport function addNotifyException(\n global: GlobalState, id: string, notifyException: NotifyException,\n): GlobalState {\n return {\n ...global,\n settings: {\n ...global.settings,\n notifyExceptions: {\n ...global.settings.notifyExceptions,\n [id]: notifyException,\n },\n },\n };\n}\n\nexport function updateNotifySettings(\n global: GlobalState, peerType: 'contact' | 'group' | 'broadcast', isSilent?: boolean, shouldShowPreviews?: boolean,\n) {\n switch (peerType) {\n case 'contact':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasPrivateChatsNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasPrivateChatsMessagePreview: shouldShowPreviews }),\n });\n case 'group':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasGroupNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasGroupMessagePreview: shouldShowPreviews }),\n });\n case 'broadcast':\n return replaceSettings(global, {\n ...(typeof isSilent !== 'undefined' && { hasBroadcastNotifications: !isSilent }),\n ...(typeof shouldShowPreviews !== 'undefined' && { hasBroadcastMessagePreview: shouldShowPreviews }),\n });\n\n default:\n return undefined;\n }\n}\n\nexport function addBlockedContact(global: GlobalState, contactId: string): GlobalState {\n global = updateUserBlockedState(global, contactId, true);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: [contactId, ...global.blocked.ids],\n totalCount: global.blocked.totalCount + 1,\n },\n };\n}\n\nexport function removeBlockedContact(global: GlobalState, contactId: string): GlobalState {\n global = updateUserBlockedState(global, contactId, false);\n\n return {\n ...global,\n blocked: {\n ...global.blocked,\n ids: global.blocked.ids.filter((id) => id !== contactId),\n totalCount: global.blocked.totalCount - 1,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\n\nexport function updateTwoFaSettings(\n global: GlobalState,\n update: GlobalState['twoFaSettings'],\n): GlobalState {\n return {\n ...global,\n twoFaSettings: {\n ...global.twoFaSettings,\n ...update,\n },\n };\n}\n","import { GlobalState } from '../../global/types';\nimport { ShippingOption, PaymentStep } from '../../types';\nimport { ApiMessage, ApiPaymentForm, ApiReceipt } from '../../api/types';\n\nexport function updateShippingOptions(\n global: GlobalState,\n shippingOptions: ShippingOption[],\n): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n shippingOptions,\n },\n };\n}\n\nexport function setRequestInfoId(global: GlobalState, id: string): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n requestId: id,\n },\n };\n}\n\nexport function setPaymentStep(global: GlobalState, step: PaymentStep): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n step,\n },\n };\n}\n\nexport function setInvoiceMessageInfo(global: GlobalState, message: ApiMessage): GlobalState {\n if (!message.content || !message.content.invoice) {\n return global;\n }\n const {\n title,\n text,\n amount,\n currency,\n isTest,\n photoUrl,\n } = message.content.invoice;\n return {\n ...global,\n payment: {\n ...global.payment,\n invoiceContent: {\n title,\n text,\n photoUrl,\n amount,\n currency,\n isTest,\n },\n },\n };\n}\n\nexport function setStripeCardInfo(global: GlobalState, cardInfo: { type: string; id: string }): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n stripeCredentials: {\n ...cardInfo,\n },\n },\n };\n}\n\nexport function setPaymentForm(global: GlobalState, form: ApiPaymentForm): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n ...form,\n },\n };\n}\n\nexport function setReceipt(\n global: GlobalState,\n receipt?: ApiReceipt,\n message?: ApiMessage,\n): GlobalState {\n if (!receipt || !message) {\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: undefined,\n },\n };\n }\n\n const { invoice: messageInvoice } = message.content;\n const { photoUrl, text, title } = (messageInvoice || {});\n\n return {\n ...global,\n payment: {\n ...global.payment,\n receipt: {\n ...receipt,\n photoUrl,\n text,\n title,\n },\n },\n };\n}\n\nexport function clearPayment(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {},\n };\n}\n\nexport function closeInvoice(global: GlobalState): GlobalState {\n return {\n ...global,\n payment: {\n ...global.payment,\n isPaymentModalOpen: false,\n },\n };\n}\n","import {\n GlobalState, MessageList, MessageListType, Thread,\n} from '../../global/types';\nimport {\n ApiMessage, ApiSponsoredMessage, ApiThreadInfo, MAIN_THREAD_ID,\n} from '../../api/types';\nimport { FocusDirection } from '../../types';\n\nimport {\n IS_TEST, MESSAGE_LIST_SLICE, MESSAGE_LIST_VIEWPORT_LIMIT, TMP_CHAT_ID,\n} from '../../config';\nimport {\n selectListedIds,\n selectChatMessages,\n selectViewportIds,\n selectOutlyingIds,\n selectPinnedIds,\n selectThreadInfo,\n selectMessageIdsByGroupId,\n selectScheduledMessages,\n selectScheduledIds,\n selectCurrentMessageIds,\n selectChatMessage,\n selectCurrentMessageList,\n} from '../selectors';\nimport {\n areSortedArraysEqual, omit, pickTruthy, unique,\n} from '../../util/iteratees';\n\ntype MessageStoreSections = {\n byId: Record<number, ApiMessage>;\n threadsById: Record<number, Thread>;\n};\n\nexport function updateCurrentMessageList(\n global: GlobalState,\n chatId: string | undefined,\n threadId: number = MAIN_THREAD_ID,\n type: MessageListType = 'thread',\n shouldReplaceHistory?: boolean,\n): GlobalState {\n const { messageLists } = global.messages;\n let newMessageLists: MessageList[] = messageLists;\n if (shouldReplaceHistory || IS_TEST) {\n newMessageLists = chatId ? [{ chatId, threadId, type }] : [];\n } else if (chatId) {\n const last = messageLists[messageLists.length - 1];\n if (!last || last.chatId !== chatId || last.threadId !== threadId || last.type !== type) {\n if (last && last.chatId === TMP_CHAT_ID) {\n newMessageLists = [...messageLists.slice(0, -1), { chatId, threadId, type }];\n } else {\n newMessageLists = [...messageLists, { chatId, threadId, type }];\n }\n }\n } else {\n newMessageLists = messageLists.slice(0, -1);\n }\n\n return {\n ...global,\n messages: {\n ...global.messages,\n messageLists: newMessageLists,\n },\n };\n}\n\nfunction replaceChatMessages(global: GlobalState, chatId: string, newById: Record<number, ApiMessage>): GlobalState {\n return updateMessageStore(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateThread(\n global: GlobalState, chatId: string, threadId: number, threadUpdate: Partial<Thread>,\n): GlobalState {\n const current = global.messages.byChatId[chatId];\n\n return updateMessageStore(global, chatId, {\n threadsById: {\n ...(current?.threadsById),\n [threadId]: {\n ...(current?.threadsById[threadId]),\n ...threadUpdate,\n },\n },\n });\n}\n\nfunction updateMessageStore(\n global: GlobalState, chatId: string, update: Partial<MessageStoreSections>,\n): GlobalState {\n const current = global.messages.byChatId[chatId] || { byId: {}, threadsById: {} };\n\n return {\n ...global,\n messages: {\n ...global.messages,\n byChatId: {\n ...global.messages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function replaceThreadParam<T extends keyof Thread>(\n global: GlobalState, chatId: string, threadId: number, paramName: T, newValue: Thread[T] | undefined,\n) {\n return updateThread(global, chatId, threadId, { [paramName]: newValue });\n}\n\nexport function addMessages(\n global: GlobalState, messages: ApiMessage[],\n): GlobalState {\n const addedByChatId = messages.reduce((messagesByChatId, message: ApiMessage) => {\n if (!messagesByChatId[message.chatId]) {\n messagesByChatId[message.chatId] = {};\n }\n messagesByChatId[message.chatId][message.id] = message;\n\n return messagesByChatId;\n }, {} as Record<string, Record<number, ApiMessage>>);\n\n Object.keys(addedByChatId).forEach((chatId) => {\n global = addChatMessagesById(global, chatId, addedByChatId[chatId]);\n });\n\n return global;\n}\n\nexport function addChatMessagesById(\n global: GlobalState, chatId: string, newById: Record<number, ApiMessage>,\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n\n if (byId && Object.keys(newById).every((newId) => Boolean(byId[Number(newId)]))) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...newById,\n ...byId,\n });\n}\n\nexport function updateChatMessage(\n global: GlobalState, chatId: string, messageId: number, messageUpdate: Partial<ApiMessage>,\n): GlobalState {\n const byId = selectChatMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceChatMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function updateScheduledMessage(\n global: GlobalState, chatId: string, messageId: number, messageUpdate: Partial<ApiMessage>,\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId) || {};\n const message = byId[messageId];\n const updatedMessage = {\n ...message,\n ...messageUpdate,\n };\n\n if (!updatedMessage.id) {\n return global;\n }\n\n return replaceScheduledMessages(global, chatId, {\n ...byId,\n [messageId]: updatedMessage,\n });\n}\n\nexport function deleteChatMessages(\n global: GlobalState,\n chatId: string,\n messageIds: number[],\n): GlobalState {\n const byId = selectChatMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n const deletedForwardedPosts = Object.values(pickTruthy(byId, messageIds)).filter(\n ({ forwardInfo }) => forwardInfo?.isLinkedChannelPost,\n );\n\n const threadIds = Object.keys(global.messages.byChatId[chatId].threadsById).map(Number);\n threadIds.forEach((threadId) => {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n\n let listedIds = selectListedIds(global, chatId, threadId);\n let outlyingIds = selectOutlyingIds(global, chatId, threadId);\n let viewportIds = selectViewportIds(global, chatId, threadId);\n let pinnedIds = selectPinnedIds(global, chatId);\n let newMessageCount = threadInfo?.messagesCount;\n\n messageIds.forEach((messageId) => {\n if (listedIds && listedIds.includes(messageId)) {\n listedIds = listedIds.filter((id) => id !== messageId);\n if (newMessageCount !== undefined) newMessageCount -= 1;\n }\n\n if (outlyingIds && outlyingIds.includes(messageId)) {\n outlyingIds = outlyingIds.filter((id) => id !== messageId);\n }\n\n if (viewportIds && viewportIds.includes(messageId)) {\n viewportIds = viewportIds.filter((id) => id !== messageId);\n }\n\n if (pinnedIds && pinnedIds.includes(messageId)) {\n pinnedIds = pinnedIds.filter((id) => id !== messageId);\n }\n });\n\n global = replaceThreadParam(global, chatId, threadId, 'listedIds', listedIds);\n global = replaceThreadParam(global, chatId, threadId, 'outlyingIds', outlyingIds);\n global = replaceThreadParam(global, chatId, threadId, 'viewportIds', viewportIds);\n global = replaceThreadParam(global, chatId, threadId, 'pinnedIds', pinnedIds);\n\n if (threadInfo && newMessageCount !== undefined) {\n global = replaceThreadParam(global, chatId, threadId, 'threadInfo', {\n ...threadInfo,\n messagesCount: newMessageCount,\n });\n }\n });\n\n if (deletedForwardedPosts.length) {\n const currentMessageList = selectCurrentMessageList(global);\n const canDeleteCurrentThread = currentMessageList && currentMessageList.chatId === chatId\n && currentMessageList.type === 'thread';\n const currentThreadId = currentMessageList?.threadId;\n\n deletedForwardedPosts.forEach((message) => {\n const { fromChatId, fromMessageId } = message.forwardInfo!;\n const originalPost = selectChatMessage(global, fromChatId!, fromMessageId!);\n\n if (canDeleteCurrentThread && currentThreadId === fromMessageId) {\n global = updateCurrentMessageList(global, chatId);\n }\n if (originalPost) {\n global = updateChatMessage(global, fromChatId!, fromMessageId!, { threadInfo: undefined });\n }\n });\n }\n\n global = replaceChatMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function deleteChatScheduledMessages(\n global: GlobalState,\n chatId: string,\n messageIds: number[],\n): GlobalState {\n const byId = selectScheduledMessages(global, chatId);\n if (!byId) {\n return global;\n }\n const newById = omit(byId, messageIds);\n\n let scheduledIds = selectScheduledIds(global, chatId);\n if (scheduledIds) {\n messageIds.forEach((messageId) => {\n if (scheduledIds!.includes(messageId)) {\n scheduledIds = scheduledIds!.filter((id) => id !== messageId);\n }\n });\n global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds', scheduledIds);\n }\n\n global = replaceScheduledMessages(global, chatId, newById);\n\n return global;\n}\n\nexport function updateListedIds(\n global: GlobalState,\n chatId: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const listedIds = selectListedIds(global, chatId, threadId);\n const newIds = listedIds?.length\n ? idsUpdate.filter((id) => !listedIds.includes(id))\n : idsUpdate;\n\n if (listedIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'listedIds', orderHistoryIds([\n ...(listedIds || []),\n ...newIds,\n ]));\n}\n\nexport function updateOutlyingIds(\n global: GlobalState,\n chatId: string,\n threadId: number,\n idsUpdate: number[],\n): GlobalState {\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const newIds = outlyingIds?.length\n ? idsUpdate.filter((id) => !outlyingIds.includes(id))\n : idsUpdate;\n\n if (outlyingIds && !newIds.length) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'outlyingIds', orderHistoryIds([\n ...(outlyingIds || []),\n ...newIds,\n ]));\n}\n\nfunction orderHistoryIds(listedIds: number[]) {\n return listedIds.sort((a, b) => a - b);\n}\n\nexport function addViewportId(\n global: GlobalState,\n chatId: string,\n threadId: number,\n newId: number,\n): GlobalState {\n const viewportIds = selectViewportIds(global, chatId, threadId) || [];\n if (viewportIds.includes(newId)) {\n return global;\n }\n\n const newIds = orderHistoryIds([\n ...(\n viewportIds.length < MESSAGE_LIST_VIEWPORT_LIMIT\n ? viewportIds\n : viewportIds.slice(-(MESSAGE_LIST_SLICE / 2))\n ),\n newId,\n ]);\n\n return replaceThreadParam(global, chatId, threadId, 'viewportIds', newIds);\n}\n\nexport function safeReplaceViewportIds(\n global: GlobalState,\n chatId: string,\n threadId: number,\n newViewportIds: number[],\n): GlobalState {\n const currentIds = selectViewportIds(global, chatId, threadId) || [];\n const newIds = orderHistoryIds(newViewportIds);\n\n return replaceThreadParam(\n global,\n chatId,\n threadId,\n 'viewportIds',\n areSortedArraysEqual(currentIds, newIds) ? currentIds : newIds,\n );\n}\n\nexport function updateThreadInfo(\n global: GlobalState, chatId: string, threadId: number, update: Partial<ApiThreadInfo> | undefined,\n): GlobalState {\n const newThreadInfo = {\n ...(selectThreadInfo(global, chatId, threadId) as ApiThreadInfo),\n ...update,\n };\n\n if (!newThreadInfo.threadId) {\n return global;\n }\n\n return replaceThreadParam(global, chatId, threadId, 'threadInfo', newThreadInfo);\n}\n\nexport function updateThreadInfos(\n global: GlobalState, chatId: string, updates: Partial<ApiThreadInfo>[],\n): GlobalState {\n updates.forEach((update) => {\n global = updateThreadInfo(global, update.chatId!, update.threadId!, update);\n });\n\n return global;\n}\n\nexport function replaceScheduledMessages(\n global: GlobalState, chatId: string, newById: Record<number, ApiMessage>,\n): GlobalState {\n return updateScheduledMessages(global, chatId, {\n byId: newById,\n });\n}\n\nfunction updateScheduledMessages(\n global: GlobalState, chatId: string, update: Partial<{ byId: Record<number, ApiMessage> }>,\n): GlobalState {\n const current = global.scheduledMessages.byChatId[chatId] || { byId: {}, hash: 0 };\n\n return {\n ...global,\n scheduledMessages: {\n byChatId: {\n ...global.scheduledMessages.byChatId,\n [chatId]: {\n ...current,\n ...update,\n },\n },\n },\n };\n}\n\nexport function updateFocusedMessage(\n global: GlobalState, chatId?: string, messageId?: number, noHighlight = false, isResizingContainer = false,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n chatId,\n messageId,\n noHighlight,\n isResizingContainer,\n },\n };\n}\n\nexport function updateSponsoredMessage(\n global: GlobalState, chatId: string, message: ApiSponsoredMessage,\n): GlobalState {\n return {\n ...global,\n messages: {\n ...global.messages,\n sponsoredByChatId: {\n ...global.messages.sponsoredByChatId,\n [chatId]: message,\n },\n },\n };\n}\n\nexport function updateFocusDirection(\n global: GlobalState, direction?: FocusDirection,\n): GlobalState {\n return {\n ...global,\n focusedMessage: {\n ...global.focusedMessage,\n direction,\n },\n };\n}\n\nexport function enterMessageSelectMode(\n global: GlobalState,\n chatId: string,\n messageId?: number | number[],\n): GlobalState {\n const messageIds = messageId ? Array.prototype.concat([], messageId) : [];\n return {\n ...global,\n selectedMessages: {\n chatId,\n messageIds,\n },\n };\n}\n\nexport function toggleMessageSelection(\n global: GlobalState,\n chatId: string,\n threadId: number,\n messageListType: MessageListType,\n messageId: number,\n groupedId?: string,\n childMessageIds?: number[],\n withShift = false,\n): GlobalState {\n const { selectedMessages: oldSelectedMessages } = global;\n if (groupedId) {\n childMessageIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n }\n const selectedMessageIds = childMessageIds || [messageId];\n if (!oldSelectedMessages) {\n return enterMessageSelectMode(global, chatId, selectedMessageIds);\n }\n\n const { messageIds } = oldSelectedMessages;\n\n let newMessageIds;\n const newSelectedMessageIds = selectedMessageIds.filter((id) => !messageIds.includes(id));\n if (newSelectedMessageIds && !newSelectedMessageIds.length) {\n newMessageIds = messageIds.filter((id) => !selectedMessageIds.includes(id));\n } else if (withShift && messageIds.length) {\n const viewportIds = selectCurrentMessageIds(global, chatId, threadId, messageListType)!;\n const prevIndex = viewportIds.indexOf(messageIds[messageIds.length - 1]);\n const currentIndex = viewportIds.indexOf(messageId);\n const from = Math.min(prevIndex, currentIndex);\n const to = Math.max(prevIndex, currentIndex);\n const slice = viewportIds.slice(from, to + 1);\n newMessageIds = unique([...messageIds, ...slice]);\n } else {\n newMessageIds = [...messageIds, ...newSelectedMessageIds];\n }\n\n if (!newMessageIds.length) {\n return exitMessageSelectMode(global);\n }\n\n return {\n ...global,\n selectedMessages: {\n ...oldSelectedMessages,\n messageIds: newMessageIds,\n },\n };\n}\n\nexport function exitMessageSelectMode(global: GlobalState): GlobalState {\n return {\n ...global,\n selectedMessages: undefined,\n };\n}\n\nexport function updateThreadUnreadFromForwardedMessage(\n global: GlobalState,\n originMessage: ApiMessage,\n chatId: string,\n lastMessageId: number,\n isDeleting?: boolean,\n) {\n const { channelPostId, fromChatId } = originMessage.forwardInfo || {};\n if (channelPostId && fromChatId) {\n const threadInfoOld = selectThreadInfo(global, chatId, channelPostId);\n if (threadInfoOld) {\n global = replaceThreadParam(global, chatId, channelPostId, 'threadInfo', {\n ...threadInfoOld,\n lastMessageId,\n messagesCount: threadInfoOld.messagesCount + (isDeleting ? -1 : 1),\n });\n }\n }\n return global;\n}\n","import { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isUserId, isHistoryClearMessage, isUserBot, isUserOnline,\n} from '../helpers';\nimport { selectUser } from './users';\nimport {\n ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, MEMBERS_LOAD_SLICE, SERVICE_NOTIFICATIONS_USER_ID,\n} from '../../config';\n\nexport function selectChat(global: GlobalState, chatId: string): ApiChat | undefined {\n return global.chats.byId[chatId];\n}\n\nexport function selectChatUser(global: GlobalState, chat: ApiChat) {\n const userId = getPrivateChatUserId(chat);\n if (!userId) {\n return false;\n }\n\n return selectUser(global, userId);\n}\n\nexport function selectIsChatWithSelf(global: GlobalState, chatId: string) {\n return chatId === global.currentUserId;\n}\n\nexport function selectIsChatWithBot(global: GlobalState, chat: ApiChat) {\n const user = selectChatUser(global, chat);\n return user && isUserBot(user);\n}\n\nexport function selectSupportChat(global: GlobalState) {\n return Object.values(global.chats.byId).find(({ isSupport }: ApiChat) => isSupport);\n}\n\nexport function selectChatOnlineCount(global: GlobalState, chat: ApiChat) {\n if (isUserId(chat.id) || isChatChannel(chat) || !chat.fullInfo) {\n return undefined;\n }\n\n if (!chat.fullInfo.members || chat.fullInfo.members.length === MEMBERS_LOAD_SLICE) {\n return chat.fullInfo.onlineCount;\n }\n\n return chat.fullInfo.members.reduce((onlineCount, { userId }) => {\n if (\n userId !== global.currentUserId\n && global.users.byId[userId]\n && isUserOnline(global.users.byId[userId], global.users.statusesById[userId])\n ) {\n return onlineCount + 1;\n }\n\n return onlineCount;\n }, 0);\n}\n\nexport function selectChatBot(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n const userId = chat && getPrivateChatUserId(chat);\n const user = userId && selectUser(global, userId);\n if (!user || !isUserBot(user)) {\n return undefined;\n }\n\n return user;\n}\n\nexport function selectIsChatBotNotStarted(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n const bot = selectChatBot(global, chatId);\n if (!chat || !bot) {\n return false;\n }\n\n if (chat.lastMessage && isHistoryClearMessage(chat.lastMessage)) {\n return true;\n }\n\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return false;\n }\n\n const { listedIds } = messageInfo.threadsById[MAIN_THREAD_ID] || {};\n return listedIds && !listedIds.length;\n}\n\nexport function selectAreActiveChatsLoaded(global: GlobalState): boolean {\n return Boolean(global.chats.listIds.active);\n}\n\nexport function selectIsChatListed(global: GlobalState, chatId: string, type?: 'active' | 'archived'): boolean {\n const { listIds } = global.chats;\n if (type) {\n const targetList = listIds[type];\n return Boolean(targetList && targetList.includes(chatId));\n }\n\n return Object.values(listIds).some((list) => list && list.includes(chatId));\n}\n\nexport function selectChatListType(global: GlobalState, chatId: string): 'active' | 'archived' | undefined {\n const chat = selectChat(global, chatId);\n if (!chat || !selectIsChatListed(global, chatId)) {\n return undefined;\n }\n\n return chat.folderId === ARCHIVED_FOLDER_ID ? 'archived' : 'active';\n}\n\nexport function selectChatFolder(global: GlobalState, folderId: number) {\n return global.chatFolders.byId[folderId];\n}\n\nexport function selectTotalChatCount(global: GlobalState, listType: 'active' | 'archived'): number {\n const { totalCount } = global.chats;\n const allChatsCount = totalCount.all;\n const archivedChatsCount = totalCount.archived || 0;\n\n if (listType === 'archived') {\n return archivedChatsCount;\n }\n\n return allChatsCount ? allChatsCount - archivedChatsCount : 0;\n}\n\nexport function selectIsChatPinned(global: GlobalState, chatId: string, folderId = ALL_FOLDER_ID): boolean {\n const { active, archived } = global.chats.orderedPinnedIds;\n\n if (folderId === ALL_FOLDER_ID) {\n return Boolean(active?.includes(chatId));\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return Boolean(archived?.includes(chatId));\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return Boolean(pinnedChatIds?.includes(chatId));\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectChatByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.chats.byId).find(\n (chat) => chat.username && chat.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsServiceChatReady(global: GlobalState) {\n return Boolean(selectChat(global, SERVICE_NOTIFICATIONS_USER_ID));\n}\n\nexport function selectSendAs(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n if (!chat) return undefined;\n\n const id = chat?.fullInfo?.sendAsId;\n if (!id) return undefined;\n\n return selectUser(global, id) || selectChat(global, id);\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiSticker } from '../../api/types';\n\nexport function selectIsStickerFavorite(global: GlobalState, sticker: ApiSticker) {\n const { stickers } = global.stickers.favorite;\n return stickers && stickers.some(({ id }) => id === sticker.id);\n}\n\nexport function selectCurrentStickerSearch(global: GlobalState) {\n return global.stickers.search;\n}\n\nexport function selectCurrentGifSearch(global: GlobalState) {\n return global.gifs.search;\n}\n\nexport function selectStickerSet(global: GlobalState, id: string) {\n return global.stickers.setsById[id];\n}\n\nexport function selectStickerSetByShortName(global: GlobalState, shortName: string) {\n return Object.values(global.stickers.setsById).find((l) => l.shortName.toLowerCase() === shortName.toLowerCase());\n}\n\nexport function selectStickersForEmoji(global: GlobalState, emoji: string) {\n const stickerSets = Object.values(global.stickers.setsById);\n let stickersForEmoji: ApiSticker[] = [];\n // Favorites\n global.stickers.favorite.stickers.forEach((sticker) => {\n if (sticker.emoji === emoji) stickersForEmoji.push(sticker);\n });\n\n // Added sets\n stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n\n stickersForEmoji = stickersForEmoji.concat(packs[emoji] || [], packs[cleanEmoji(emoji)] || []);\n });\n return stickersForEmoji;\n}\n\nfunction cleanEmoji(emoji: string) {\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n return emoji.replace('\\ufe0f', '');\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiEffect(global: GlobalState, emoji: string) {\n const { animatedEmojiEffects } = global;\n if (!animatedEmojiEffects || !animatedEmojiEffects.stickers) {\n return undefined;\n }\n\n const cleanedEmoji = cleanEmoji(emoji);\n\n return animatedEmojiEffects.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\n}\n\nexport function selectAnimatedEmojiSound(global: GlobalState, emoji: string) {\n return global?.appConfig?.emojiSounds[cleanEmoji(emoji)];\n}\n\nexport function selectLocalAnimatedEmoji(global: GlobalState, emoji: string) {\n const cleanedEmoji = cleanEmoji(emoji);\n\n return cleanedEmoji === '🍑' ? 'Peach' : (cleanedEmoji === '🍆' ? 'Eggplant' : undefined);\n}\n\nexport function selectLocalAnimatedEmojiEffect(emoji: string) {\n return emoji === 'Eggplant' ? 'Cumshot' : undefined;\n}\n\nexport function selectLocalAnimatedEmojiEffectByName(name: string) {\n return name === 'Cumshot' ? '🍆' : undefined;\n}\n","import { GlobalState, MessageListType, Thread } from '../../global/types';\nimport {\n ApiChat,\n ApiMessage,\n ApiMessageOutgoingStatus,\n ApiUser,\n MAIN_THREAD_ID,\n} from '../../api/types';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID } from '../../config';\nimport {\n selectChat, selectIsChatWithBot, selectIsChatWithSelf,\n} from './chats';\nimport { selectIsUserOrChatContact, selectUser } from './users';\nimport {\n getSendingState,\n isChatChannel,\n isMessageLocal,\n isUserId,\n isForwardedMessage,\n getCanPostInChat,\n isUserRightBanned,\n getHasAdminRight,\n isChatBasicGroup,\n isCommonBoxChat,\n isServiceNotificationMessage,\n isOwnMessage,\n isActionMessage,\n isChatGroup,\n isChatSuperGroup,\n getMessageVideo,\n getMessageWebPageVideo,\n getMessagePhoto,\n getMessageAudio,\n getMessageVoice,\n getMessageDocument,\n getMessageWebPagePhoto,\n} from '../helpers';\nimport { findLast } from '../../util/iteratees';\nimport { selectIsStickerFavorite } from './symbols';\nimport { getServerTime } from '../../util/serverTime';\nimport { MEMO_EMPTY_ARRAY } from '../../util/memo';\n\nconst MESSAGE_EDIT_ALLOWED_TIME = 172800; // 48 hours\n\nexport function selectCurrentMessageList(global: GlobalState) {\n const { messageLists } = global.messages;\n\n if (messageLists.length) {\n return messageLists[messageLists.length - 1];\n }\n\n return undefined;\n}\n\nexport function selectCurrentChat(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n\n return chatId ? selectChat(global, chatId) : undefined;\n}\n\nexport function selectChatMessages(global: GlobalState, chatId: string) {\n return global.messages.byChatId[chatId]?.byId;\n}\n\nexport function selectScheduledMessages(global: GlobalState, chatId: string) {\n return global.scheduledMessages.byChatId[chatId]?.byId;\n}\n\nexport function selectThreadParam<K extends keyof Thread>(\n global: GlobalState,\n chatId: string,\n threadId: number,\n key: K,\n) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const thread = messageInfo.threadsById[threadId];\n if (!thread) {\n return undefined;\n }\n\n return thread[key];\n}\n\nexport function selectListedIds(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'listedIds');\n}\n\nexport function selectOutlyingIds(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'outlyingIds');\n}\n\nexport function selectCurrentMessageIds(\n global: GlobalState, chatId: string, threadId: number, messageListType: MessageListType,\n) {\n switch (messageListType) {\n case 'thread':\n return selectViewportIds(global, chatId, threadId);\n case 'pinned':\n return selectPinnedIds(global, chatId);\n case 'scheduled':\n return selectScheduledIds(global, chatId);\n }\n\n return undefined;\n}\n\nexport function selectViewportIds(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'viewportIds');\n}\n\nexport function selectPinnedIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'pinnedIds');\n}\n\nexport function selectScheduledIds(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'scheduledIds');\n}\n\nexport function selectScrollOffset(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'scrollOffset');\n}\n\nexport function selectReplyingToId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyingToId');\n}\n\nexport function selectEditingId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'editingId');\n}\n\nexport function selectEditingScheduledId(global: GlobalState, chatId: string) {\n return selectThreadParam(global, chatId, MAIN_THREAD_ID, 'editingScheduledId');\n}\n\nexport function selectDraft(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'draft');\n}\n\nexport function selectNoWebPage(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'noWebPage');\n}\n\nexport function selectThreadInfo(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'threadInfo');\n}\n\nexport function selectFirstMessageId(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'firstMessageId');\n}\n\nexport function selectReplyStack(global: GlobalState, chatId: string, threadId: number) {\n return selectThreadParam(global, chatId, threadId, 'replyStack');\n}\n\nexport function selectThreadOriginChat(global: GlobalState, chatId: string, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return selectChat(global, chatId);\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return selectChat(global, threadInfo.originChannelId || chatId);\n}\n\nexport function selectThreadTopMessageId(global: GlobalState, chatId: string, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n return undefined;\n }\n\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n return threadInfo.topMessageId;\n}\n\nexport function selectThreadByMessage(global: GlobalState, chatId: string, message: ApiMessage) {\n const messageInfo = global.messages.byChatId[chatId];\n if (!messageInfo) {\n return undefined;\n }\n\n const { replyToMessageId, replyToTopMessageId } = message;\n if (!replyToMessageId && !replyToTopMessageId) {\n return undefined;\n }\n\n return Object.values<Thread>(messageInfo.threadsById).find((thread) => {\n return thread.threadInfo && (\n (replyToMessageId && replyToMessageId === thread.threadInfo.topMessageId)\n || (replyToTopMessageId && replyToTopMessageId === thread.threadInfo.topMessageId)\n );\n });\n}\n\nexport function isMessageInCurrentMessageList(global: GlobalState, chatId: string, message: ApiMessage) {\n const currentMessageList = selectCurrentMessageList(global);\n if (!currentMessageList) {\n return false;\n }\n\n const { threadInfo } = selectThreadByMessage(global, chatId, message) || {};\n return (\n chatId === currentMessageList.chatId\n && (\n (currentMessageList.threadId === MAIN_THREAD_ID)\n || (threadInfo && currentMessageList.threadId === threadInfo.threadId)\n )\n );\n}\n\nexport function selectIsViewportNewest(global: GlobalState, chatId: string, threadId: number) {\n const viewportIds = selectViewportIds(global, chatId, threadId);\n if (!viewportIds || !viewportIds.length) {\n return true;\n }\n\n let lastMessageId: number;\n\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat || !chat.lastMessage) {\n return true;\n }\n\n lastMessageId = chat.lastMessage.id;\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo || !threadInfo.lastMessageId) {\n return undefined;\n }\n\n lastMessageId = threadInfo.lastMessageId;\n }\n\n // Edge case: outgoing `lastMessage` is updated with a delay to optimize animation\n if (lastMessageId >= LOCAL_MESSAGE_ID_BASE && !selectChatMessage(global, chatId, lastMessageId)) {\n return true;\n }\n\n return viewportIds[viewportIds.length - 1] >= lastMessageId;\n}\n\nexport function selectChatMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectChatMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectScheduledMessage(global: GlobalState, chatId: string, messageId: number) {\n const chatMessages = selectScheduledMessages(global, chatId);\n\n return chatMessages ? chatMessages[messageId] : undefined;\n}\n\nexport function selectEditingMessage(\n global: GlobalState, chatId: string, threadId: number, messageListType: MessageListType,\n) {\n if (messageListType === 'scheduled') {\n const messageId = selectEditingScheduledId(global, chatId);\n return messageId ? selectScheduledMessage(global, chatId, messageId) : undefined;\n } else {\n const messageId = selectEditingId(global, chatId, threadId);\n return messageId ? selectChatMessage(global, chatId, messageId) : undefined;\n }\n}\n\nexport function selectChatMessageByPollId(global: GlobalState, pollId: string) {\n let messageWithPoll: ApiMessage | undefined;\n\n // eslint-disable-next-line no-restricted-syntax\n for (const chatMessages of Object.values(global.messages.byChatId)) {\n const { byId } = chatMessages;\n messageWithPoll = Object.values(byId).find((message) => {\n return message.content.poll && message.content.poll.id === pollId;\n });\n if (messageWithPoll) {\n break;\n }\n }\n\n return messageWithPoll;\n}\n\nexport function selectFocusedMessageId(global: GlobalState, chatId: string) {\n const { chatId: focusedChatId, messageId } = global.focusedMessage || {};\n\n return focusedChatId === chatId ? messageId : undefined;\n}\n\nexport function selectIsMessageFocused(global: GlobalState, message: ApiMessage) {\n const focusedId = selectFocusedMessageId(global, message.chatId);\n\n return focusedId ? focusedId === message.id || focusedId === message.previousLocalId : false;\n}\n\nexport function selectIsMessageUnread(global: GlobalState, message: ApiMessage) {\n const { lastReadOutboxMessageId } = selectChat(global, message.chatId) || {};\n return isMessageLocal(message) || !lastReadOutboxMessageId || lastReadOutboxMessageId < message.id;\n}\n\nexport function selectOutgoingStatus(\n global: GlobalState, message: ApiMessage, isScheduledList = false,\n): ApiMessageOutgoingStatus {\n if (!selectIsMessageUnread(global, message) && !isScheduledList) {\n return 'read';\n }\n\n return getSendingState(message);\n}\n\nexport function selectSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { senderId } = message;\n if (!senderId) {\n return undefined;\n }\n\n return isUserId(senderId) ? selectUser(global, senderId) : selectChat(global, senderId);\n}\n\nexport function selectForwardedSender(global: GlobalState, message: ApiMessage): ApiUser | ApiChat | undefined {\n const { forwardInfo } = message;\n if (!forwardInfo) {\n return undefined;\n }\n\n if (forwardInfo.isChannelPost && forwardInfo.fromChatId) {\n return selectChat(global, forwardInfo.fromChatId);\n } else if (forwardInfo.senderUserId) {\n return selectUser(global, forwardInfo.senderUserId) || selectChat(global, forwardInfo.senderUserId);\n }\n\n return undefined;\n}\n\nexport function selectAllowedMessageActions(global: GlobalState, message: ApiMessage, threadId: number) {\n const chat = selectChat(global, message.chatId);\n if (!chat || chat.isRestricted) {\n return {};\n }\n\n const isPrivate = isUserId(chat.id);\n const isChatWithSelf = selectIsChatWithSelf(global, message.chatId);\n const isBasicGroup = isChatBasicGroup(chat);\n const isSuperGroup = isChatSuperGroup(chat);\n const isChannel = isChatChannel(chat);\n const isLocal = isMessageLocal(message);\n const isServiceNotification = isServiceNotificationMessage(message);\n const isOwn = isOwnMessage(message);\n const isAction = isActionMessage(message);\n const { content } = message;\n\n const canEditMessagesIndefinitely = isChatWithSelf\n || (isSuperGroup && getHasAdminRight(chat, 'pinMessages'))\n || (isChannel && getHasAdminRight(chat, 'editMessages'));\n const isMessageEditable = (\n (\n canEditMessagesIndefinitely\n || getServerTime(global.serverTimeOffset) - message.date < MESSAGE_EDIT_ALLOWED_TIME\n ) && !(\n content.sticker || content.contact || content.poll || content.action || content.audio\n || (content.video?.isRound)\n )\n && !isForwardedMessage(message)\n && !message.viaBotId\n );\n\n const canReply = !isLocal && !isServiceNotification && getCanPostInChat(chat, threadId);\n\n const hasPinPermission = isPrivate || (\n chat.isCreator\n || (!isChannel && !isUserRightBanned(chat, 'pinMessages'))\n || getHasAdminRight(chat, 'pinMessages')\n );\n\n let canPin = !isLocal && !isServiceNotification && !isAction && hasPinPermission;\n let canUnpin = false;\n\n const pinnedMessageIds = selectPinnedIds(global, chat.id);\n\n if (canPin) {\n canUnpin = Boolean(pinnedMessageIds && pinnedMessageIds.includes(message.id));\n canPin = !canUnpin;\n }\n\n const canDelete = !isLocal && !isServiceNotification && (\n isPrivate\n || isOwn\n || isBasicGroup\n || chat.isCreator\n || getHasAdminRight(chat, 'deleteMessages')\n );\n\n const canReport = !isPrivate && !isOwn;\n\n const canDeleteForAll = canDelete && (\n (isPrivate && !isChatWithSelf)\n || (isBasicGroup && (\n isOwn || getHasAdminRight(chat, 'deleteMessages') || chat.isCreator\n ))\n );\n\n const canEdit = !isLocal && !isAction && isMessageEditable && (\n isOwn\n || (isChannel && (chat.isCreator || getHasAdminRight(chat, 'editMessages')))\n );\n\n const canForward = !isLocal && !isAction;\n\n const hasSticker = Boolean(message.content.sticker);\n const hasFavoriteSticker = hasSticker && selectIsStickerFavorite(global, message.content.sticker!);\n const canFaveSticker = !isAction && hasSticker && !hasFavoriteSticker;\n const canUnfaveSticker = !isAction && hasFavoriteSticker;\n const canCopy = !isAction;\n const canCopyLink = !isAction && (isChannel || isSuperGroup);\n const canSelect = !isAction;\n\n const canDownload = Boolean(content.webPage?.document || content.webPage?.video || content.webPage?.photo\n || content.audio || content.voice || content.photo || content.video || content.document || content.sticker);\n\n const noOptions = [\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n ].every((ability) => !ability);\n\n return {\n noOptions,\n canReply,\n canEdit,\n canPin,\n canUnpin,\n canReport,\n canDelete,\n canDeleteForAll,\n canForward,\n canFaveSticker,\n canUnfaveSticker,\n canCopy,\n canCopyLink,\n canSelect,\n canDownload,\n };\n}\n\n// This selector always returns a new object which can not be safely used in shallow-equal checks\nexport function selectCanDeleteSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return {};\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return {\n canDelete: messageActions.every((actions) => actions.canDelete),\n canDeleteForAll: messageActions.every((actions) => actions.canDeleteForAll),\n };\n}\n\nexport function selectCanReportSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.every((actions) => actions.canReport);\n}\n\nexport function selectCanDownloadSelectedMessages(global: GlobalState) {\n const { messageIds: selectedMessageIds } = global.selectedMessages || {};\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n const chatMessages = chatId && selectChatMessages(global, chatId);\n if (!chatMessages || !selectedMessageIds || !threadId) {\n return false;\n }\n\n const messageActions = selectedMessageIds\n .map((id) => chatMessages[id] && selectAllowedMessageActions(global, chatMessages[id], threadId))\n .filter(Boolean);\n\n return messageActions.some((actions) => actions.canDownload);\n}\n\nexport function selectIsDownloading(global: GlobalState, message: ApiMessage) {\n const activeInChat = global.activeDownloads.byChatId[message.chatId];\n return activeInChat ? activeInChat.includes(message.id) : false;\n}\n\nexport function selectActiveDownloadIds(global: GlobalState, chatId: string) {\n return global.activeDownloads.byChatId[chatId] || MEMO_EMPTY_ARRAY;\n}\n\nexport function selectUploadProgress(global: GlobalState, message: ApiMessage) {\n return global.fileUploads.byMessageLocalId[message.previousLocalId || message.id]?.progress;\n}\n\nexport function selectRealLastReadId(global: GlobalState, chatId: string, threadId: number) {\n if (threadId === MAIN_THREAD_ID) {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n // `lastReadInboxMessageId` is empty for new chats\n if (!chat.lastReadInboxMessageId) {\n return undefined;\n }\n\n if (!chat.lastMessage) {\n return chat.lastReadInboxMessageId;\n }\n\n if (isMessageLocal(chat.lastMessage)) {\n return chat.lastMessage.id;\n }\n\n // Some previously read messages may be deleted\n return Math.min(chat.lastMessage.id, chat.lastReadInboxMessageId);\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo) {\n return undefined;\n }\n\n if (!threadInfo.lastReadInboxMessageId) {\n return threadInfo.topMessageId;\n }\n\n // Some previously read messages may be deleted\n return Math.min(threadInfo.lastReadInboxMessageId, threadInfo.lastMessageId || Infinity);\n }\n}\n\nexport function selectFirstUnreadId(global: GlobalState, chatId: string, threadId: number) {\n const chat = selectChat(global, chatId);\n\n if (threadId === MAIN_THREAD_ID) {\n if (!chat) {\n return undefined;\n }\n } else {\n const threadInfo = selectThreadInfo(global, chatId, threadId);\n if (!threadInfo\n || (threadInfo.lastMessageId !== undefined && threadInfo.lastMessageId === threadInfo.lastReadInboxMessageId)) {\n return undefined;\n }\n }\n\n const outlyingIds = selectOutlyingIds(global, chatId, threadId);\n const listedIds = selectListedIds(global, chatId, threadId);\n const byId = selectChatMessages(global, chatId);\n if (!byId || !(outlyingIds || listedIds)) {\n return undefined;\n }\n\n const lastReadId = selectRealLastReadId(global, chatId, threadId);\n if (!lastReadId && chat && chat.isNotJoined) {\n return undefined;\n }\n\n const lastReadServiceNotificationId = chatId === SERVICE_NOTIFICATIONS_USER_ID\n ? global.serviceNotifications.reduce((max, notification) => {\n return !notification.isUnread && notification.id > max ? notification.id : max;\n }, -1)\n : -1;\n\n function findAfterLastReadId(listIds: number[]) {\n return listIds.find((id) => {\n return (\n (!lastReadId || id > lastReadId)\n && byId[id]\n && (!byId[id].isOutgoing || byId[id].isFromScheduled)\n && id > lastReadServiceNotificationId\n );\n });\n }\n\n if (outlyingIds) {\n const found = findAfterLastReadId(outlyingIds);\n if (found) {\n return found;\n }\n }\n\n if (listedIds) {\n const found = findAfterLastReadId(listedIds);\n if (found) {\n return found;\n }\n }\n\n return undefined;\n}\n\nexport function selectIsPollResultsOpen(global: GlobalState) {\n const { pollResults } = global;\n return Boolean(pollResults.messageId);\n}\n\nexport function selectIsForwardModalOpen(global: GlobalState) {\n const { forwardMessages } = global;\n return Boolean(forwardMessages.isModalShown);\n}\n\nexport function selectCommonBoxChatId(global: GlobalState, messageId: number) {\n const fromLastMessage = Object.values(global.chats.byId).find((chat) => (\n isCommonBoxChat(chat) && chat.lastMessage && chat.lastMessage.id === messageId\n ));\n if (fromLastMessage) {\n return fromLastMessage.id;\n }\n\n const { byChatId } = global.messages;\n return Object.keys(byChatId).find((chatId) => {\n const chat = selectChat(global, chatId);\n return chat && isCommonBoxChat(chat) && byChatId[chat.id].byId[messageId];\n });\n}\n\nexport function selectIsInSelectMode(global: GlobalState) {\n const { selectedMessages } = global;\n\n return Boolean(selectedMessages);\n}\n\nexport function selectIsMessageSelected(global: GlobalState, messageId: number) {\n const { messageIds } = global.selectedMessages || {};\n if (!messageIds) {\n return false;\n }\n\n return messageIds.includes(messageId);\n}\n\nexport function selectForwardedMessageIdsByGroupId(global: GlobalState, chatId: string, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.values(chatMessages)\n .filter((message) => message.groupedId === groupedId && message.forwardInfo)\n .map(({ forwardInfo }) => forwardInfo!.fromMessageId);\n}\n\nexport function selectMessageIdsByGroupId(global: GlobalState, chatId: string, groupedId: string) {\n const chatMessages = selectChatMessages(global, chatId);\n if (!chatMessages) {\n return undefined;\n }\n\n return Object.keys(chatMessages)\n .map(Number)\n .filter((id) => chatMessages[id].groupedId === groupedId);\n}\n\nexport function selectIsDocumentGroupSelected(global: GlobalState, chatId: string, groupedId: string) {\n const { messageIds: selectedIds } = global.selectedMessages || {};\n if (!selectedIds) {\n return false;\n }\n\n const groupIds = selectMessageIdsByGroupId(global, chatId, groupedId);\n return groupIds && groupIds.every((id) => selectedIds.includes(id));\n}\n\nexport function selectSelectedMessagesCount(global: GlobalState) {\n const { messageIds } = global.selectedMessages || {};\n\n return messageIds ? messageIds.length : 0;\n}\n\nexport function selectNewestMessageWithBotKeyboardButtons(\n global: GlobalState, chatId: string,\n): ApiMessage | undefined {\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (!selectIsChatWithBot(global, chat)) {\n return undefined;\n }\n\n const chatMessages = selectChatMessages(global, chatId);\n const viewportIds = selectViewportIds(global, chatId, MAIN_THREAD_ID);\n if (!chatMessages || !viewportIds) {\n return undefined;\n }\n\n const messageId = findLast(viewportIds, (id) => {\n return !chatMessages[id].isOutgoing && Boolean(chatMessages[id].keyboardButtons);\n });\n\n const replyHideMessageId = findLast(viewportIds, (id) => {\n return Boolean(chatMessages[id].shouldHideKeyboardButtons);\n });\n\n if (messageId && replyHideMessageId && replyHideMessageId > messageId) {\n return undefined;\n }\n\n return messageId ? chatMessages[messageId] : undefined;\n}\n\nexport function selectCanAutoLoadMedia(global: GlobalState, message: ApiMessage) {\n const chat = selectChat(global, message.chatId);\n if (!chat) {\n return undefined;\n }\n\n const sender = selectSender(global, message);\n\n const isPhoto = Boolean(getMessagePhoto(message) || getMessageWebPagePhoto(message));\n const isVideo = Boolean(getMessageVideo(message) || getMessageWebPageVideo(message));\n const isFile = Boolean(getMessageAudio(message) || getMessageVoice(message) || getMessageDocument(message));\n\n const {\n canAutoLoadPhotoFromContacts,\n canAutoLoadPhotoInPrivateChats,\n canAutoLoadPhotoInGroups,\n canAutoLoadPhotoInChannels,\n canAutoLoadVideoFromContacts,\n canAutoLoadVideoInPrivateChats,\n canAutoLoadVideoInGroups,\n canAutoLoadVideoInChannels,\n canAutoLoadFileFromContacts,\n canAutoLoadFileInPrivateChats,\n canAutoLoadFileInGroups,\n canAutoLoadFileInChannels,\n } = global.settings.byKey;\n\n if (isPhoto) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadPhotoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadPhotoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadPhotoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadPhotoInChannels,\n });\n }\n\n if (isVideo) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadVideoFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadVideoInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadVideoInGroups,\n canAutoLoadMediaInChannels: canAutoLoadVideoInChannels,\n });\n }\n\n if (isFile) {\n return canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts: canAutoLoadFileFromContacts,\n canAutoLoadMediaInPrivateChats: canAutoLoadFileInPrivateChats,\n canAutoLoadMediaInGroups: canAutoLoadFileInGroups,\n canAutoLoadMediaInChannels: canAutoLoadFileInChannels,\n });\n }\n\n return true;\n}\n\nfunction canAutoLoadMedia({\n global,\n chat,\n sender,\n canAutoLoadMediaFromContacts,\n canAutoLoadMediaInPrivateChats,\n canAutoLoadMediaInGroups,\n canAutoLoadMediaInChannels,\n}: {\n global: GlobalState;\n chat: ApiChat;\n canAutoLoadMediaFromContacts: boolean;\n canAutoLoadMediaInPrivateChats: boolean;\n canAutoLoadMediaInGroups: boolean;\n canAutoLoadMediaInChannels: boolean;\n sender?: ApiChat | ApiUser;\n}) {\n const isMediaFromContact = Boolean(sender && (\n sender.id === global.currentUserId || selectIsUserOrChatContact(global, sender)\n ));\n\n return Boolean(\n (isMediaFromContact && canAutoLoadMediaFromContacts)\n || (!isMediaFromContact && canAutoLoadMediaInPrivateChats && isUserId(chat.id))\n || (canAutoLoadMediaInGroups && isChatGroup(chat))\n || (canAutoLoadMediaInChannels && isChatChannel(chat)),\n );\n}\n\nexport function selectCanAutoPlayMedia(global: GlobalState, message: ApiMessage) {\n const video = getMessageVideo(message) || getMessageWebPageVideo(message);\n if (!video) {\n return undefined;\n }\n\n const {\n canAutoPlayVideos,\n canAutoPlayGifs,\n } = global.settings.byKey;\n\n const asGif = video.isGif || video.isRound;\n\n return (canAutoPlayVideos && !asGif) || (canAutoPlayGifs && asGif);\n}\n\nexport function selectShouldLoopStickers(global: GlobalState) {\n return global.settings.byKey.shouldLoopStickers;\n}\n\nexport function selectLastServiceNotification(global: GlobalState) {\n const { serviceNotifications } = global;\n const maxId = Math.max(...serviceNotifications.map(({ id }) => id));\n\n return serviceNotifications.find(({ id }) => id === maxId);\n}\n\nexport function selectIsMessageProtected(global: GlobalState, message?: ApiMessage) {\n return message ? message.isProtected || selectChat(global, message.chatId)?.isProtected : false;\n}\n\nexport function selectHasProtectedMessage(global: GlobalState, chatId: string, messageIds?: number[]) {\n if (selectChat(global, chatId)?.isProtected) {\n return true;\n }\n\n if (!messageIds) {\n return false;\n }\n\n const messages = selectChatMessages(global, chatId);\n\n return messageIds.some((messageId) => messages[messageId]?.isProtected);\n}\n\nexport function selectSponsoredMessage(global: GlobalState, chatId: string) {\n const chat = selectChat(global, chatId);\n const message = chat && isChatChannel(chat) ? global.messages.sponsoredByChatId[chatId] : undefined;\n\n return message && message.expiresAt >= Math.round(Date.now() / 1000) ? message : undefined;\n}\n\nexport function selectDefaultReaction(global: GlobalState, chatId: string) {\n if (chatId === SERVICE_NOTIFICATIONS_USER_ID) return undefined;\n\n const isPrivate = isUserId(chatId);\n const defaultReaction = global.appConfig?.defaultReaction;\n const { availableReactions } = global;\n if (!defaultReaction || !availableReactions?.some(\n (l) => l.reaction === defaultReaction && !l.isInactive,\n )) {\n return undefined;\n }\n\n if (isPrivate) {\n return defaultReaction;\n }\n\n const enabledReactions = selectChat(global, chatId)?.fullInfo?.enabledReactions;\n if (!enabledReactions?.includes(defaultReaction)) {\n return undefined;\n }\n\n return defaultReaction;\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectVisibleUsers(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const messageIds = selectThreadParam(global, chatId, threadId, 'viewportIds');\n if (!messageIds) {\n return undefined;\n }\n\n return messageIds.map((messageId) => {\n const { senderId } = selectChatMessage(global, chatId, messageId) || {};\n return senderId ? selectUser(global, senderId) : undefined;\n }).filter(Boolean);\n}\n","import { GlobalState } from '../../global/types';\nimport { selectCurrentMessageList } from './messages';\nimport { buildChatThreadKey } from '../helpers';\n\nexport function selectCurrentTextSearch(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const chatThreadKey = buildChatThreadKey(chatId, threadId);\n const currentSearch = global.localTextSearch.byChatThreadKey[chatThreadKey];\n if (!currentSearch || !currentSearch.isActive) {\n return undefined;\n }\n\n return currentSearch;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const { chatId } = selectCurrentMessageList(global) || {};\n if (!chatId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[chatId];\n}\n","import { GlobalState } from '../../global/types';\n\nimport { selectCurrentMessageList } from './messages';\nimport { selectChat } from './chats';\nimport { isChatGroup, isUserId } from '../helpers';\n\nexport function selectManagement(global: GlobalState, chatId: string) {\n return global.management.byChatId[chatId];\n}\n\nexport function selectCurrentManagement(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n const currentManagement = global.management.byChatId[chatId];\n if (!currentManagement || !currentManagement.isActive) {\n return undefined;\n }\n\n return currentManagement;\n}\n\nexport function selectCurrentManagementType(global: GlobalState) {\n const { chatId, threadId } = selectCurrentMessageList(global) || {};\n if (!chatId || !threadId) {\n return undefined;\n }\n\n if (isUserId(chatId)) {\n return 'user';\n }\n\n const chat = selectChat(global, chatId);\n if (!chat) {\n return undefined;\n }\n\n if (isChatGroup(chat)) {\n return 'group';\n }\n\n return 'channel';\n}\n","import { GlobalState } from '../../global/types';\nimport { NewChatMembersProgress, RightColumnContent } from '../../types';\n\nimport { getSystemTheme, IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment';\nimport { selectCurrentMessageList, selectIsPollResultsOpen } from './messages';\nimport { selectCurrentTextSearch } from './localSearch';\nimport { selectCurrentGifSearch, selectCurrentStickerSearch } from './symbols';\nimport { selectCurrentManagement } from './management';\n\nexport function selectIsMediaViewerOpen(global: GlobalState) {\n const { mediaViewer } = global;\n return Boolean(mediaViewer.messageId || mediaViewer.avatarOwnerId);\n}\n\nexport function selectRightColumnContentKey(global: GlobalState) {\n return selectIsPollResultsOpen(global) ? (\n RightColumnContent.PollResults\n ) : !IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global) ? (\n RightColumnContent.Search\n ) : selectCurrentManagement(global) ? (\n RightColumnContent.Management\n ) : selectCurrentStickerSearch(global).query !== undefined ? (\n RightColumnContent.StickerSearch\n ) : selectCurrentGifSearch(global).query !== undefined ? (\n RightColumnContent.GifSearch\n ) : global.newChatMembersProgress !== NewChatMembersProgress.Closed ? (\n RightColumnContent.AddingMembers\n ) : global.isChatInfoShown && selectCurrentMessageList(global) ? (\n RightColumnContent.ChatInfo\n ) : undefined;\n}\n\nexport function selectIsRightColumnShown(global: GlobalState) {\n return selectRightColumnContentKey(global) !== undefined;\n}\n\nexport function selectTheme(global: GlobalState) {\n const { theme, shouldUseSystemTheme } = global.settings.byKey;\n\n return shouldUseSystemTheme ? getSystemTheme() : theme;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectCurrentGlobalSearchQuery(global: GlobalState) {\n return global.globalSearch.query;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectPaymentChatId(global: GlobalState) {\n return global.payment.chatId;\n}\n\nexport function selectPaymentMessageId(global: GlobalState) {\n return global.payment.messageId;\n}\n\nexport function selectPaymentFormId(global: GlobalState) {\n return global.payment.formId;\n}\n\nexport function selectPaymentRequestId(global: GlobalState) {\n return global.payment.requestId;\n}\n\nexport function selectProviderPublishableKey(global: GlobalState) {\n return global.payment.nativeParams ? global.payment.nativeParams.publishableKey : undefined;\n}\n\nexport function selectStripeCredentials(global: GlobalState) {\n return global.payment.stripeCredentials;\n}\n","import { GlobalState } from '../../global/types';\n\nexport function selectNotifySettings(global: GlobalState) {\n return global.settings.byKey;\n}\n\nexport function selectNotifyExceptions(global: GlobalState) {\n return global.settings.notifyExceptions;\n}\n","import { GlobalState } from '../../global/types';\nimport { ApiChat, ApiUser, ApiUserStatus } from '../../api/types';\n\nexport function selectUser(global: GlobalState, userId: string): ApiUser | undefined {\n return global.users.byId[userId];\n}\n\nexport function selectUserStatus(global: GlobalState, userId: string): ApiUserStatus | undefined {\n return global.users.statusesById[userId];\n}\n\nexport function selectIsUserBlocked(global: GlobalState, userId: string) {\n const user = selectUser(global, userId);\n\n return user?.fullInfo?.isBlocked;\n}\n\n// Slow, not to be used in `withGlobal`\nexport function selectUserByUsername(global: GlobalState, username: string) {\n const usernameLowered = username.toLowerCase();\n return Object.values(global.users.byId).find(\n (user) => user.username.toLowerCase() === usernameLowered,\n );\n}\n\nexport function selectIsUserOrChatContact(global: GlobalState, userOrChat: ApiUser | ApiChat) {\n return global.contactList && global.contactList.userIds.includes(userOrChat.id);\n}\n","import {\n ApiBotInlineMediaResult, ApiBotInlineResult, ApiBotInlineSwitchPm,\n ApiChatInviteImporter,\n ApiExportedInvite,\n ApiLanguage, ApiMessage, ApiShippingAddress, ApiStickerSet,\n} from '../api/types';\n\nexport enum LoadMoreDirection {\n Backwards,\n Forwards,\n Around,\n}\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n}\n\nexport interface IAlbum {\n albumId: string;\n messages: ApiMessage[];\n mainMessage: ApiMessage;\n}\n\nexport type ThemeKey = 'light' | 'dark';\n\nexport interface IThemeSettings {\n background?: string;\n backgroundColor?: string;\n patternColor?: string;\n isBlurred?: boolean;\n}\n\nexport type NotifySettings = {\n hasPrivateChatsNotifications?: boolean;\n hasPrivateChatsMessagePreview?: boolean;\n hasGroupNotifications?: boolean;\n hasGroupMessagePreview?: boolean;\n hasBroadcastNotifications?: boolean;\n hasBroadcastMessagePreview?: boolean;\n hasContactJoinedNotifications?: boolean;\n hasWebNotifications: boolean;\n hasPushNotifications: boolean;\n notificationSoundVolume: number;\n};\n\nexport type LangCode = (\n 'en' | 'ar' | 'be' | 'ca' | 'nl' | 'fr' | 'de' | 'id' | 'it' | 'ko' | 'ms' | 'fa' | 'pl' | 'pt-br' | 'ru' | 'es'\n | 'tr' | 'uk' | 'uz'\n);\n\nexport type TimeFormat = '24h' | '12h';\n\nexport interface ISettings extends NotifySettings, Record<string, any> {\n theme: ThemeKey;\n shouldUseSystemTheme: boolean;\n messageTextSize: number;\n animationLevel: 0 | 1 | 2;\n messageSendKeyCombo: 'enter' | 'ctrl-enter';\n canAutoLoadPhotoFromContacts: boolean;\n canAutoLoadPhotoInPrivateChats: boolean;\n canAutoLoadPhotoInGroups: boolean;\n canAutoLoadPhotoInChannels: boolean;\n canAutoLoadVideoFromContacts: boolean;\n canAutoLoadVideoInPrivateChats: boolean;\n canAutoLoadVideoInGroups: boolean;\n canAutoLoadVideoInChannels: boolean;\n canAutoLoadFileFromContacts: boolean;\n canAutoLoadFileInPrivateChats: boolean;\n canAutoLoadFileInGroups: boolean;\n canAutoLoadFileInChannels: boolean;\n autoLoadFileMaxSizeMb: number;\n canAutoPlayGifs: boolean;\n canAutoPlayVideos: boolean;\n shouldSuggestStickers: boolean;\n shouldLoopStickers: boolean;\n hasPassword?: boolean;\n languages?: ApiLanguage[];\n language: LangCode;\n isSensitiveEnabled?: boolean;\n canChangeSensitive?: boolean;\n timeFormat: TimeFormat;\n wasTimeFormatSetManually: boolean;\n isConnectionStatusMinimized: boolean;\n}\n\nexport interface ApiPrivacySettings {\n visibility: PrivacyVisibility;\n allowUserIds: string[];\n allowChatIds: string[];\n blockUserIds: string[];\n blockChatIds: string[];\n}\n\nexport interface InputPrivacyContact {\n id: string;\n accessHash?: string;\n}\n\nexport interface InputPrivacyRules {\n visibility: PrivacyVisibility;\n allowedUsers?: InputPrivacyContact[];\n allowedChats?: InputPrivacyContact[];\n blockedUsers?: InputPrivacyContact[];\n blockedChats?: InputPrivacyContact[];\n}\n\nexport type IAnchorPosition = {\n x: number;\n y: number;\n};\n\nexport interface ShippingOption {\n id: string;\n title: string;\n amount: number;\n prices: Price[];\n}\n\nexport interface Price {\n label: string;\n amount: number;\n}\n\nexport interface Invoice {\n currency?: string;\n emailRequested?: boolean;\n emailToProvider?: boolean;\n flexible?: boolean;\n nameRequested?: boolean;\n phoneRequested?: boolean;\n phoneToProvider?: boolean;\n prices?: Price[];\n shippingAddressRequested?: boolean;\n test?: boolean;\n}\n\nexport interface Receipt {\n currency: string;\n prices: Price[];\n info?: {\n shippingAddress?: ApiShippingAddress;\n phone?: string;\n name?: string;\n };\n totalAmount: number;\n credentialsTitle: string;\n shippingPrices?: Price[];\n shippingMethod?: string;\n photoUrl?: string;\n text?: string;\n title?: string;\n}\n\nexport enum SettingsScreens {\n Main,\n EditProfile,\n Notifications,\n DataStorage,\n Language,\n General,\n GeneralChatBackground,\n GeneralChatBackgroundColor,\n Privacy,\n PrivacyPhoneNumber,\n PrivacyLastSeen,\n PrivacyProfilePhoto,\n PrivacyForwarding,\n PrivacyGroupChats,\n PrivacyPhoneNumberAllowedContacts,\n PrivacyPhoneNumberDeniedContacts,\n PrivacyLastSeenAllowedContacts,\n PrivacyLastSeenDeniedContacts,\n PrivacyProfilePhotoAllowedContacts,\n PrivacyProfilePhotoDeniedContacts,\n PrivacyForwardingAllowedContacts,\n PrivacyForwardingDeniedContacts,\n PrivacyGroupChatsAllowedContacts,\n PrivacyGroupChatsDeniedContacts,\n PrivacyActiveSessions,\n PrivacyBlockedUsers,\n Folders,\n FoldersCreateFolder,\n FoldersEditFolder,\n FoldersEditFolderFromChatList,\n FoldersIncludedChats,\n FoldersIncludedChatsFromChatList,\n FoldersExcludedChats,\n FoldersExcludedChatsFromChatList,\n TwoFaDisabled,\n TwoFaNewPassword,\n TwoFaNewPasswordConfirm,\n TwoFaNewPasswordHint,\n TwoFaNewPasswordEmail,\n TwoFaNewPasswordEmailCode,\n TwoFaEnabled,\n TwoFaChangePasswordCurrent,\n TwoFaChangePasswordNew,\n TwoFaChangePasswordConfirm,\n TwoFaChangePasswordHint,\n TwoFaTurnOff,\n TwoFaRecoveryEmailCurrentPassword,\n TwoFaRecoveryEmail,\n TwoFaRecoveryEmailCode,\n TwoFaCongratulations,\n QuickReaction,\n}\n\nexport type StickerSetOrRecent = Pick<ApiStickerSet, (\n 'id' | 'title' | 'count' | 'stickers' | 'hasThumbnail' | 'isLottie' | 'isGifs'\n)>;\n\nexport enum LeftColumnContent {\n ChatList,\n GlobalSearch,\n Settings,\n Contacts,\n Archived,\n NewChannelStep1,\n NewChannelStep2,\n NewGroupStep1,\n NewGroupStep2,\n}\n\nexport enum GlobalSearchContent {\n ChatList,\n Media,\n Links,\n Files,\n Music,\n Voice,\n}\n\nexport enum RightColumnContent {\n ChatInfo,\n Search,\n Management,\n StickerSearch,\n GifSearch,\n PollResults,\n AddingMembers,\n}\n\nexport enum MediaViewerOrigin {\n Inline,\n ScheduledInline,\n SharedMedia,\n ProfileAvatar,\n SettingsAvatar,\n MiddleHeaderAvatar,\n Album,\n ScheduledAlbum,\n SearchResult,\n}\n\nexport enum AudioOrigin {\n Inline,\n SharedMedia,\n Search,\n}\n\nexport enum ChatCreationProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ProfileEditProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport enum ManagementProgress {\n Idle,\n InProgress,\n Complete,\n Error,\n}\n\nexport interface ManagementState {\n isActive: boolean;\n nextScreen?: ManagementScreens;\n isUsernameAvailable?: boolean;\n error?: string;\n invites?: ApiExportedInvite[];\n revokedInvites?: ApiExportedInvite[];\n editingInvite?: ApiExportedInvite;\n inviteInfo?: {\n invite: ApiExportedInvite;\n importers?: ApiChatInviteImporter[];\n requesters?: ApiChatInviteImporter[];\n };\n}\n\nexport enum NewChatMembersProgress {\n Closed,\n InProgress,\n Loading,\n}\n\nexport type ProfileTabType = 'members' | 'commonChats' | 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type SharedMediaType = 'media' | 'documents' | 'links' | 'audio' | 'voice';\nexport type ApiPrivacyKey = 'phoneNumber' | 'lastSeen' | 'profilePhoto' | 'forwards' | 'chatInvite';\nexport type PrivacyVisibility = 'everybody' | 'contacts' | 'nonContacts' | 'nobody';\n\nexport enum ProfileState {\n Profile,\n SharedMedia,\n MemberList,\n}\n\nexport enum PaymentStep {\n ShippingInfo,\n Shipping,\n PaymentInfo,\n Checkout,\n}\n\nexport const UPLOADING_WALLPAPER_SLUG = 'UPLOADING_WALLPAPER_SLUG';\n\nexport enum ManagementScreens {\n Initial,\n ChatPrivacyType,\n Discussion,\n ChannelSubscribers,\n GroupType,\n GroupPermissions,\n GroupRemovedUsers,\n GroupUserPermissionsCreate,\n GroupUserPermissions,\n ChatAdministrators,\n GroupRecentActions,\n ChatAdminRights,\n ChatNewAdminRights,\n GroupMembers,\n GroupAddAdmins,\n Invites,\n EditInvite,\n Reactions,\n InviteInfo,\n JoinRequests,\n}\n\nexport type ManagementType = 'user' | 'group' | 'channel';\n\nexport type NotifyException = {\n isMuted: boolean;\n isSilent?: boolean;\n shouldShowPreviews?: boolean;\n};\n\nexport type EmojiKeywords = {\n isLoading?: boolean;\n version: number;\n keywords: Record<string, string[]>;\n};\n\nexport type InlineBotSettings = {\n id: string;\n help?: string;\n query?: string;\n offset?: string;\n canLoadMore?: boolean;\n results?: (ApiBotInlineResult | ApiBotInlineMediaResult)[];\n isGallery?: boolean;\n switchPm?: ApiBotInlineSwitchPm;\n};\n","import { fastRaf } from './schedulers';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n}\n\nlet currentInstance: AnimationInstance | undefined;\n\nexport function animateSingle(tick: Function, instance?: AnimationInstance) {\n if (!instance) {\n if (currentInstance && !currentInstance.isCancelled) {\n currentInstance.isCancelled = true;\n }\n\n instance = { isCancelled: false };\n currentInstance = instance;\n }\n\n if (!instance!.isCancelled && tick()) {\n fastRaf(() => {\n animateSingle(tick, instance);\n });\n }\n}\n\nexport function animate(tick: Function) {\n if (tick()) {\n fastRaf(() => {\n animate(tick);\n });\n }\n}\n\nexport type TimingFn = (t: number) => number;\n\nexport type AnimateNumberProps = {\n to: number | number[];\n from: number | number[];\n duration: number;\n onUpdate: (value: any) => void;\n timing?: TimingFn;\n onEnd?: () => void;\n};\n\nexport const timingFunctions = {\n linear: (t: number) => t,\n easeIn: (t: number) => t ** 1.675,\n easeOut: (t: number) => 1 - (1 - t ** 1.675),\n easeInOut: (t: number) => 0.5 * (Math.sin((t - 0.5) * Math.PI) + 1),\n easeInQuad: (t: number) => t * t,\n easeOutQuad: (t: number) => t * (2 - t),\n easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n easeInCubic: (t: number) => t * t * t,\n easeOutCubic: (t: number) => (--t) * t * t + 1,\n easeInOutCubic: (t: number) => (t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1),\n easeInQuart: (t: number) => t * t * t * t,\n easeOutQuart: (t: number) => 1 - (--t) * t * t * t,\n easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t),\n easeInQuint: (t: number) => t * t * t * t * t,\n easeOutQuint: (t: number) => 1 + (--t) * t * t * t * t,\n easeInOutQuint: (t: number) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t),\n};\n\nexport function animateNumber({\n timing = timingFunctions.linear,\n onUpdate,\n duration,\n onEnd,\n from,\n to,\n}: AnimateNumberProps) {\n const t0 = Date.now();\n let canceled = false;\n\n animate(() => {\n if (canceled) return false;\n const t1 = Date.now();\n let t = (t1 - t0) / duration;\n if (t > 1) t = 1;\n const progress = timing(t);\n if (typeof from === 'number' && typeof to === 'number') {\n onUpdate(from + ((to - from) * progress));\n } else if (Array.isArray(from) && Array.isArray(to)) {\n const result = from.map((f, i) => f + ((to[i] - f) * progress));\n onUpdate(result);\n }\n if (t === 1 && onEnd) onEnd();\n return t < 1;\n });\n\n return () => {\n canceled = true;\n if (onEnd) onEnd();\n };\n}\n","import { DEBUG } from '../config';\n\nexport function updateAppBadge(unreadCount: number) {\n if (typeof window.navigator.setAppBadge !== 'function') {\n return;\n }\n\n window.navigator.setAppBadge(unreadCount).catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n });\n}\n","export default function arePropsShallowEqual(currentProps: AnyLiteral, newProps: AnyLiteral) {\n if (currentProps === newProps) {\n return true;\n }\n\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return false;\n }\n\n if (currentKeysLength === 0) {\n return true;\n }\n\n for (let i = 0; i < currentKeysLength; i++) {\n const prop = currentKeys[i];\n if (currentProps[prop] !== newProps[prop]) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function getUnequalProps(currentProps: AnyLiteral, newProps: AnyLiteral) {\n const currentKeys = Object.keys(currentProps);\n const currentKeysLength = currentKeys.length;\n const newKeysLength = Object.keys(newProps).length;\n\n if (currentKeysLength !== newKeysLength) {\n return ['%LENGTH%'];\n }\n\n return currentKeys.reduce((res, prop) => {\n if (currentProps[prop] !== newProps[prop]) {\n res.push(`${prop}: ${currentProps[prop]} => ${newProps[prop]}`);\n }\n\n return res;\n }, [] as string[]);\n}\n","type Parts = (string | false | undefined)[];\ntype PartsWithGlobals = (string | false | undefined | string[])[];\n\nexport default function buildClassName(...parts: Parts) {\n return parts.filter(Boolean).join(' ');\n}\n\nexport function createClassNameBuilder(componentName: string) {\n return (elementName: string, ...modifiers: PartsWithGlobals) => {\n const baseName = elementName === '&' ? componentName : `${componentName}__${elementName}`;\n\n return modifiers.reduce<string[]>((acc, modifier) => {\n if (modifier) {\n // A bit hacky way to pass global class names\n if (Array.isArray(modifier)) {\n acc.push(...modifier);\n } else {\n acc.push(`${baseName}--${modifier}`);\n }\n }\n\n return acc;\n }, [baseName]).join(' ');\n };\n}\n","// eslint-disable-next-line no-restricted-globals\nconst cacheApi = self.caches;\n\nexport enum Type {\n Text,\n Blob,\n Json,\n}\n\nexport async function fetch(\n cacheName: string, key: string, type: Type, isHtmlAllowed = false,\n) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const cache = await cacheApi.open(cacheName);\n const response = await cache.match(request);\n if (!response) {\n return undefined;\n }\n\n const contentType = response.headers.get('Content-Type');\n\n switch (type) {\n case Type.Text:\n return await response.text();\n case Type.Blob: {\n // Ignore deprecated data-uri avatars\n if (key.startsWith('avatar') && contentType && contentType.startsWith('text')) {\n return undefined;\n }\n\n const blob = await response.blob();\n const shouldRecreate = !blob.type || (!isHtmlAllowed && blob.type.includes('html'));\n // iOS Safari fails to preserve `type` in cache\n let resolvedType = blob.type || contentType;\n\n if (!(shouldRecreate && resolvedType)) {\n return blob;\n }\n\n // Prevent HTML-in-video attacks (for files that were cached before fix)\n if (!isHtmlAllowed) {\n resolvedType = resolvedType.replace(/html/gi, '');\n }\n\n return new Blob([blob], { type: resolvedType });\n }\n case Type.Json:\n return await response.json();\n default:\n return undefined;\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function save(cacheName: string, key: string, data: AnyLiteral | Blob | string) {\n if (!cacheApi) {\n return undefined;\n }\n\n try {\n const cacheData = typeof data === 'string' || data instanceof Blob ? data : JSON.stringify(data);\n // To avoid the error \"Request scheme 'webdocument' is unsupported\"\n const request = new Request(key.replace(/:/g, '_'));\n const response = new Response(cacheData);\n const cache = await cacheApi.open(cacheName);\n return await cache.put(request, response);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n\nexport async function clear(cacheName: string) {\n try {\n if (!cacheApi) {\n return undefined;\n }\n\n return await cacheApi.delete(cacheName);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(err);\n return undefined;\n }\n}\n","export function createCallbackManager() {\n const callbacks: AnyToVoidFunction[] = [];\n\n function addCallback(cb: AnyToVoidFunction) {\n callbacks.push(cb);\n\n return () => {\n removeCallback(cb);\n };\n }\n\n function removeCallback(cb: AnyToVoidFunction) {\n const index = callbacks.indexOf(cb);\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n }\n\n function runCallbacks(...args: any[]) {\n callbacks.forEach((callback) => {\n callback(...args);\n });\n }\n\n function hasCallbacks() {\n return Boolean(callbacks.length);\n }\n\n return {\n runCallbacks,\n addCallback,\n removeCallback,\n hasCallbacks,\n };\n}\n\nexport type CallbackManager = ReturnType<typeof createCallbackManager>;\n","import captureKeyboardListener from './captureKeyboardListeners';\n\ntype IHandlerFunction = () => void;\n\nexport default function captureEscKeyListener(handler: IHandlerFunction) {\n return captureKeyboardListener({ onEsc: handler });\n}\n","type HandlerName = 'onEnter' | 'onBackspace' | 'onDelete' | 'onEsc' | 'onUp' | 'onDown' | 'onLeft' | 'onRight'\n| 'onTab';\ntype Handler = (e: KeyboardEvent) => void;\ntype CaptureOptions = Partial<Record<HandlerName, Handler>>;\n\nconst keyToHandlerName: Record<string, HandlerName> = {\n Enter: 'onEnter',\n Backspace: 'onBackspace',\n Delete: 'onDelete',\n Esc: 'onEsc',\n Escape: 'onEsc',\n ArrowUp: 'onUp',\n ArrowDown: 'onDown',\n ArrowLeft: 'onLeft',\n ArrowRight: 'onRight',\n Tab: 'onTab',\n};\n\nconst handlers: Record<HandlerName, Handler[]> = {\n onEnter: [],\n onDelete: [],\n onBackspace: [],\n onEsc: [],\n onUp: [],\n onDown: [],\n onLeft: [],\n onRight: [],\n onTab: [],\n};\n\nexport default function captureKeyboardListeners(options: CaptureOptions) {\n if (!hasActiveHandlers()) {\n document.addEventListener('keydown', handleKeyDown, true);\n }\n\n (Object.keys(options) as Array<HandlerName>).forEach((handlerName) => {\n const handler = options[handlerName];\n if (!handler) {\n return;\n }\n\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n currentEventHandlers.push(handler);\n }\n });\n\n return () => {\n releaseKeyboardListener(options);\n };\n}\n\nfunction hasActiveHandlers() {\n return Object.values(handlers).some((keyHandlers) => Boolean(keyHandlers.length));\n}\n\nfunction handleKeyDown(e: KeyboardEvent) {\n const handlerName = keyToHandlerName[e.key];\n if (!handlerName) {\n return;\n }\n\n const { length } = handlers[handlerName];\n if (!length) {\n return;\n }\n e.stopPropagation();\n\n const handler = handlers[handlerName][length - 1];\n handler!(e);\n}\n\nfunction releaseKeyboardListener(options: CaptureOptions) {\n (Object.keys(options) as Array<HandlerName>).forEach((handlerName) => {\n const handler = options[handlerName];\n const currentEventHandlers = handlers[handlerName];\n if (currentEventHandlers) {\n const index = currentEventHandlers.findIndex((cb) => cb === handler);\n if (index !== -1) {\n currentEventHandlers.splice(index, 1);\n }\n }\n });\n\n if (!hasActiveHandlers()) {\n document.removeEventListener('keydown', handleKeyDown, false);\n }\n}\n","import { LangFn } from '../hooks/useLang';\n\nconst WEEKDAYS_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst MONTHS_FULL = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nconst MONTHS_FULL_LOWERCASE = MONTHS_FULL.map((month) => month.toLowerCase());\nconst MIN_SEARCH_YEAR = 2015;\nconst MAX_DAY_IN_MONTH = 31;\nconst MAX_MONTH_IN_YEAR = 12;\nexport const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;\n\nexport function isToday(date: Date) {\n return getDayStart(new Date()) === getDayStart(date);\n}\n\nexport function getDayStart(datetime: number | Date) {\n const date = new Date(datetime);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n\nexport function getDayStartAt(datetime: number | Date) {\n return getDayStart(datetime).getTime();\n}\n\nexport function toYearMonth(timestamp: number) {\n const date = new Date(timestamp * 1000);\n return `${date.getFullYear()}-${date.getMonth()}`;\n}\n\nfunction toIsoString(date: Date) {\n return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;\n}\n\n// @optimization `toLocaleTimeString` is avoided because of bad performance\nexport function formatTime(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const timeFormat = lang.timeFormat || '24h';\n\n let hours = date.getHours();\n let marker = '';\n if (timeFormat === '12h') {\n marker = hours >= 12 ? ' PM' : ' AM';\n hours = hours > 12 ? hours % 12 : hours;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}${marker}`;\n}\n\nexport function formatPastTimeShort(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n if (date >= today) {\n return formatTime(lang, date);\n }\n\n const weekAgo = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n if (date >= weekAgo) {\n return lang(`Weekday.Short${WEEKDAYS_FULL[date.getDay()]}`);\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const format = (\n lang(withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n || (withYear ? 'd MMM yyyy' : 'd MMM')\n );\n\n return formatDate(lang, date, format);\n}\n\nexport function formatFullDate(lang: LangFn, datetime: number | Date) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n const format = lang('formatterYearMax') || 'dd.MM.yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatMonthAndYear(lang: LangFn, date: Date, isShort = false) {\n const format = lang(isShort ? 'formatterMonthYear2' : 'formatterMonthYear') || 'MMM yyyy';\n\n return formatDate(lang, date, format);\n}\n\nexport function formatCountdown(\n lang: LangFn,\n msLeft: number,\n) {\n const days = Math.floor(msLeft / MILLISECONDS_IN_DAY);\n if (msLeft < 0) {\n return 0;\n } else if (days < 1) {\n return formatMediaDuration(msLeft / 1000);\n } else if (days < 7) {\n return lang('Days', days);\n } else if (days < 30) {\n return lang('Weeks', Math.floor(days / 7));\n } else if (days < 365) {\n return lang('Months', Math.floor(days / 30));\n } else {\n return lang('Years', Math.floor(days / 365));\n }\n}\n\nexport function formatHumanDate(\n lang: LangFn,\n datetime: number | Date,\n isShort = false,\n noWeekdays = false,\n isUpperFirst?: boolean,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n const today = getDayStart(new Date());\n\n if (!noWeekdays) {\n if (toIsoString(date) === toIsoString(today)) {\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('Weekday.Today'));\n }\n\n const yesterday = new Date(today);\n yesterday.setDate(today.getDate() - 1);\n if (toIsoString(date) === toIsoString(yesterday)) {\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(lang('Weekday.Yesterday'));\n }\n\n const weekAgo = new Date(today);\n const weekAhead = new Date(today);\n weekAgo.setDate(today.getDate() - 7);\n weekAhead.setDate(today.getDate() + 7);\n if (date >= weekAgo && date <= weekAhead) {\n const weekDay = WEEKDAYS_FULL[date.getDay()];\n const weekDayString = isShort ? lang(`Weekday.Short${weekDay}`) : lang(`Weekday.${weekDay}`);\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(weekDayString);\n }\n }\n\n const withYear = date.getFullYear() !== today.getFullYear();\n const formatKey = isShort\n ? (withYear ? 'formatDateScheduleYear' : 'formatDateSchedule')\n : (withYear ? 'chatFullDate' : 'chatDate');\n const format = lang(formatKey) || 'd MMMM yyyy';\n\n return (isUpperFirst || !isShort ? upperFirst : lowerFirst)(formatDate(lang, date, format));\n}\n\nfunction formatDate(lang: LangFn, date: Date, format: string) {\n const day = date.getDate();\n const monthIndex = date.getMonth();\n\n return format\n .replace('LLLL', lang(MONTHS_FULL[monthIndex]))\n .replace('MMMM', lang(`Month.Gen${MONTHS_FULL[monthIndex]}`))\n .replace('MMM', lang(`Month.Short${MONTHS_FULL[monthIndex]}`))\n .replace('MM', String(monthIndex + 1).padStart(2, '0'))\n .replace('dd', String(day).padStart(2, '0'))\n .replace('d', String(day))\n .replace('yyyy', String(date.getFullYear()))\n // Workaround for https://bugs.telegram.org/c/5777\n .replace(/'de'/g, 'de');\n}\n\nexport function formatMediaDateTime(\n lang: LangFn,\n datetime: number | Date,\n isUpperFirst?: boolean,\n) {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n\n return `${formatHumanDate(lang, date, true, undefined, isUpperFirst)}, ${formatTime(lang, date)}`;\n}\n\nexport function formatMediaDuration(duration: number, maxValue?: number) {\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = Math.floor(duration % 3600 % 60);\n\n const maxHours = maxValue ? Math.floor(maxValue / 3600) : 0;\n const maxMinutes = maxValue ? Math.floor((maxValue % 3600) / 60) : 0;\n let string = '';\n if (hours > 0 || maxHours > 0) {\n string += `${String(hours).padStart(2, '0')}:`;\n string += `${String(minutes).padStart(2, '0')}:`;\n } else if (maxMinutes >= 10) {\n string += `${String(minutes).padStart(2, '0')}:`;\n } else {\n string += `${String(minutes)}:`;\n }\n string += String(seconds).padStart(2, '0');\n\n return string;\n}\n\nexport function formatVoiceRecordDuration(durationInMs: number) {\n const parts = [];\n\n let milliseconds = durationInMs % 1000;\n durationInMs -= milliseconds;\n milliseconds = Math.floor(milliseconds / 10);\n\n durationInMs = Math.floor(durationInMs / 1000);\n const seconds = durationInMs % 60;\n durationInMs -= seconds;\n\n durationInMs = Math.floor(durationInMs / 60);\n const minutes = durationInMs % 60;\n durationInMs -= minutes;\n\n durationInMs = Math.floor(durationInMs / 60);\n const hours = durationInMs % 60;\n\n if (hours > 0) {\n parts.push(String(hours).padStart(2, '0'));\n }\n parts.push(String(minutes).padStart(hours > 0 ? 2 : 1, '0'));\n parts.push(String(seconds).padStart(2, '0'));\n\n return `${parts.join(':')},${String(milliseconds).padStart(2, '0')}`;\n}\n\nexport function formatDateToString(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n },\n );\n}\n\nexport function formatDateTimeToString(datetime: Date | number, locale = 'en-US') {\n const date = typeof datetime === 'number' ? new Date(datetime) : datetime;\n return date.toLocaleString(\n locale,\n {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n },\n );\n}\n\nfunction isValidDate(day: number, month: number, year = 2021): boolean {\n if (month > (MAX_MONTH_IN_YEAR - 1) || day > MAX_DAY_IN_MONTH) {\n return false;\n }\n const date = new Date(year, month, day);\n return !Number.isNaN(date.getTime()) && date.getDate() === day;\n}\n\nexport function parseDateString(query = ''): string | undefined {\n const matchStringDate = query.match(/\\d{1,2}\\s[a-zA-Z]{3,}/);\n const matchEuropeStringDate = query.match(/[a-zA-Z]{3,}\\s\\d{1,2}/);\n const matchNumberDate = query.match(/\\d{1,2}[./-]\\d{1,2}([./-]\\d{2,4})?/);\n if (!matchStringDate && !matchNumberDate && !matchEuropeStringDate) {\n return undefined;\n }\n\n if (matchNumberDate) {\n const [date, month, year] = query.split(/[./-]/).map(Number);\n return !(year && year < MIN_SEARCH_YEAR) && isValidDate(date, month - 1, year || undefined)\n ? `${year ? `${year}-` : ''}${String(month).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n }\n\n const dateParts = query.split(' ');\n const date = matchStringDate ? dateParts[0] : dateParts[1];\n const month = (matchStringDate ? dateParts[1] : dateParts[0]).toLowerCase();\n const monthIndex = MONTHS_FULL_LOWERCASE.findIndex((item) => item.startsWith(month));\n\n return monthIndex !== -1 && isValidDate(Number(date), monthIndex)\n ? `${String(monthIndex + 1).padStart(2, '0')}-${String(date).padStart(2, '0')}`\n : undefined;\n}\n\nexport function timestampPlusDay(timestamp: number) {\n return timestamp + MILLISECONDS_IN_DAY / 1000;\n}\n\nfunction lowerFirst(str: string) {\n return `${str[0].toLowerCase()}${str.slice(1)}`;\n}\n\nfunction upperFirst(str: string) {\n return `${str[0].toUpperCase()}${str.slice(1)}`;\n}\n","import EMOJI_REGEX from '../lib/twemojiRegex';\n\n// Due to the fact that emoji from Apple do not contain some characters, it is necessary to remove them from emoji-data\n// https://github.com/iamcal/emoji-data/issues/136\nconst EXCLUDE_EMOJIS = ['female_sign', 'male_sign', 'medical_symbol'];\n\nconst ISO_FLAGS_OFFSET = 127397;\n\nexport type EmojiRawData = typeof import('emoji-data-ios/emoji-data.json');\nexport type EmojiModule = { default: EmojiRawData };\n\nexport type EmojiData = {\n categories: Array<EmojiCategory>;\n emojis: Record<string, Emoji>;\n};\n\n// Non-standard variations of emojis, used on some devices\nconst EMOJI_EXCEPTIONS: [string | RegExp, string][] = [\n [/\\u{1f3f3}\\u200d\\u{1f308}/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u{1f308}'], // 🏳‍🌈\n [/\\u{1f3f3}\\u200d\\u26a7\\ufe0f/gu, '\\u{1f3f3}\\ufe0f\\u200d\\u26a7\\ufe0f'], // 🏳️‍⚧️\n [/\\u{1f937}\\u200d\\u2642[^\\ufe0f]/gu, '\\u{1f937}\\u200d\\u2642\\ufe0f'], // 🤷‍♂️\n];\n\nfunction unifiedToNative(unified: string) {\n const unicodes = unified.split('-');\n const codePoints = unicodes.map((i) => parseInt(i, 16));\n\n return String.fromCodePoint(...codePoints);\n}\n\nexport function fixNonStandardEmoji(text: string) {\n // Non-standard sequences typically parsed as separate emojis, so no need to fix text without any\n if (!text.match(EMOJI_REGEX)) return text;\n // eslint-disable-next-line no-restricted-syntax\n for (const [regex, replacement] of EMOJI_EXCEPTIONS) {\n text = text.replace(regex, replacement);\n }\n\n return text;\n}\n\nexport function nativeToUnified(emoji: string) {\n let code;\n\n if (emoji.length === 1) {\n code = emoji.charCodeAt(0).toString(16).padStart(4, '0');\n } else {\n const pairs = [];\n for (let i = 0; i < emoji.length; i++) {\n if (emoji.charCodeAt(i) >= 0xd800 && emoji.charCodeAt(i) <= 0xdbff) {\n if (emoji.charCodeAt(i + 1) >= 0xdc00 && emoji.charCodeAt(i + 1) <= 0xdfff) {\n pairs.push(\n (emoji.charCodeAt(i) - 0xd800) * 0x400\n + (emoji.charCodeAt(i + 1) - 0xdc00) + 0x10000,\n );\n }\n } else if (emoji.charCodeAt(i) < 0xd800 || emoji.charCodeAt(i) > 0xdfff) {\n pairs.push(emoji.charCodeAt(i));\n }\n }\n\n code = pairs.map((x) => x.toString(16).padStart(4, '0')).join('-');\n }\n\n return code;\n}\n\nexport function uncompressEmoji(data: EmojiRawData): EmojiData {\n const emojiData: EmojiData = { categories: [], emojis: {} };\n\n for (let i = 0; i < data.length; i += 2) {\n const category = {\n id: data[i][0],\n name: data[i][1],\n emojis: [],\n } as EmojiCategory;\n\n for (let j = 0; j < data[i + 1].length; j++) {\n const emojiRaw = data[i + 1][j];\n if (!EXCLUDE_EMOJIS.includes(emojiRaw[1][0])) {\n category.emojis.push(emojiRaw[1][0]);\n emojiData.emojis[emojiRaw[1][0]] = {\n id: emojiRaw[1][0],\n names: emojiRaw[1] as string[],\n native: unifiedToNative(emojiRaw[0] as string),\n image: (emojiRaw[0] as string).toLowerCase(),\n };\n }\n }\n\n emojiData.categories.push(category);\n }\n\n return emojiData;\n}\n\nexport function isoToEmoji(iso: string) {\n const code = iso.toUpperCase();\n\n if (!/^[A-Z]{2}$/.test(code)) return iso;\n const codePoints = [...code].map((c) => c.codePointAt(0)! + ISO_FLAGS_OFFSET);\n return String.fromCodePoint(...codePoints);\n}\n","export function ensureProtocol(url?: string) {\n if (!url) {\n return undefined;\n }\n\n // HTTP was chosen by default as a fix for https://bugs.telegram.org/c/10712.\n // It is also the default protocol in the official TDesktop client.\n return url.includes('://') ? url : `http://${url}`;\n}\n","let isWebpSupportedCache: boolean | undefined;\n\nexport function isWebpSupported() {\n return Boolean(isWebpSupportedCache);\n}\n\nfunction testWebp(): Promise<boolean> {\n return new Promise((resolve) => {\n const webp = new Image();\n // eslint-disable-next-line max-len\n webp.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n const handleLoadOrError = () => {\n resolve(webp.height === 2);\n };\n webp.onload = handleLoadOrError;\n webp.onerror = handleLoadOrError;\n });\n}\n\ntestWebp().then((hasWebp) => {\n isWebpSupportedCache = hasWebp;\n});\n","import { ThemeKey } from '../types';\n\nlet systemThemeCache: ThemeKey = (\n window.matchMedia?.('(prefers-color-scheme: dark)').matches\n) ? 'dark' : 'light';\n\nexport function getSystemTheme() {\n return systemThemeCache;\n}\n\nfunction handleSystemThemeChange(e: MediaQueryListEventMap['change']) {\n systemThemeCache = e.matches ? 'dark' : 'light';\n}\n\nconst mql = window.matchMedia('(prefers-color-scheme: dark)');\nif (typeof mql.addEventListener === 'function') {\n mql.addEventListener('change', handleSystemThemeChange);\n} else if (typeof mql.addListener === 'function') {\n mql.addListener(handleSystemThemeChange);\n}\n","import {\n MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN,\n MOBILE_SCREEN_MAX_WIDTH,\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n IS_TEST,\n SUPPORTED_VIDEO_CONTENT_TYPES,\n VIDEO_MOV_TYPE,\n} from '../config';\n\nexport * from './environmentWebp';\n\nexport * from './environmentSystemTheme';\n\nexport function getPlatform() {\n const { userAgent, platform } = window.navigator;\n const macosPlatforms = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'];\n const windowsPlatforms = ['Win32', 'Win64', 'Windows', 'WinCE'];\n const iosPlatforms = ['iPhone', 'iPad', 'iPod'];\n let os: 'macOS' | 'iOS' | 'Windows' | 'Android' | 'Linux' | undefined;\n\n if (macosPlatforms.indexOf(platform) !== -1) {\n os = 'macOS';\n } else if (iosPlatforms.indexOf(platform) !== -1) {\n os = 'iOS';\n } else if (windowsPlatforms.indexOf(platform) !== -1) {\n os = 'Windows';\n } else if (/Android/.test(userAgent)) {\n os = 'Android';\n } else if (/Linux/.test(platform)) {\n os = 'Linux';\n }\n\n return os;\n}\n\nexport const PLATFORM_ENV = getPlatform();\nexport const IS_MAC_OS = PLATFORM_ENV === 'macOS';\nexport const IS_IOS = PLATFORM_ENV === 'iOS';\nexport const IS_ANDROID = PLATFORM_ENV === 'Android';\nexport const IS_SAFARI = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nexport const IS_PWA = (\n window.matchMedia('(display-mode: standalone)').matches\n || (window.navigator as any).standalone\n || document.referrer.includes('android-app://')\n);\n\nexport const IS_TOUCH_ENV = window.matchMedia('(pointer: coarse)').matches;\n// Keep in mind the landscape orientation\nexport const IS_SINGLE_COLUMN_LAYOUT = window.innerWidth <= MOBILE_SCREEN_MAX_WIDTH || (\n window.innerWidth <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && window.innerHeight <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n);\n// Special layout, 1 column while chat opened, 2 columns while collapsed\nexport const IS_TABLET_COLUMN_LAYOUT = !IS_SINGLE_COLUMN_LAYOUT && (\n window.innerWidth <= MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN\n);\nexport const IS_VOICE_RECORDING_SUPPORTED = Boolean(\n navigator.mediaDevices && 'getUserMedia' in navigator.mediaDevices && (\n window.AudioContext || (window as any).webkitAudioContext\n ),\n);\nexport const IS_SMOOTH_SCROLL_SUPPORTED = 'scrollBehavior' in document.documentElement.style;\nexport const IS_EMOJI_SUPPORTED = PLATFORM_ENV && (IS_MAC_OS || IS_IOS);\nexport const IS_SERVICE_WORKER_SUPPORTED = 'serviceWorker' in navigator;\n// TODO Consider failed service worker\nexport const IS_PROGRESSIVE_SUPPORTED = IS_SERVICE_WORKER_SUPPORTED;\nexport const IS_STREAMING_SUPPORTED = 'MediaSource' in window;\nexport const IS_OPUS_SUPPORTED = Boolean((new Audio()).canPlayType('audio/ogg; codecs=opus'));\nexport const IS_CANVAS_FILTER_SUPPORTED = (\n !IS_TEST && 'filter' in (document.createElement('canvas').getContext('2d') || {})\n);\nexport const IS_REQUEST_FULLSCREEN_SUPPORTED = 'requestFullscreen' in document.createElement('div');\nexport const ARE_CALLS_SUPPORTED = !navigator.userAgent.includes('Firefox');\nexport const LAYERS_ANIMATION_NAME = IS_ANDROID ? 'slide-fade' : IS_IOS ? 'slide-layers' : 'push-slide';\n\nconst TEST_VIDEO = document.createElement('video');\n// `canPlayType(VIDEO_MOV_TYPE)` returns false negative at least for macOS Chrome and iOS Safari\nexport const IS_MOV_SUPPORTED = true;\n\nif (IS_MOV_SUPPORTED) SUPPORTED_VIDEO_CONTENT_TYPES.add(VIDEO_MOV_TYPE);\n\nexport const IS_WEBM_SUPPORTED = Boolean(TEST_VIDEO.canPlayType('video/webm; codecs=\"vp9\"').replace('no', ''))\n && !(IS_MAC_OS && IS_SAFARI); // Safari on MacOS has some issues with WebM\n\nexport const DPR = window.devicePixelRatio || 1;\n\nexport const MASK_IMAGE_DISABLED = true;\n\nexport const IS_SCROLL_PATCH_NEEDED = !IS_MAC_OS && !IS_IOS && !IS_ANDROID;\n\n// Smaller area reduces scroll jumps caused by `patchChromiumScroll`\nexport const MESSAGE_LIST_SENSITIVE_AREA = IS_SCROLL_PATCH_NEEDED ? 300 : 750;\n","import { pause } from './schedulers';\n\n// Polyfill for Safari: `File` is not available in web worker\nif (typeof File === 'undefined') {\n // eslint-disable-next-line no-global-assign, no-restricted-globals, func-names\n self.File = class extends Blob {\n name: string;\n\n constructor(fileBits: BlobPart[], fileName: string, options?: FilePropertyBag) {\n if (options) {\n const { type, ...rest } = options;\n super(fileBits, { type });\n Object.assign(this, rest);\n } else {\n super(fileBits);\n }\n\n this.name = fileName;\n }\n } as typeof File;\n}\n\nexport function dataUriToBlob(dataUri: string) {\n const arr = dataUri.split(',');\n const mime = arr[0].match(/:(.*?);/)![1];\n const bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\nexport function blobToDataUri(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = (e: ProgressEvent<FileReader>) => {\n const { result } = e.target || {};\n if (typeof result === 'string') {\n resolve(result);\n }\n\n reject(new Error('Failed to read blob'));\n };\n\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n lastModified: Date.now(),\n type: blob.type,\n });\n}\n\nexport function preloadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function preloadVideo(url: string): Promise<HTMLVideoElement> {\n return new Promise((resolve, reject) => {\n const video = document.createElement('video');\n video.volume = 0;\n video.onloadedmetadata = () => resolve(video);\n video.onerror = reject;\n video.src = url;\n });\n}\n\nexport async function createPosterForVideo(url: string): Promise<string | undefined> {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise<undefined>,\n new Promise<string | undefined>((resolve, reject) => {\n video.onseeked = () => {\n if (!video.videoWidth || !video.videoHeight) {\n resolve(undefined);\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(video, 0, 0);\n resolve(canvas.toDataURL('image/jpeg'));\n };\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n }),\n ]);\n}\n\nexport async function fetchBlob(blobUrl: string) {\n const response = await fetch(blobUrl);\n return response.blob();\n}\n\nexport async function fetchFile(blobUrl: string, fileName: string) {\n const blob = await fetchBlob(blobUrl);\n return blobToFile(blob, fileName);\n}\n\nexport function imgToCanvas(img: HTMLImageElement) {\n const canvas = document.createElement('canvas');\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0);\n\n return canvas;\n}\n","import { addCallback, addReducer, getGlobal } from '../lib/teact/teactn';\n\nimport { GlobalState } from '../global/types';\nimport { NotifyException, NotifySettings } from '../types';\nimport { ApiChat, ApiChatFolder, ApiUser } from '../api/types';\n\nimport { ALL_FOLDER_ID, ARCHIVED_FOLDER_ID, DEBUG } from '../config';\nimport { selectNotifySettings, selectNotifyExceptions } from '../modules/selectors';\nimport { selectIsChatMuted } from '../modules/helpers';\nimport { onIdle, throttle } from './schedulers';\nimport { areSortedArraysEqual, unique } from './iteratees';\nimport arePropsShallowEqual from './arePropsShallowEqual';\nimport { CallbackManager, createCallbackManager } from './callbacks';\n\ninterface FolderSummary {\n id: number;\n listIds?: Set<string>;\n orderedPinnedIds?: string[];\n contacts?: true;\n nonContacts?: true;\n groups?: true;\n channels?: true;\n bots?: true;\n excludeMuted?: true;\n excludeRead?: true;\n excludeArchived?: true;\n excludedChatIds?: Set<string>;\n includedChatIds?: Set<string>;\n pinnedChatIds?: Set<string>;\n}\n\ninterface ChatSummary {\n id: string;\n type: ApiChat['type'];\n isListed: boolean;\n isArchived: boolean;\n isMuted: boolean;\n isUnread: boolean;\n unreadCount?: number;\n unreadMentionsCount?: number;\n order: number;\n isUserBot?: boolean;\n isUserContact?: boolean;\n}\n\nconst UPDATE_THROTTLE = 500;\nconst DEBUG_DURATION_LIMIT = 6;\n\nconst initials = buildInitials();\n\nlet prevGlobal: {\n allFolderListIds?: GlobalState['chats']['listIds']['active'];\n allFolderPinnedIds?: GlobalState['chats']['orderedPinnedIds']['active'];\n archivedFolderListIds?: GlobalState['chats']['listIds']['archived'];\n archivedFolderPinnedIds?: GlobalState['chats']['orderedPinnedIds']['archived'];\n isAllFolderFullyLoaded?: boolean;\n isArchivedFolderFullyLoaded?: boolean;\n chatsById: Record<string, ApiChat>;\n foldersById: Record<string, ApiChatFolder>;\n usersById: Record<string, ApiUser>;\n notifySettings: NotifySettings;\n notifyExceptions?: Record<number, NotifyException>;\n} = initials.prevGlobal;\n\nlet prepared: {\n folderSummariesById: Record<string, FolderSummary>;\n chatSummariesById: Map<string, ChatSummary>;\n folderIdsByChatId: Record<string, number[]>;\n chatIdsByFolderId: Record<number, Set<string> | undefined>;\n isOrderedListJustPatched: Record<number, boolean | undefined>;\n} = initials.prepared;\n\nlet results: {\n orderedIdsByFolderId: Record<string, string[] | undefined>;\n pinnedCountByFolderId: Record<string, number | undefined>; // Also watched by `callbacks.orderedIdsByFolderId`\n chatsCountByFolderId: Record<string, number | undefined>;\n unreadCountersByFolderId: Record<string, {\n chatsCount: number;\n notificationsCount: number;\n } | undefined>;\n} = initials.results;\n\nlet callbacks: {\n orderedIdsByFolderId: Record<number, CallbackManager>;\n chatsCountByFolderId: CallbackManager;\n unreadCountersByFolderId: CallbackManager;\n} = initials.callbacks;\n\nconst updateFolderManagerThrottled = throttle(() => {\n onIdle(() => {\n updateFolderManager(getGlobal());\n });\n}, UPDATE_THROTTLE);\n\nlet inited = false;\n\n/* Getters */\n\nexport function init() {\n inited = true;\n\n addCallback(updateFolderManagerThrottled);\n addReducer('reset', reset);\n\n updateFolderManager(getGlobal());\n}\n\nexport function getOrderedIds(folderId: number) {\n if (!inited) init();\n\n return results.orderedIdsByFolderId[folderId];\n}\n\nexport function getPinnedChatsCount(folderId: number) {\n if (!inited) init();\n\n return results.pinnedCountByFolderId[folderId] || 0;\n}\n\nexport function getChatsCount() {\n if (!inited) init();\n\n return results.chatsCountByFolderId;\n}\n\nexport function getUnreadCounters() {\n if (!inited) init();\n\n return results.unreadCountersByFolderId;\n}\n\nexport function getAllNotificationsCount() {\n return getUnreadCounters()[ALL_FOLDER_ID]?.notificationsCount || 0;\n}\n\n/* Callback managers */\n\nexport function addOrderedIdsCallback(folderId: number, callback: (orderedIds: string[]) => void) {\n if (!callbacks.orderedIdsByFolderId[folderId]) {\n callbacks.orderedIdsByFolderId[folderId] = createCallbackManager();\n }\n\n return callbacks.orderedIdsByFolderId[folderId].addCallback(callback);\n}\n\nexport function addChatsCountCallback(callback: (chatsCount: typeof results.chatsCountByFolderId) => void) {\n return callbacks.chatsCountByFolderId.addCallback(callback);\n}\n\nexport function addUnreadCountersCallback(callback: (unreadCounters: typeof results.unreadCountersByFolderId) => void) {\n return callbacks.unreadCountersByFolderId.addCallback(callback);\n}\n\n/* Global update handlers */\n\nfunction updateFolderManager(global: GlobalState) {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n let DEBUG_startedAt: number;\n if (DEBUG) {\n DEBUG_startedAt = performance.now();\n }\n\n const isAllFolderChanged = Boolean(\n global.chats.listIds.active\n && isMainFolderChanged(ALL_FOLDER_ID, global.chats.listIds.active, global.chats.orderedPinnedIds.active),\n );\n const isArchivedFolderChanged = Boolean(\n global.chats.listIds.archived\n && isMainFolderChanged(ARCHIVED_FOLDER_ID, global.chats.listIds.archived, global.chats.orderedPinnedIds.archived),\n );\n const isAllFullyLoadedChanged = global.chats.isFullyLoaded.active !== prevGlobal.isAllFolderFullyLoaded;\n const isArchivedFullyLoadedChanged = global.chats.isFullyLoaded.archived !== prevGlobal.isArchivedFolderFullyLoaded;\n\n const areFoldersChanged = global.chatFolders.byId !== prevGlobal.foldersById;\n const areChatsChanged = global.chats.byId !== prevGlobal.chatsById;\n const areUsersChanged = global.users.byId !== prevGlobal.usersById;\n const areNotifySettingsChanged = selectNotifySettings(global) !== prevGlobal.notifySettings;\n const areNotifyExceptionsChanged = selectNotifyExceptions(global) !== prevGlobal.notifyExceptions;\n\n let affectedFolderIds: number[] = [];\n\n if (isAllFullyLoadedChanged || isArchivedFullyLoadedChanged) {\n affectedFolderIds = affectedFolderIds.concat(\n updateFullyLoaded(global, isArchivedFullyLoadedChanged),\n );\n }\n\n if (!(\n isAllFolderChanged || isArchivedFolderChanged || areFoldersChanged\n || areChatsChanged || areUsersChanged || areNotifySettingsChanged || areNotifyExceptionsChanged\n )\n ) {\n if (affectedFolderIds.length) {\n updateResults(affectedFolderIds);\n }\n\n return;\n }\n\n const prevAllFolderListIds = prevGlobal.allFolderListIds;\n const prevArchivedFolderListIds = prevGlobal.archivedFolderListIds;\n\n updateFolders(global, isAllFolderChanged, isArchivedFolderChanged, areFoldersChanged);\n\n affectedFolderIds = affectedFolderIds.concat(updateChats(\n global, areFoldersChanged || isAllFolderChanged || isArchivedFolderChanged,\n areNotifySettingsChanged, areNotifyExceptionsChanged,\n prevAllFolderListIds, prevArchivedFolderListIds,\n ));\n\n updateResults(unique(affectedFolderIds));\n\n if (DEBUG) {\n const duration = performance.now() - DEBUG_startedAt!;\n if (duration > DEBUG_DURATION_LIMIT) {\n // eslint-disable-next-line no-console\n console.warn(`Slow \\`updateFolderManager\\`: ${Math.round(duration)} ms`);\n }\n }\n}\n\nfunction isMainFolderChanged(folderId: number, newListIds?: string[], newPinnedIds?: string[]) {\n const currentListIds = folderId === ALL_FOLDER_ID\n ? prevGlobal.allFolderListIds\n : prevGlobal.archivedFolderListIds;\n const currentPinnedIds = folderId === ALL_FOLDER_ID\n ? prevGlobal.allFolderPinnedIds\n : prevGlobal.archivedFolderPinnedIds;\n\n return currentListIds !== newListIds || currentPinnedIds !== newPinnedIds;\n}\n\nfunction updateFullyLoaded(\n global: GlobalState,\n isArchivedFullyLoadedChanged = false,\n) {\n let affectedFolderIds = [];\n\n if (isArchivedFullyLoadedChanged) {\n affectedFolderIds.push(ARCHIVED_FOLDER_ID);\n }\n\n const isAllFolderFullyLoaded = global.chats.isFullyLoaded.active;\n const isArchivedFolderFullyLoaded = global.chats.isFullyLoaded.archived;\n\n if (isAllFolderFullyLoaded && isArchivedFolderFullyLoaded) {\n const emptyFolderIds = Object.keys(prepared.folderSummariesById)\n .filter((folderId) => !results.orderedIdsByFolderId[folderId])\n .map(Number);\n\n affectedFolderIds = affectedFolderIds.concat(emptyFolderIds);\n }\n\n prevGlobal.isAllFolderFullyLoaded = isAllFolderFullyLoaded;\n prevGlobal.isArchivedFolderFullyLoaded = isArchivedFolderFullyLoaded;\n\n return affectedFolderIds;\n}\n\nfunction updateFolders(\n global: GlobalState, isAllFolderChanged: boolean, isArchivedFolderChanged: boolean, areFoldersChanged: boolean,\n) {\n const changedFolders = [];\n\n if (isAllFolderChanged) {\n const newListIds = global.chats.listIds.active!;\n const newPinnedIds = global.chats.orderedPinnedIds.active;\n\n prepared.folderSummariesById[ALL_FOLDER_ID] = buildFolderSummaryFromMainList(\n ALL_FOLDER_ID, newListIds, newPinnedIds,\n );\n\n prevGlobal.allFolderListIds = newListIds;\n prevGlobal.allFolderPinnedIds = newPinnedIds;\n\n changedFolders.push(ALL_FOLDER_ID);\n }\n\n if (isArchivedFolderChanged) {\n const newListIds = global.chats.listIds.archived!;\n const newPinnedIds = global.chats.orderedPinnedIds.archived;\n\n prepared.folderSummariesById[ARCHIVED_FOLDER_ID] = buildFolderSummaryFromMainList(\n ARCHIVED_FOLDER_ID, newListIds, newPinnedIds,\n );\n\n prevGlobal.archivedFolderListIds = newListIds;\n prevGlobal.archivedFolderPinnedIds = newPinnedIds;\n\n changedFolders.push(ARCHIVED_FOLDER_ID);\n }\n\n if (areFoldersChanged) {\n const newFoldersById = global.chatFolders.byId;\n\n Object.values(newFoldersById).forEach((folder) => {\n if (folder === prevGlobal.foldersById[folder.id]) {\n return;\n }\n\n prepared.folderSummariesById[folder.id] = buildFolderSummary(folder);\n\n changedFolders.push(folder.id);\n });\n\n prevGlobal.foldersById = newFoldersById;\n }\n\n return changedFolders;\n}\n\nfunction buildFolderSummaryFromMainList(\n folderId: number, listIds: string[], orderedPinnedIds?: string[],\n): FolderSummary {\n return {\n id: folderId,\n listIds: new Set(listIds),\n orderedPinnedIds: orderedPinnedIds,\n pinnedChatIds: new Set(orderedPinnedIds),\n };\n}\n\nfunction buildFolderSummary(folder: ApiChatFolder): FolderSummary {\n return {\n ...folder,\n orderedPinnedIds: folder.pinnedChatIds,\n excludedChatIds: folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined,\n includedChatIds: folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined,\n pinnedChatIds: folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined,\n };\n}\n\nfunction updateChats(\n global: GlobalState,\n areFoldersChanged: boolean,\n areNotifySettingsChanged: boolean,\n areNotifyExceptionsChanged: boolean,\n prevAllFolderListIds?: string[],\n prevArchivedFolderListIds?: string[],\n) {\n const newChatsById = global.chats.byId;\n const newUsersById = global.users.byId;\n const newNotifySettings = selectNotifySettings(global);\n const newNotifyExceptions = selectNotifyExceptions(global);\n const folderSummaries = Object.values(prepared.folderSummariesById);\n const affectedFolderIds = new Set<number>();\n\n const newAllFolderListIds = global.chats.listIds.active;\n const newArchivedFolderListIds = global.chats.listIds.archived;\n let allIds = [...newAllFolderListIds || [], ...newArchivedFolderListIds || []];\n if (newAllFolderListIds !== prevAllFolderListIds || newArchivedFolderListIds !== prevArchivedFolderListIds) {\n allIds = unique(allIds.concat(prevAllFolderListIds || [], prevArchivedFolderListIds || []));\n }\n\n allIds.forEach((chatId) => {\n const chat = newChatsById[chatId];\n\n if (\n !areFoldersChanged\n && !areNotifySettingsChanged\n && !areNotifyExceptionsChanged\n && chat === prevGlobal.chatsById[chatId]\n && newUsersById[chatId] === prevGlobal.usersById[chatId]\n ) {\n return;\n }\n\n let newFolderIds: number[];\n if (chat) {\n const currentSummary = prepared.chatSummariesById.get(chatId);\n const newSummary = buildChatSummary(chat, newNotifySettings, newNotifyExceptions, newUsersById[chatId]);\n if (!areFoldersChanged && currentSummary && arePropsShallowEqual(newSummary, currentSummary)) {\n return;\n }\n\n prepared.chatSummariesById.set(chatId, newSummary);\n\n newFolderIds = buildChatFolderIds(newSummary, folderSummaries);\n newFolderIds.forEach((folderId) => {\n affectedFolderIds.add(folderId);\n });\n } else {\n prepared.chatSummariesById.delete(chatId);\n newFolderIds = [];\n }\n\n const currentFolderIds = prepared.folderIdsByChatId[chatId] || [];\n if (areSortedArraysEqual(newFolderIds, currentFolderIds)) {\n return;\n }\n\n const deletedFolderIds = updateListsForChat(chatId, currentFolderIds, newFolderIds);\n deletedFolderIds.forEach((folderId) => {\n affectedFolderIds.add(folderId);\n });\n });\n\n prevGlobal.chatsById = newChatsById;\n prevGlobal.usersById = newUsersById;\n prevGlobal.notifySettings = newNotifySettings;\n prevGlobal.notifyExceptions = newNotifyExceptions;\n\n return Array.from(affectedFolderIds);\n}\n\nfunction buildChatSummary(\n chat: ApiChat,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n user?: ApiUser,\n): ChatSummary {\n const {\n id, type, lastMessage, isRestricted, isNotJoined, folderId,\n unreadCount, unreadMentionsCount, hasUnreadMark,\n joinDate, draftDate,\n } = chat;\n\n const userInfo = type === 'chatTypePrivate' && user;\n\n return {\n id,\n type,\n isListed: Boolean(lastMessage && !isRestricted && !isNotJoined),\n isArchived: folderId === ARCHIVED_FOLDER_ID,\n isMuted: selectIsChatMuted(chat, notifySettings, notifyExceptions),\n isUnread: Boolean(unreadCount || unreadMentionsCount || hasUnreadMark),\n unreadCount,\n unreadMentionsCount,\n order: Math.max(joinDate || 0, draftDate || 0, lastMessage?.date || 0),\n isUserBot: userInfo ? userInfo.type === 'userTypeBot' : undefined,\n isUserContact: userInfo ? userInfo.isContact : undefined,\n };\n}\n\nfunction buildChatFolderIds(chatSummary: ChatSummary, folderSummaries: FolderSummary[]) {\n return folderSummaries.reduce<number[]>((acc, folderSummary) => {\n if (isChatInFolder(chatSummary, folderSummary)) {\n acc.push(folderSummary.id);\n }\n\n return acc;\n }, []).sort();\n}\n\nfunction isChatInFolder(\n chatSummary: ChatSummary,\n folderSummary: FolderSummary,\n) {\n if (!chatSummary.isListed) {\n return false;\n }\n\n const { id: chatId, type } = chatSummary;\n\n if (folderSummary.listIds) {\n if (\n (chatSummary.isArchived && folderSummary.id === ALL_FOLDER_ID)\n || (!chatSummary.isArchived && folderSummary.id === ARCHIVED_FOLDER_ID)\n ) {\n return false;\n }\n\n return folderSummary.listIds.has(chatId);\n }\n\n if (folderSummary.excludedChatIds?.has(chatId)) {\n return false;\n }\n\n if (folderSummary.includedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folderSummary.pinnedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folderSummary.excludeArchived && chatSummary.isArchived) {\n return false;\n }\n\n if (folderSummary.excludeRead && !chatSummary.isUnread) {\n return false;\n }\n\n if (folderSummary.excludeMuted && chatSummary.isMuted && !chatSummary.unreadMentionsCount) {\n return false;\n }\n\n if (type === 'chatTypePrivate') {\n if (chatSummary.isUserBot) {\n if (folderSummary.bots) {\n return true;\n }\n } else {\n if (folderSummary.contacts && chatSummary.isUserContact) {\n return true;\n }\n\n if (folderSummary.nonContacts && !chatSummary.isUserContact) {\n return true;\n }\n }\n } else if (type === 'chatTypeChannel') {\n return Boolean(folderSummary.channels);\n } else if (type === 'chatTypeBasicGroup' || type === 'chatTypeSuperGroup') {\n return Boolean(folderSummary.groups);\n }\n\n return false;\n}\n\nfunction updateListsForChat(chatId: string, currentFolderIds: number[], newFolderIds: number[]) {\n const currentFolderIdsSet = new Set(currentFolderIds);\n const newFolderIdsSet = new Set(newFolderIds);\n const deletedFolderIds: number[] = [];\n\n unique([...currentFolderIds, ...newFolderIds]).forEach((folderId) => {\n let currentFolderOrderedIds = results.orderedIdsByFolderId[folderId];\n\n if (currentFolderIdsSet.has(folderId) && !newFolderIdsSet.has(folderId)) {\n prepared.chatIdsByFolderId[folderId]!.delete(chatId);\n\n deletedFolderIds.push(folderId);\n\n if (currentFolderOrderedIds) {\n currentFolderOrderedIds = currentFolderOrderedIds.filter((id) => id !== chatId);\n prepared.isOrderedListJustPatched[folderId] = true;\n }\n } else if (!currentFolderIdsSet.has(folderId) && newFolderIdsSet.has(folderId)) {\n if (!prepared.chatIdsByFolderId[folderId]) {\n prepared.chatIdsByFolderId[folderId] = new Set();\n }\n\n prepared.chatIdsByFolderId[folderId]!.add(chatId);\n\n if (currentFolderOrderedIds) {\n currentFolderOrderedIds.push(chatId);\n prepared.isOrderedListJustPatched[folderId] = true;\n }\n }\n\n results.orderedIdsByFolderId[folderId] = currentFolderOrderedIds;\n });\n\n prepared.folderIdsByChatId[chatId] = newFolderIds;\n\n return deletedFolderIds;\n}\n\nfunction updateResults(affectedFolderIds: number[]) {\n let wasUnreadCountersChanged = false;\n let wasChatsCountChanged = false;\n\n Array.from(affectedFolderIds).forEach((folderId) => {\n const { pinnedCount: newPinnedCount, orderedIds: newOrderedIds } = buildFolderOrderedIds(folderId);\n // When signed out\n if (!newOrderedIds) {\n return;\n }\n\n const currentOrderedIds = results.orderedIdsByFolderId[folderId];\n const currentPinnedCount = results.pinnedCountByFolderId[folderId];\n const areOrderedIdsChanged = (\n !currentOrderedIds\n || currentPinnedCount === undefined || currentPinnedCount !== newPinnedCount\n || prepared.isOrderedListJustPatched[folderId]\n || !areSortedArraysEqual(newOrderedIds, currentOrderedIds)\n );\n if (areOrderedIdsChanged) {\n prepared.isOrderedListJustPatched[folderId] = false;\n results.orderedIdsByFolderId[folderId] = newOrderedIds;\n results.pinnedCountByFolderId[folderId] = newPinnedCount;\n callbacks.orderedIdsByFolderId[folderId]?.runCallbacks(newOrderedIds);\n }\n\n const currentChatsCount = results.chatsCountByFolderId[folderId];\n const newChatsCount = newOrderedIds.length;\n if (!wasChatsCountChanged) {\n wasChatsCountChanged = currentChatsCount !== newChatsCount;\n }\n results.chatsCountByFolderId[folderId] = newChatsCount;\n\n const currentUnreadCounters = results.unreadCountersByFolderId[folderId];\n const newUnreadCounters = buildFolderUnreadCounters(folderId);\n if (!wasUnreadCountersChanged) {\n wasUnreadCountersChanged = (\n !currentUnreadCounters || !arePropsShallowEqual(newUnreadCounters, currentUnreadCounters)\n );\n }\n results.unreadCountersByFolderId[folderId] = newUnreadCounters;\n });\n\n if (wasChatsCountChanged) {\n // We need to update the entire object as it will be returned from a hook\n const newValue = { ...results.chatsCountByFolderId };\n results.chatsCountByFolderId = newValue;\n callbacks.chatsCountByFolderId.runCallbacks(newValue);\n }\n\n if (wasUnreadCountersChanged) {\n // We need to update the entire object as it will be returned from a hook\n const newValue = { ...results.unreadCountersByFolderId };\n results.unreadCountersByFolderId = newValue;\n callbacks.unreadCountersByFolderId.runCallbacks(newValue);\n }\n}\n\nfunction buildFolderOrderedIds(folderId: number) {\n const folderSummary = prepared.folderSummariesById[folderId];\n if (!folderSummary) {\n return {};\n }\n\n const { orderedPinnedIds, pinnedChatIds } = folderSummary;\n const {\n chatSummariesById,\n chatIdsByFolderId: { [folderId]: chatIds },\n } = prepared;\n const {\n orderedIdsByFolderId: { [folderId]: prevOrderedIds },\n } = results;\n\n const sortedPinnedIds = chatIds ? orderedPinnedIds?.filter((id) => chatIds.has(id)) : orderedPinnedIds;\n const allListIds = prevOrderedIds || (chatIds && Array.from(chatIds)) || [];\n const notPinnedIds = pinnedChatIds ? allListIds.filter((id) => !pinnedChatIds.has(id)) : allListIds;\n const sortedNotPinnedIds = notPinnedIds.sort((chatId1: string, chatId2: string) => {\n return chatSummariesById.get(chatId2)!.order - chatSummariesById.get(chatId1)!.order;\n });\n\n return {\n pinnedCount: sortedPinnedIds?.length || 0,\n orderedIds: [\n ...(sortedPinnedIds || []),\n ...sortedNotPinnedIds,\n ],\n };\n}\n\nfunction buildFolderUnreadCounters(folderId: number) {\n const {\n chatSummariesById,\n } = prepared;\n const {\n orderedIdsByFolderId: { [folderId]: orderedIds },\n } = results;\n\n return orderedIds!.reduce((newUnreadCounters, chatId) => {\n const chatSummary = chatSummariesById.get(chatId);\n if (!chatSummary) {\n return newUnreadCounters;\n }\n\n if (chatSummary.isUnread) {\n newUnreadCounters.chatsCount++;\n\n if (chatSummary.unreadMentionsCount) {\n newUnreadCounters.notificationsCount += chatSummary.unreadMentionsCount;\n }\n\n if (!chatSummary.isMuted) {\n if (chatSummary.unreadCount) {\n newUnreadCounters.notificationsCount += chatSummary.unreadCount;\n } else if (!chatSummary.unreadMentionsCount) {\n newUnreadCounters.notificationsCount += 1; // Manually marked unread\n }\n }\n }\n\n return newUnreadCounters;\n }, {\n chatsCount: 0,\n notificationsCount: 0,\n });\n}\n\nfunction buildInitials() {\n return {\n prevGlobal: {\n foldersById: {},\n chatsById: {},\n usersById: {},\n notifySettings: {} as NotifySettings,\n notifyExceptions: {},\n },\n\n prepared: {\n folderSummariesById: {},\n chatSummariesById: new Map(),\n folderIdsByChatId: {},\n chatIdsByFolderId: {},\n isOrderedListJustPatched: {},\n },\n\n results: {\n orderedIdsByFolderId: {},\n pinnedCountByFolderId: {},\n chatsCountByFolderId: {},\n unreadCountersByFolderId: {},\n },\n\n callbacks: {\n orderedIdsByFolderId: {},\n chatsCountByFolderId: createCallbackManager(),\n unreadCountersByFolderId: createCallbackManager(),\n },\n };\n}\n\nfunction reset() {\n const newInitials = buildInitials();\n\n prevGlobal = newInitials.prevGlobal;\n prepared = newInitials.prepared;\n results = newInitials.results;\n callbacks = newInitials.callbacks;\n}\n","import { LangCode } from '../types';\n\nexport function formatCurrency(totalPrice: number, currency?: string, locale: LangCode = 'en') {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(currency === 'JPY' ? totalPrice : totalPrice / 100);\n}\n","const generateIdFor = (store: AnyLiteral) => {\n let id;\n\n do {\n id = String(Math.random()).replace('0.', 'id');\n } while (store.hasOwnProperty(id));\n\n return id;\n};\n\nexport default generateIdFor;\n","import { ApiError, ApiFieldError } from '../api/types';\n\nconst READABLE_ERROR_MESSAGES: Record<string, string> = {\n CHAT_RESTRICTED: 'You can\\'t send messages in this chat, you were restricted',\n CHAT_WRITE_FORBIDDEN: 'You can\\'t write in this chat',\n CHAT_SEND_POLL_FORBIDDEN: 'You can\\'t create polls in this chat',\n CHAT_SEND_STICKERS_FORBIDDEN: 'You can\\'t send stickers in this chat',\n CHAT_SEND_GIFS_FORBIDDEN: 'You can\\'t send gifs in this chat',\n CHAT_SEND_MEDIA_FORBIDDEN: 'You can\\'t send media in this chat',\n CHAT_LINK_EXISTS: 'The chat is public, you can\\'t hide the history to new users',\n // eslint-disable-next-line max-len\n SLOWMODE_WAIT_X: 'Slowmode is enabled in this chat: you must wait for the specified number of seconds before sending another message to the chat.',\n USER_BANNED_IN_CHANNEL: 'You\\'re banned from sending messages in supergroups / channels',\n USER_IS_BLOCKED: 'You were blocked by this user',\n YOU_BLOCKED_USER: 'You blocked this user',\n IMAGE_PROCESS_FAILED: 'Failure while processing image',\n MEDIA_EMPTY: 'The provided media object is invalid',\n MEDIA_INVALID: 'Media invalid',\n PHOTO_EXT_INVALID: 'The extension of the photo is invalid',\n PHOTO_INVALID_DIMENSIONS: 'The photo dimensions are invalid',\n PHOTO_SAVE_FILE_INVALID: 'Internal issues, try again later',\n // eslint-disable-next-line max-len\n MESSAGE_DELETE_FORBIDDEN: 'You can\\'t delete one of the messages you tried to delete, most likely because it is a service message.',\n MESSAGE_POLL_CLOSED: 'Poll closed',\n MESSAGE_EDIT_TIME_EXPIRED: 'You can\\'t edit this message anymore.',\n CHAT_ADMIN_REQUIRED: 'You must be an admin in this chat to do this',\n PINNED_DIALOGS_TOO_MUCH: 'Sorry, you can only pin 5 chats to the top',\n DIALOG_FILTERS_TOO_MUCH: 'Sorry, you can\\'t have more than 10 folders',\n CHANNEL_PRIVATE: 'This channel is private',\n MEDIA_CAPTION_TOO_LONG: 'The provided caption is too long',\n ADDRESS_STREET_LINE1_INVALID: 'The address you provided is not valid',\n ADDRESS_STREET_LINE2_INVALID: 'The address you provided is not valid',\n ADDRESS_CITY_INVALID: 'The city you provided is not valid',\n ADDRESS_COUNTRY_INVALID: 'The country you provided is not valid',\n ADDRESS_POSTCODE_INVALID: 'The postcode you provided is not valid',\n ADDRESS_STATE_INVALID: 'The state you provided is not valid',\n REQ_INFO_NAME_INVALID: 'The name you provided is not valid',\n REQ_INFO_PHONE_INVALID: 'The phone you provided is not valid',\n REQ_INFO_EMAIL_INVALID: 'The email you provided is not valid',\n // TODO Bring back after fixing the weird bug\n // CHANNEL_INVALID: 'An error occurred. Please try again later',\n LINK_NOT_MODIFIED: 'This discussion is already linked to the channel',\n MESSAGE_TOO_LONG: 'Message is too long',\n\n // Non-API errors\n // eslint-disable-next-line max-len\n SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Streaming media may not be supported. Try reloading the page without holding <Shift> key',\n // eslint-disable-next-line max-len\n MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS: 'The provided message is too long. Please remove {EXTRA_CHARS_COUNT} character{PLURAL_S}.',\n // eslint-disable-next-line max-len\n FRESH_RESET_AUTHORISATION_FORBIDDEN: 'You cant logout other sessions if less than 24 hours have passed since you logged on the current session',\n\n BOTS_TOO_MUCH: 'There are too many bots in this chat/channel',\n BOT_GROUPS_BLOCKED: 'This bot can\\'t be added to groups',\n USERS_TOO_MUCH: 'The maximum number of users has been exceeded',\n USER_CHANNELS_TOO_MUCH: 'One of the users you tried to add is already in too many channels/supergroups',\n USER_KICKED: 'This user was kicked from this supergroup/channel',\n USER_NOT_MUTUAL_CONTACT: 'The provided user is not a mutual contact',\n USER_PRIVACY_RESTRICTED: 'The user\\'s privacy settings do not allow you to do this',\n INVITE_HASH_EMPTY: 'The invite hash is empty',\n INVITE_HASH_EXPIRED: 'The invite link has expired',\n INVITE_HASH_INVALID: 'The invite hash is invalid',\n CHANNELS_TOO_MUCH: 'You have joined too many channels/supergroups',\n USER_ALREADY_PARTICIPANT: 'You already in the group',\n SCHEDULE_DATE_INVALID: 'Invalid schedule date provided',\n WALLPAPER_DIMENSIONS_INVALID: 'The wallpaper dimensions are invalid, please select another file',\n ADMINS_TOO_MUCH: 'There are too many admins',\n ADMIN_RANK_EMOJI_NOT_ALLOWED: 'An admin rank cannot contain emojis',\n ADMIN_RANK_INVALID: 'The specified admin rank is invalid',\n FRESH_CHANGE_ADMINS_FORBIDDEN: 'You were just elected admin, you can\\'t add or modify other admins yet',\n INPUT_USER_DEACTIVATED: 'The specified user was deleted',\n};\n\nexport const SHIPPING_ERRORS: Record<string, ApiFieldError> = {\n ADDRESS_STREET_LINE1_INVALID: {\n field: 'streetLine1',\n message: 'Incorrect street address',\n },\n ADDRESS_STREET_LINE2_INVALID: {\n field: 'streetLine2',\n message: 'Incorrect street address',\n },\n ADDRESS_CITY_INVALID: {\n field: 'city',\n message: 'Incorrect city',\n },\n ADDRESS_COUNTRY_INVALID: {\n field: 'countryIso2',\n message: 'Incorrect country',\n },\n ADDRESS_POSTCODE_INVALID: {\n field: 'postCode',\n message: 'Incorrect post code',\n },\n ADDRESS_STATE_INVALID: {\n field: 'state',\n message: 'Incorrect state',\n },\n REQ_INFO_NAME_INVALID: {\n field: 'fullName',\n message: 'Incorrect name',\n },\n REQ_INFO_PHONE_INVALID: {\n field: 'phone',\n message: 'Incorrect phone',\n },\n REQ_INFO_EMAIL_INVALID: {\n field: 'email',\n message: 'Incorrect email',\n },\n};\n\nexport default function getReadableErrorText(error: ApiError) {\n const { message, isSlowMode, textParams } = error;\n // Currently, Telegram API doesn't return `SLOWMODE_WAIT_X` error as described in the docs\n if (isSlowMode) {\n const extraPartIndex = message.indexOf(' (caused by');\n return extraPartIndex > 0 ? message.substring(0, extraPartIndex) : message;\n }\n let errorMessage = READABLE_ERROR_MESSAGES[message];\n if (errorMessage && textParams) {\n errorMessage = Object.keys(textParams).reduce((acc, current) => {\n return acc.replace(current, textParams[current]);\n }, errorMessage as string);\n }\n return errorMessage;\n}\n\nexport function getShippingError(error: ApiError): ApiFieldError | undefined {\n return SHIPPING_ERRORS[error.message];\n}\n","import { DEBUG_ALERT_MSG } from '../config';\nimport { throttle } from './schedulers';\n\nwindow.addEventListener('error', handleErrorEvent);\nwindow.addEventListener('unhandledrejection', handleErrorEvent);\n\n// eslint-disable-next-line prefer-destructuring\nconst APP_ENV = process.env.APP_ENV;\n\nfunction handleErrorEvent(e: ErrorEvent | PromiseRejectionEvent) {\n e.preventDefault();\n\n handleError(e instanceof ErrorEvent ? e.error : e.reason);\n}\n\nconst throttledAlert = throttle(window.alert, 1000);\n\nexport function handleError(err: Error) {\n // eslint-disable-next-line no-console\n console.error(err);\n\n if (APP_ENV === 'development' || APP_ENV === 'staging') {\n throttledAlert(`${DEBUG_ALERT_MSG}\\n\\n${(err?.message) || err}\\n${err?.stack}`);\n }\n}\n","type CollectionByKey<Member> = Record<number | string, Member>;\n\ntype OrderDirection =\n 'asc'\n | 'desc';\n\ninterface OrderCallback<T> {\n (member: T): any;\n}\n\nexport function buildCollectionByKey<T extends AnyLiteral>(collection: T[], key: keyof T) {\n return collection.reduce((byKey: CollectionByKey<T>, member: T) => {\n byKey[member[key]] = member;\n\n return byKey;\n }, {});\n}\n\nexport function mapValues<R extends any, M extends any>(\n byKey: CollectionByKey<M>,\n callback: (member: M, key: string, index: number, originalByKey: CollectionByKey<M>) => R,\n): CollectionByKey<R> {\n return Object.keys(byKey).reduce((newByKey: CollectionByKey<R>, key, index) => {\n newByKey[key] = callback(byKey[key], key, index, byKey);\n return newByKey;\n }, {});\n}\n\nexport function pick<T, K extends keyof T>(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n result[key] = object[key];\n return result;\n }, {} as Pick<T, K>);\n}\n\nexport function pickTruthy<T, K extends keyof T>(object: T, keys: K[]) {\n return keys.reduce((result, key) => {\n if (object[key]) {\n result[key] = object[key];\n }\n\n return result;\n }, {} as Pick<T, K>);\n}\n\nexport function omit<T, K extends keyof T>(object: T, keys: K[]) {\n const stringKeys = new Set(keys.map(String));\n const savedKeys = Object.keys(object)\n .filter((key) => !stringKeys.has(key)) as Array<Exclude<keyof T, K>>;\n\n return pick(object, savedKeys);\n}\n\nexport function orderBy<T>(\n collection: T[],\n orderRule: (keyof T) | OrderCallback<T> | ((keyof T) | OrderCallback<T>)[],\n mode: OrderDirection | [OrderDirection, OrderDirection] = 'asc',\n): T[] {\n function compareValues(a: T, b: T, currentOrderRule: (keyof T) | OrderCallback<T>, isAsc: boolean) {\n const aValue = (typeof currentOrderRule === 'function' ? currentOrderRule(a) : a[currentOrderRule]) || 0;\n const bValue = (typeof currentOrderRule === 'function' ? currentOrderRule(b) : b[currentOrderRule]) || 0;\n\n return isAsc ? aValue - bValue : bValue - aValue;\n }\n\n if (Array.isArray(orderRule)) {\n const [mode1, mode2] = Array.isArray(mode) ? mode : [mode, mode];\n const [orderRule1, orderRule2] = orderRule;\n const isAsc1 = mode1 === 'asc';\n const isAsc2 = mode2 === 'asc';\n\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule1, isAsc1) || compareValues(a, b, orderRule2, isAsc2);\n });\n }\n\n const isAsc = mode === 'asc';\n return collection.sort((a, b) => {\n return compareValues(a, b, orderRule, isAsc);\n });\n}\n\nexport function flatten(array: any[]) {\n return array.reduce((result, member) => {\n if (Array.isArray(member)) {\n return result.concat(member);\n } else {\n result.push(member);\n return result;\n }\n }, []);\n}\n\nexport function unique<T extends any>(array: T[]): T[] {\n return Array.from(new Set(array));\n}\n\nexport function compact<T extends any>(array: T[]) {\n return array.filter(Boolean);\n}\n\nexport function areSortedArraysEqual(array1: any[], array2: any[]) {\n if (array1.length !== array2.length) {\n return false;\n }\n\n return array1.every((item, i) => item === array2[i]);\n}\n\nexport function areSortedArraysIntersecting(array1: any[], array2: any[]) {\n return array1[0] <= array2[array2.length - 1] && array1[array1.length - 1] >= array2[0];\n}\n\nexport function findIntersectionWithSet<T>(array: T[], set: Set<T>): T[] {\n return array.filter((a) => set.has(a));\n}\n\nexport function split(array: any[], chunkSize: number) {\n const result = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n result.push(array.slice(i, i + chunkSize));\n }\n\n return result;\n}\n\nexport function cloneDeep<T>(value: T): T {\n if (typeof value !== 'object') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map(cloneDeep) as typeof value;\n }\n\n return Object.keys(value).reduce((acc, key) => {\n acc[key as keyof T] = cloneDeep(value[key as keyof T]);\n return acc;\n }, {} as T);\n}\n\nexport function findLast<T>(array: Array<T>, predicate: (value: T, index: number, obj: T[]) => boolean): T | undefined {\n let cursor = array.length;\n\n while (cursor--) {\n if (predicate(array[cursor], cursor, array)) {\n return array[cursor];\n }\n }\n\n return undefined;\n}\n","import { getGlobal } from '../lib/teact/teactn';\n\nimport { ApiLangPack, ApiLangString } from '../api/types';\nimport { LangCode, TimeFormat } from '../types';\n\nimport {\n DEFAULT_LANG_CODE, DEFAULT_LANG_PACK, LANG_CACHE_NAME, LANG_PACKS,\n} from '../config';\nimport * as cacheApi from './cacheApi';\nimport { callApi } from '../api/gramjs';\nimport { createCallbackManager } from './callbacks';\nimport { formatInteger } from './textFormat';\n\ninterface LangFn {\n (key: string, value?: any, format?: 'i'): any;\n\n isRtl?: boolean;\n code?: LangCode;\n timeFormat?: TimeFormat;\n}\n\nconst SUBSTITUTION_REGEX = /%\\d?\\$?[sdf@]/g;\nconst PLURAL_OPTIONS = ['value', 'zeroValue', 'oneValue', 'twoValue', 'fewValue', 'manyValue', 'otherValue'] as const;\nconst PLURAL_RULES = {\n /* eslint-disable max-len */\n en: (n: number) => (n !== 1 ? 6 : 2),\n ar: (n: number) => (n === 0 ? 1 : n === 1 ? 2 : n === 2 ? 3 : n % 100 >= 3 && n % 100 <= 10 ? 4 : n % 100 >= 11 ? 5 : 6),\n ca: (n: number) => (n !== 1 ? 6 : 2),\n de: (n: number) => (n !== 1 ? 6 : 2),\n es: (n: number) => (n !== 1 ? 6 : 2),\n fa: (n: number) => (n > 1 ? 6 : 2),\n fr: (n: number) => (n > 1 ? 6 : 2),\n id: () => 0,\n it: (n: number) => (n !== 1 ? 6 : 2),\n ko: () => 0,\n ms: () => 0,\n nl: (n: number) => (n !== 1 ? 6 : 2),\n pl: (n: number) => (n === 1 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n pt_BR: (n: number) => (n > 1 ? 6 : 2),\n ru: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n tr: (n: number) => (n > 1 ? 6 : 2),\n uk: (n: number) => (n % 10 === 1 && n % 100 !== 11 ? 2 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 4 : 5),\n uz: (n: number) => (n > 1 ? 6 : 2),\n /* eslint-enable max-len */\n};\n\nconst cache = new Map<string, string>();\n\nlet langPack: ApiLangPack | undefined;\nlet fallbackLangPack: ApiLangPack | undefined;\n\nconst {\n addCallback,\n removeCallback,\n runCallbacks,\n} = createCallbackManager();\n\nexport { addCallback, removeCallback };\n\nlet currentLangCode: string | undefined;\nlet currentTimeFormat: TimeFormat | undefined;\n\nexport const getTranslation: LangFn = (key: string, value?: any, format?: 'i') => {\n if (value !== undefined) {\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n const cached = cache.get(`${key}_${cacheValue}_${format}`);\n if (cached) {\n return cached;\n }\n }\n\n if (!langPack && !fallbackLangPack) {\n return key;\n }\n\n const langString = (langPack?.[key]) || (fallbackLangPack?.[key]);\n if (!langString) {\n if (!fallbackLangPack) {\n void importFallbackLangPack();\n }\n\n return key;\n }\n\n return processTranslation(langString, key, value, format);\n};\n\nexport async function getTranslationForLangString(langCode: string, key: string) {\n let translateString: ApiLangString | undefined = await cacheApi.fetch(\n LANG_CACHE_NAME,\n `${DEFAULT_LANG_PACK}_${langCode}_${key}`,\n cacheApi.Type.Json,\n );\n\n if (!translateString) {\n translateString = await fetchRemoteString(DEFAULT_LANG_PACK, langCode, key);\n }\n\n return processTranslation(translateString, key);\n}\n\nexport async function setLanguage(langCode: LangCode, callback?: NoneToVoidFunction, withFallback = false) {\n if (langPack && langCode === currentLangCode) {\n if (callback) {\n callback();\n }\n\n return;\n }\n\n let newLangPack = await cacheApi.fetch(LANG_CACHE_NAME, langCode, cacheApi.Type.Json);\n if (!newLangPack) {\n if (withFallback) {\n await importFallbackLangPack();\n }\n\n newLangPack = await fetchRemote(langCode);\n if (!newLangPack) {\n return;\n }\n }\n\n cache.clear();\n\n currentLangCode = langCode;\n langPack = newLangPack;\n document.documentElement.lang = langCode;\n\n const { languages, timeFormat } = getGlobal().settings.byKey;\n const langInfo = languages?.find((l) => l.langCode === langCode);\n getTranslation.isRtl = Boolean(langInfo?.rtl);\n getTranslation.code = langCode;\n getTranslation.timeFormat = timeFormat;\n\n if (callback) {\n callback();\n }\n\n runCallbacks();\n}\n\nexport function setTimeFormat(timeFormat: TimeFormat) {\n if (timeFormat && timeFormat === currentTimeFormat) {\n return;\n }\n\n currentTimeFormat = timeFormat;\n getTranslation.timeFormat = timeFormat;\n\n runCallbacks();\n}\n\nasync function importFallbackLangPack() {\n if (fallbackLangPack) {\n return;\n }\n\n fallbackLangPack = (await import('./fallbackLangPack')).default;\n runCallbacks();\n}\n\nasync function fetchRemote(langCode: string): Promise<ApiLangPack | undefined> {\n const remote = await callApi('fetchLangPack', { sourceLangPacks: LANG_PACKS, langCode });\n if (remote) {\n await cacheApi.save(LANG_CACHE_NAME, langCode, remote.langPack);\n return remote.langPack;\n }\n\n return undefined;\n}\n\nasync function fetchRemoteString(\n remoteLangPack: typeof LANG_PACKS[number], langCode: string, key: string,\n): Promise<ApiLangString | undefined> {\n const remote = await callApi('fetchLangStrings', {\n langPack: remoteLangPack,\n langCode,\n keys: [key],\n });\n\n if (remote?.length) {\n await cacheApi.save(LANG_CACHE_NAME, `${remoteLangPack}_${langCode}_${key}`, remote[0]);\n\n return remote[0];\n }\n\n return undefined;\n}\n\nfunction getPluralOption(amount: number) {\n const langCode = currentLangCode || DEFAULT_LANG_CODE;\n const optionIndex = PLURAL_RULES[langCode as keyof typeof PLURAL_RULES]\n ? PLURAL_RULES[langCode as keyof typeof PLURAL_RULES](amount)\n : 0;\n\n return PLURAL_OPTIONS[optionIndex];\n}\n\nfunction processTemplate(template: string, value: any) {\n value = Array.isArray(value) ? value : [value];\n const translationSlices = template.split(SUBSTITUTION_REGEX);\n const initialValue = translationSlices.shift();\n\n return translationSlices.reduce((result, str, index) => {\n return `${result}${String(value[index] || '')}${str}`;\n }, initialValue || '');\n}\n\nfunction processTranslation(langString: ApiLangString | undefined, key: string, value?: any, format?: 'i') {\n const template = langString ? langString[typeof value === 'number' ? getPluralOption(value) : 'value'] : undefined;\n if (!template || !template.trim()) {\n const parts = key.split('.');\n\n return parts[parts.length - 1];\n }\n\n if (value !== undefined) {\n const formattedValue = format === 'i' ? formatInteger(value) : value;\n const result = processTemplate(template, formattedValue);\n const cacheValue = Array.isArray(value) ? JSON.stringify(value) : value;\n cache.set(`${key}_${cacheValue}_${format}`, result);\n return result;\n }\n\n return template;\n}\n","const SAMPLE_RATE = 48000;\nconst BIT_DEPTH = 16;\n\nexport async function oggToWav(opusData: Blob): Promise<Blob> {\n const arrayBuffer = await new Response(opusData).arrayBuffer();\n\n return new Promise((resolve) => {\n const typedArray = new Uint8Array(arrayBuffer);\n\n let decoderWorker: Worker | undefined = new Worker(\n new URL('opus-recorder/dist/decoderWorker.min.js', import.meta.url),\n );\n let wavWorker: Worker | undefined = new Worker(new URL('opus-recorder/dist/waveWorker.min.js', import.meta.url));\n\n decoderWorker.onmessage = (e) => {\n // eslint-disable-next-line no-null/no-null\n if (e.data === null) {\n // `null` means decoder is finished\n wavWorker!.postMessage({ command: 'done' });\n } else {\n // `e.data` contains decoded buffers as float32 values\n wavWorker!.postMessage(\n {\n command: 'encode',\n buffers: e.data,\n },\n e.data.map(({ buffer }: Float32Array) => buffer),\n );\n }\n };\n\n wavWorker.onmessage = (e) => {\n if (e.data.message === 'page') {\n resolve(new Blob([e.data.page], { type: 'audio/wav' }));\n\n decoderWorker!.terminate();\n decoderWorker = undefined;\n wavWorker!.terminate();\n wavWorker = undefined;\n }\n };\n\n wavWorker.postMessage({\n command: 'init',\n wavBitDepth: BIT_DEPTH,\n wavSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'init',\n decoderSampleRate: SAMPLE_RATE,\n outputBufferSampleRate: SAMPLE_RATE,\n });\n\n decoderWorker.postMessage({\n command: 'decode',\n pages: typedArray,\n }, [typedArray.buffer]);\n });\n}\n","import {\n ApiMediaFormat,\n ApiOnProgress,\n ApiParsedMedia,\n ApiPreparedMedia,\n} from '../api/types';\n\nimport {\n DEBUG, MEDIA_CACHE_DISABLED, MEDIA_CACHE_NAME, MEDIA_CACHE_NAME_AVATARS,\n} from '../config';\nimport { callApi, cancelApiProgress } from '../api/gramjs';\nimport * as cacheApi from './cacheApi';\nimport { fetchBlob } from './files';\nimport { IS_OPUS_SUPPORTED, IS_PROGRESSIVE_SUPPORTED, isWebpSupported } from './environment';\nimport { oggToWav } from './oggToWav';\nimport { webpToPng } from './webpToPng';\n\nconst asCacheApiType = {\n [ApiMediaFormat.BlobUrl]: cacheApi.Type.Blob,\n [ApiMediaFormat.Lottie]: cacheApi.Type.Blob,\n [ApiMediaFormat.Progressive]: undefined,\n [ApiMediaFormat.Stream]: undefined,\n};\n\nconst PROGRESSIVE_URL_PREFIX = './progressive/';\n\nconst memoryCache = new Map<string, ApiPreparedMedia>();\nconst fetchPromises = new Map<string, Promise<ApiPreparedMedia | undefined>>();\nconst progressCallbacks = new Map<string, Map<string, ApiOnProgress>>();\nconst cancellableCallbacks = new Map<string, ApiOnProgress>();\n\nexport function fetch<T extends ApiMediaFormat>(\n url: string,\n mediaFormat: T,\n isHtmlAllowed = false,\n onProgress?: ApiOnProgress,\n callbackUniqueId?: string,\n): Promise<ApiPreparedMedia> {\n if (mediaFormat === ApiMediaFormat.Progressive) {\n return (\n IS_PROGRESSIVE_SUPPORTED\n ? getProgressive(url)\n : fetch(url, ApiMediaFormat.BlobUrl, isHtmlAllowed, onProgress, callbackUniqueId)\n ) as Promise<ApiPreparedMedia>;\n }\n\n if (!fetchPromises.has(url)) {\n const promise = fetchFromCacheOrRemote(url, mediaFormat, isHtmlAllowed)\n .catch((err) => {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn(err);\n }\n\n return undefined;\n })\n .finally(() => {\n fetchPromises.delete(url);\n progressCallbacks.delete(url);\n cancellableCallbacks.delete(url);\n });\n\n fetchPromises.set(url, promise);\n }\n\n if (onProgress && callbackUniqueId) {\n let activeCallbacks = progressCallbacks.get(url);\n if (!activeCallbacks) {\n activeCallbacks = new Map<string, ApiOnProgress>();\n progressCallbacks.set(url, activeCallbacks);\n }\n activeCallbacks.set(callbackUniqueId, onProgress);\n }\n\n return fetchPromises.get(url) as Promise<ApiPreparedMedia>;\n}\n\nexport function getFromMemory(url: string) {\n return memoryCache.get(url) as ApiPreparedMedia;\n}\n\nexport function cancelProgress(progressCallback: ApiOnProgress) {\n progressCallbacks.forEach((map, url) => {\n map.forEach((callback) => {\n if (callback === progressCallback) {\n const parentCallback = cancellableCallbacks.get(url);\n if (!parentCallback) return;\n\n cancelApiProgress(parentCallback);\n cancellableCallbacks.delete(url);\n progressCallbacks.delete(url);\n }\n });\n });\n}\n\nexport function removeCallback(url: string, callbackUniqueId: string) {\n const callbacks = progressCallbacks.get(url);\n if (!callbacks) return;\n callbacks.delete(callbackUniqueId);\n}\n\nfunction getProgressive(url: string) {\n const progressiveUrl = `${PROGRESSIVE_URL_PREFIX}${url}`;\n\n memoryCache.set(url, progressiveUrl);\n\n return Promise.resolve(progressiveUrl);\n}\n\nasync function fetchFromCacheOrRemote(\n url: string, mediaFormat: ApiMediaFormat, isHtmlAllowed: boolean,\n) {\n if (!MEDIA_CACHE_DISABLED) {\n const cacheName = url.startsWith('avatar') ? MEDIA_CACHE_NAME_AVATARS : MEDIA_CACHE_NAME;\n const cached = await cacheApi.fetch(cacheName, url, asCacheApiType[mediaFormat]!, isHtmlAllowed);\n\n if (cached) {\n let media = cached;\n\n if (cached.type === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n media = await oggToWav(media);\n }\n\n if (cached.type === 'image/webp' && !isWebpSupported() && media) {\n const mediaPng = await webpToPng(url, media);\n if (mediaPng) {\n media = mediaPng;\n }\n }\n\n const prepared = prepareMedia(media);\n\n memoryCache.set(url, prepared);\n\n return prepared;\n }\n }\n\n if (mediaFormat === ApiMediaFormat.Stream) {\n const mediaSource = new MediaSource();\n const streamUrl = URL.createObjectURL(mediaSource);\n let isOpen = false;\n\n mediaSource.addEventListener('sourceopen', () => {\n if (isOpen) {\n return;\n }\n isOpen = true;\n\n const sourceBuffer = mediaSource.addSourceBuffer('audio/mpeg');\n\n const onProgress = makeOnProgress(url, mediaSource, sourceBuffer);\n cancellableCallbacks.set(url, onProgress);\n\n void callApi('downloadMedia', { url, mediaFormat }, onProgress);\n });\n\n memoryCache.set(url, streamUrl);\n return streamUrl;\n }\n\n const onProgress = makeOnProgress(url);\n cancellableCallbacks.set(url, onProgress);\n\n const remote = await callApi('downloadMedia', { url, mediaFormat, isHtmlAllowed }, onProgress);\n if (!remote) {\n throw new Error(`Failed to fetch media ${url}`);\n }\n\n let { prepared, mimeType } = remote;\n\n if (mimeType === 'audio/ogg' && !IS_OPUS_SUPPORTED) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await oggToWav(blob);\n prepared = prepareMedia(media);\n mimeType = media.type;\n }\n\n if (mimeType === 'image/webp' && !isWebpSupported()) {\n const blob = await fetchBlob(prepared as string);\n URL.revokeObjectURL(prepared as string);\n const media = await webpToPng(url, blob);\n if (media) {\n prepared = prepareMedia(media);\n }\n }\n\n memoryCache.set(url, prepared);\n\n return prepared;\n}\n\nfunction makeOnProgress(url: string, mediaSource?: MediaSource, sourceBuffer?: SourceBuffer) {\n const onProgress: ApiOnProgress = (progress: number, arrayBuffer: ArrayBuffer) => {\n progressCallbacks.get(url)?.forEach((callback) => {\n callback(progress);\n if (callback.isCanceled) onProgress.isCanceled = true;\n });\n\n if (progress === 1) {\n mediaSource?.endOfStream();\n }\n\n if (!arrayBuffer) {\n return;\n }\n\n sourceBuffer?.appendBuffer(arrayBuffer);\n };\n\n return onProgress;\n}\n\nfunction prepareMedia(mediaData: Exclude<ApiParsedMedia, ArrayBuffer>): ApiPreparedMedia {\n if (mediaData instanceof Blob) {\n return URL.createObjectURL(mediaData);\n }\n\n return mediaData;\n}\n\nif (IS_PROGRESSIVE_SUPPORTED) {\n navigator.serviceWorker.addEventListener('message', async (e) => {\n const { type, messageId, params } = e.data as {\n type: string;\n messageId: string;\n params: { url: string; start: number; end: number };\n };\n\n if (type !== 'requestPart') {\n return;\n }\n\n const result = await callApi('downloadMedia', { mediaFormat: ApiMediaFormat.Progressive, ...params });\n if (!result) {\n return;\n }\n\n const { arrayBuffer, mimeType, fullSize } = result;\n\n navigator.serviceWorker.controller!.postMessage({\n type: 'partResponse',\n messageId,\n result: {\n arrayBuffer,\n mimeType,\n fullSize,\n },\n }, [arrayBuffer!]);\n });\n}\n","export const MEMO_EMPTY_ARRAY = [];\n","import { DEBUG } from '../config';\nimport { createCallbackManager } from './callbacks';\n\nexport enum Bundles {\n Auth,\n Main,\n Extra,\n Calls,\n}\n\ninterface ImportedBundles {\n [Bundles.Auth]: typeof import('../bundles/auth');\n [Bundles.Main]: typeof import('../bundles/main');\n [Bundles.Extra]: typeof import('../bundles/extra');\n [Bundles.Calls]: typeof import('../bundles/calls');\n}\n\ntype BundlePromises = {\n [K in keyof ImportedBundles]: Promise<ImportedBundles[K]>\n};\n\nexport type BundleModules<B extends keyof ImportedBundles> = keyof ImportedBundles[B];\n\nconst LOAD_PROMISES: Partial<BundlePromises> = {};\nconst MEMORY_CACHE: Partial<ImportedBundles> = {};\n\nconst { addCallback, runCallbacks } = createCallbackManager();\n\nexport async function loadModule<B extends Bundles, M extends BundleModules<B>>(bundleName: B, moduleName: M) {\n if (!LOAD_PROMISES[bundleName]) {\n switch (bundleName) {\n case Bundles.Auth:\n LOAD_PROMISES[Bundles.Auth] = import('../bundles/auth');\n break;\n case Bundles.Main:\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START LOAD MAIN BUNDLE');\n }\n\n LOAD_PROMISES[Bundles.Main] = import('../bundles/main');\n break;\n case Bundles.Extra:\n LOAD_PROMISES[Bundles.Extra] = import('../bundles/extra');\n break;\n case Bundles.Calls:\n LOAD_PROMISES[Bundles.Calls] = import('../bundles/calls');\n break;\n }\n\n (LOAD_PROMISES[bundleName] as Promise<ImportedBundles[B]>).then(runCallbacks);\n }\n\n const bundle = (await LOAD_PROMISES[bundleName]) as unknown as ImportedBundles[B];\n\n if (!MEMORY_CACHE[bundleName]) {\n MEMORY_CACHE[bundleName] = bundle;\n }\n\n return getModuleFromMemory(bundleName, moduleName);\n}\n\nexport function getModuleFromMemory<B extends Bundles, M extends BundleModules<B>>(bundleName: B, moduleName: M) {\n const bundle = MEMORY_CACHE[bundleName] as ImportedBundles[B];\n\n if (!bundle) {\n return undefined;\n }\n\n return bundle[moduleName];\n}\n\nexport const addLoadListener = addCallback;\n","import { callApi } from '../api/gramjs';\nimport {\n ApiChat, ApiMediaFormat, ApiMessage, ApiUser,\n} from '../api/types';\nimport { renderActionMessageText } from '../components/common/helpers/renderActionMessageText';\nimport { DEBUG, IS_TEST } from '../config';\nimport { getDispatch, getGlobal, setGlobal } from '../lib/teact/teactn';\nimport {\n getChatAvatarHash,\n getChatTitle,\n getMessageAction,\n getMessageSenderName,\n getMessageSummaryText,\n getPrivateChatUserId,\n isActionMessage,\n isChatChannel,\n selectIsChatMuted, selectShouldShowMessagePreview,\n} from '../modules/helpers';\nimport { getTranslation } from './langProvider';\nimport { addNotifyExceptions, replaceSettings } from '../modules/reducers';\nimport {\n selectChatMessage, selectNotifyExceptions, selectNotifySettings, selectUser,\n} from '../modules/selectors';\nimport { IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport * as mediaLoader from './mediaLoader';\nimport { debounce } from './schedulers';\n\nfunction getDeviceToken(subscription: PushSubscription) {\n const data = subscription.toJSON();\n return JSON.stringify({\n endpoint: data.endpoint,\n keys: data.keys,\n });\n}\n\nfunction checkIfPushSupported() {\n if (!IS_SERVICE_WORKER_SUPPORTED) return false;\n if (!('showNotification' in ServiceWorkerRegistration.prototype)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push notifications aren\\'t supported.');\n }\n return false;\n }\n\n // Check the current Notification permission.\n // If its denied, it's a permanent block until the\n // user changes the permission\n if (Notification.permission === 'denied') {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n\n // Check if push messaging is supported\n if (!('PushManager' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Push messaging isn\\'t supported.');\n }\n return false;\n }\n return true;\n}\n\nfunction checkIfNotificationsSupported() {\n // Let's check if the browser supports notifications\n if (!('Notification' in window)) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] This browser does not support desktop notification');\n }\n return false;\n }\n\n if (Notification.permission === 'denied' as NotificationPermission) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n return false;\n }\n return true;\n}\n\nconst expirationTime = 12 * 60 * 60 * 1000; // 12 hours\n// Notification id is removed from soundPlayed cache after 3 seconds\nconst soundPlayedDelay = 3 * 1000;\nconst soundPlayedIds = new Set<string>();\n\nexport async function playNotifySound(id?: string, volume?: number) {\n if (id !== undefined && soundPlayedIds.has(id)) return;\n const { notificationSoundVolume } = selectNotifySettings(getGlobal());\n const currentVolume = volume ? volume / 10 : notificationSoundVolume / 10;\n if (currentVolume === 0) return;\n\n const audio = new Audio('./notification.mp3');\n audio.volume = currentVolume;\n audio.setAttribute('mozaudiochannel', 'notification');\n if (id !== undefined) {\n audio.addEventListener('ended', () => {\n soundPlayedIds.add(id);\n }, { once: true });\n\n setTimeout(() => {\n soundPlayedIds.delete(id);\n }, soundPlayedDelay);\n }\n\n try {\n await audio.play();\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] Unable to play notification sound');\n }\n }\n}\n\nexport const playNotifySoundDebounced = debounce(playNotifySound, 1000, true, false);\n\nfunction checkIfShouldResubscribe(subscription: PushSubscription | null) {\n const global = getGlobal();\n if (!global.push || !subscription) return true;\n if (getDeviceToken(subscription) !== global.push.deviceToken) return true;\n return Date.now() - global.push.subscribedAt > expirationTime;\n}\n\nasync function requestPermission() {\n if (!('Notification' in window)) return;\n if (!['granted', 'denied'].includes(Notification.permission)) {\n await Notification.requestPermission();\n }\n}\n\nasync function unsubscribeFromPush(subscription: PushSubscription | null) {\n const global = getGlobal();\n const dispatch = getDispatch();\n if (subscription) {\n try {\n const deviceToken = getDeviceToken(subscription);\n await callApi('unregisterDevice', deviceToken);\n await subscription.unsubscribe();\n dispatch.deleteDeviceToken();\n return;\n } catch (error) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to unsubscribe from push.', error);\n }\n }\n }\n if (global.push) {\n await callApi('unregisterDevice', global.push.deviceToken);\n dispatch.deleteDeviceToken();\n }\n}\n\nexport async function unsubscribe() {\n if (!checkIfPushSupported()) return;\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n const subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n await unsubscribeFromPush(subscription);\n}\n\n// Indicates if notification settings are loaded from the api\nlet areSettingsLoaded = false;\n\n// Load notification settings from the api\nasync function loadNotificationSettings() {\n if (areSettingsLoaded) return selectNotifySettings(getGlobal());\n const [resultSettings, resultExceptions] = await Promise.all([\n callApi('fetchNotificationSettings', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n callApi('fetchNotificationExceptions', {\n serverTimeOffset: getGlobal().serverTimeOffset,\n }),\n ]);\n if (!resultSettings) return selectNotifySettings(getGlobal());\n\n let global = replaceSettings(getGlobal(), resultSettings);\n if (resultExceptions) {\n global = addNotifyExceptions(global, resultExceptions);\n }\n setGlobal(global);\n areSettingsLoaded = true;\n return selectNotifySettings(global);\n}\n\nexport async function subscribe() {\n if (!checkIfPushSupported()) {\n // Ask for notification permissions only if service worker notifications are not supported\n // As pushManager.subscribe automatically triggers permission popup\n await requestPermission();\n return;\n }\n const serviceWorkerRegistration = await navigator.serviceWorker.ready;\n let subscription = await serviceWorkerRegistration.pushManager.getSubscription();\n if (!checkIfShouldResubscribe(subscription)) return;\n await unsubscribeFromPush(subscription);\n try {\n subscription = await serviceWorkerRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n });\n const deviceToken = getDeviceToken(subscription);\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[PUSH] Received push subscription: ', deviceToken);\n }\n await callApi('registerDevice', deviceToken);\n getDispatch()\n .setDeviceToken(deviceToken);\n } catch (error: any) {\n if (Notification.permission === 'denied' as NotificationPermission) {\n // The user denied the notification permission which\n // means we failed to subscribe and the user will need\n // to manually change the notification permission to\n // subscribe to push messages\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('[PUSH] The user has blocked push notifications.');\n }\n } else if (DEBUG) {\n // A problem occurred with the subscription, this can\n // often be down to an issue or lack of the gcm_sender_id\n // and / or gcm_user_visible_only\n // eslint-disable-next-line no-console\n console.log('[PUSH] Unable to subscribe to push.', error);\n\n // Request permissions and fall back to local notifications\n // if pushManager.subscribe was aborted due to invalid VAPID key.\n if (error.code === DOMException.ABORT_ERR) {\n await requestPermission();\n }\n }\n }\n}\n\nfunction checkIfShouldNotify(chat: ApiChat) {\n if (!areSettingsLoaded) return false;\n const global = getGlobal();\n const isMuted = selectIsChatMuted(chat, selectNotifySettings(global), selectNotifyExceptions(global));\n if (isMuted || chat.isNotJoined || !chat.isListed) {\n return false;\n }\n\n return !document.hasFocus();\n}\n\nfunction getNotificationContent(chat: ApiChat, message: ApiMessage) {\n const global = getGlobal();\n const {\n senderId,\n replyToMessageId,\n } = message;\n\n const messageSender = senderId ? selectUser(global, senderId) : undefined;\n const messageAction = getMessageAction(message as ApiMessage);\n const actionTargetMessage = messageAction && replyToMessageId\n ? selectChatMessage(global, chat.id, replyToMessageId)\n : undefined;\n const {\n targetUserIds: actionTargetUserIds,\n targetChatId: actionTargetChatId,\n } = messageAction || {};\n\n const actionTargetUsers = actionTargetUserIds\n ? actionTargetUserIds.map((userId) => selectUser(global, userId))\n .filter<ApiUser>(Boolean as any)\n : undefined;\n const privateChatUserId = getPrivateChatUserId(chat);\n const privateChatUser = privateChatUserId ? selectUser(global, privateChatUserId) : undefined;\n\n let body: string;\n if (selectShouldShowMessagePreview(chat, selectNotifySettings(global), selectNotifyExceptions(global))) {\n if (isActionMessage(message)) {\n const isChat = chat && (isChatChannel(chat) || message.senderId === message.chatId);\n\n body = renderActionMessageText(\n getTranslation,\n message,\n !isChat ? messageSender : undefined,\n isChat ? chat : undefined,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlainText: true },\n ) as string;\n } else {\n const senderName = getMessageSenderName(getTranslation, chat.id, messageSender);\n const summary = getMessageSummaryText(getTranslation, message);\n\n body = senderName ? `${senderName}: ${summary}` : summary;\n }\n } else {\n body = 'New message';\n }\n\n return {\n title: getChatTitle(getTranslation, chat, privateChatUser),\n body,\n };\n}\n\nasync function getAvatar(chat: ApiChat) {\n const imageHash = getChatAvatarHash(chat);\n if (!imageHash) return undefined;\n let mediaData = mediaLoader.getFromMemory(imageHash);\n if (!mediaData) {\n await mediaLoader.fetch(imageHash, ApiMediaFormat.BlobUrl);\n mediaData = mediaLoader.getFromMemory(imageHash);\n }\n return mediaData;\n}\n\nexport async function notifyAboutNewMessage({\n chat,\n message,\n}: { chat: ApiChat; message: Partial<ApiMessage> }) {\n const { hasWebNotifications } = await loadNotificationSettings();\n if (!checkIfShouldNotify(chat)) return;\n const areNotificationsSupported = checkIfNotificationsSupported();\n if (!hasWebNotifications || !areNotificationsSupported) {\n // only play sound if web notifications are disabled\n playNotifySoundDebounced(String(message.id) || chat.id);\n return;\n }\n if (!areNotificationsSupported) return;\n if (!message.id) return;\n\n const {\n title,\n body,\n } = getNotificationContent(chat, message as ApiMessage);\n\n const icon = await getAvatar(chat);\n\n if (checkIfPushSupported()) {\n if (navigator.serviceWorker?.controller) {\n // notify service worker about new message notification\n navigator.serviceWorker.controller.postMessage({\n type: 'newMessageNotification',\n payload: {\n title,\n body,\n icon,\n chatId: chat.id,\n messageId: message.id,\n },\n });\n }\n } else {\n const dispatch = getDispatch();\n const options: NotificationOptions = {\n body,\n icon,\n badge: icon,\n tag: String(message.id),\n };\n\n if ('vibrate' in navigator) {\n options.vibrate = [200, 100, 200];\n }\n\n const notification = new Notification(title, options);\n\n notification.onclick = () => {\n notification.close();\n dispatch.focusMessage({\n chatId: chat.id,\n messageId: message.id,\n });\n if (window.focus) {\n window.focus();\n }\n };\n\n // Play sound when notification is displayed\n notification.onshow = () => {\n playNotifySoundDebounced(String(message.id) || chat.id);\n };\n }\n}\n\nexport function closeMessageNotifications(payload: { chatId: string; lastReadInboxMessageId?: number }) {\n if (IS_TEST || !navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'closeMessageNotifications',\n payload,\n });\n}\n\n// Notify service worker that client is fully loaded\nexport function notifyClientReady() {\n if (!navigator.serviceWorker?.controller) return;\n navigator.serviceWorker.controller.postMessage({\n type: 'clientReady',\n });\n}\n","const PERMANENT_VERSION_KEY = 'kz_version';\nconst AVAILABLE_VERSIONS = ['Z', 'K'] as const;\nconst DEFAULT_VERSION = 'Z';\n\nexport function setPermanentWebVersion(version: typeof AVAILABLE_VERSIONS[number]) {\n localStorage.setItem(PERMANENT_VERSION_KEY, JSON.stringify(version));\n}\n\nexport function ensurePermanentWebVersion() {\n if (!hasPermanentWebVersion()) {\n setPermanentWebVersion(DEFAULT_VERSION);\n }\n}\n\nfunction hasPermanentWebVersion() {\n const json = localStorage.getItem(PERMANENT_VERSION_KEY);\n if (!json) {\n return false;\n }\n\n try {\n const version = JSON.parse(json);\n return AVAILABLE_VERSIONS.includes(version);\n } catch (err) {\n return false;\n }\n}\n","import { ApiCountryCode } from '../api/types';\nimport { flatten } from './iteratees';\n\nconst PATTERN_PLACEHOLDER = 'X';\nconst DEFAULT_PATTERN = 'XXX XXX XXX XXX';\n\nexport function getCountryCodesByIso(phoneCodeList: ApiCountryCode[], iso: string) {\n return phoneCodeList.filter((country) => country.iso2 === iso);\n}\n\nexport function getCountryFromPhoneNumber(phoneCodeList: ApiCountryCode[], input = '') {\n let phoneNumber = input.replace(/[^\\d+]+/g, '');\n if (phoneNumber.startsWith('+')) {\n phoneNumber = phoneNumber.substr(1);\n }\n\n const possibleCountries = phoneCodeList\n .filter((country) => phoneNumber.startsWith(country.countryCode));\n const codesWithPrefix: { code: string; country: ApiCountryCode }[] = flatten(possibleCountries\n .map((country) => (country.prefixes || ['']).map((prefix) => {\n return {\n code: `${country.countryCode}${prefix}`,\n country,\n };\n })));\n\n const bestMatches = codesWithPrefix\n .filter(({ code }) => phoneNumber.startsWith(code))\n .sort((a, b) => a.code.length - b.code.length);\n\n return bestMatches[bestMatches.length - 1]?.country;\n}\n\nexport function formatPhoneNumber(input: string, country?: ApiCountryCode) {\n let phoneNumber = input.replace(/[^\\d]+/g, '');\n if (country) {\n phoneNumber = phoneNumber.substr(country.countryCode.length);\n } else if (input.startsWith('+')) {\n return input;\n }\n const pattern = getBestPattern(phoneNumber, country?.patterns);\n\n const result: string[] = []; // Result character array\n let j = 0; // Position inside pattern\n for (let i = 0; i < phoneNumber.length; i++) {\n while (pattern[j] !== PATTERN_PLACEHOLDER && j < pattern.length) {\n result.push(pattern[j]);\n if (pattern[j] === phoneNumber[i]) { // If pattern contains digits, move input position too\n i++;\n if (i === phoneNumber.length) break; // But don't overdo it, or it will insert full pattern unexpectedly\n }\n j++;\n }\n\n result.push(phoneNumber[i]); // For placeholder characters, setting current input digit\n j++;\n }\n\n return result.join('');\n}\n\nfunction getBestPattern(numberWithoutCode: string, patterns?: string[]) {\n if (!patterns || patterns.length === 0) return DEFAULT_PATTERN;\n if (patterns.length === 1) return patterns[0];\n\n const defaultPattern = patterns.find((pattern) => pattern.startsWith(PATTERN_PLACEHOLDER)) || DEFAULT_PATTERN;\n\n const bestMatches = patterns.filter((pattern) => {\n const stripped = pattern.replace(/[^\\dX]+/g, '');\n if (stripped.startsWith(PATTERN_PLACEHOLDER)) return false; // Don't consider default number format here\n for (let i = 0; i < numberWithoutCode.length; i++) {\n if (i > stripped.length - 1 || (stripped[i] !== PATTERN_PLACEHOLDER && stripped[i] !== numberWithoutCode[i])) {\n return false;\n }\n }\n return true;\n });\n\n // Playing it safe: if not sure, use default for that region\n return bestMatches.length === 1 ? bestMatches[0] : defaultPattern;\n}\n\nexport function formatPhoneNumberWithCode(phoneCodeList: ApiCountryCode[], phoneNumber: string) {\n const numberWithPlus = phoneNumber.startsWith('+') ? phoneNumber : `+${phoneNumber}`;\n const country = getCountryFromPhoneNumber(phoneCodeList, numberWithPlus);\n if (!country) {\n return numberWithPlus;\n }\n return `+${country.countryCode} ${formatPhoneNumber(numberWithPlus, country)}`;\n}\n","import { MessageList, MessageListType } from '../global/types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { LOCATION_HASH } from '../hooks/useHistoryBack';\n\nexport function createMessageHash(messageList: MessageList) {\n const typeOrThreadId = messageList.type !== 'thread' ? (\n `_${messageList.type}`\n ) : messageList.threadId !== -1 ? (\n `_${messageList.threadId}`\n ) : '';\n\n return `${messageList.chatId}${typeOrThreadId}`;\n}\n\nexport function parseLocationHash() {\n if (!LOCATION_HASH) return undefined;\n\n const [chatId, typeOrThreadId] = LOCATION_HASH.replace(/^#/, '').split('_');\n if (!chatId?.match(/^-?\\d+$/)) return undefined;\n\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId,\n type: Boolean(typeOrThreadId) && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: Boolean(typeOrThreadId) && !isType ? Number(typeOrThreadId) : MAIN_THREAD_ID,\n };\n}\n","type Scheduler =\n typeof requestAnimationFrame\n | typeof onTickEnd\n | typeof runNow;\n\nexport function debounce<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true,\n) {\n let waitingTimeout: number | undefined;\n\n return (...args: Parameters<F>) => {\n if (waitingTimeout) {\n clearTimeout(waitingTimeout);\n waitingTimeout = undefined;\n } else if (shouldRunFirst) {\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n waitingTimeout = self.setTimeout(() => {\n if (shouldRunLast) {\n fn(...args);\n }\n\n waitingTimeout = undefined;\n }, ms);\n };\n}\n\nexport function throttle<F extends AnyToVoidFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n) {\n let interval: number | undefined;\n let isPending: boolean;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n isPending = true;\n args = _args;\n\n if (!interval) {\n if (shouldRunFirst) {\n isPending = false;\n fn(...args);\n }\n\n // eslint-disable-next-line no-restricted-globals\n interval = self.setInterval(() => {\n if (!isPending) {\n // eslint-disable-next-line no-restricted-globals\n self.clearInterval(interval!);\n interval = undefined;\n return;\n }\n\n isPending = false;\n fn(...args);\n }, ms);\n }\n };\n}\n\nexport function throttleWithRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n\nexport function throttleWithPrimaryRaf<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(fastRafPrimary, fn);\n}\n\nexport function throttleWithTickEnd<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow<F extends AnyToVoidFunction>(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function throttleWith<F extends AnyToVoidFunction>(schedulerFn: Scheduler, fn: F) {\n let waiting = false;\n let args: Parameters<F>;\n\n return (..._args: Parameters<F>) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n fn(...args);\n });\n }\n };\n}\n\nexport function onIdle(cb: NoneToVoidFunction, timeout?: number) {\n // eslint-disable-next-line no-restricted-globals\n if (self.requestIdleCallback) {\n // eslint-disable-next-line no-restricted-globals\n self.requestIdleCallback(cb, { timeout });\n } else {\n onTickEnd(cb);\n }\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n}\n\nexport const pause = (ms: number) => new Promise<void>((resolve) => {\n setTimeout(() => resolve(), ms);\n});\n\nexport function rafPromise() {\n return new Promise<void>((resolve) => {\n fastRaf(resolve);\n });\n}\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nlet fastRafPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\n// May result in an immediate execution if called from another `requestAnimationFrame` callback\nexport function fastRaf(callback: NoneToVoidFunction, isPrimary = false) {\n if (!fastRafCallbacks) {\n fastRafCallbacks = isPrimary ? [] : [callback];\n fastRafPrimaryCallbacks = isPrimary ? [callback] : [];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n const currentPrimaryCallbacks = fastRafPrimaryCallbacks!;\n fastRafCallbacks = undefined;\n fastRafPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n fastRafPrimaryCallbacks!.push(callback);\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nexport function fastRafPrimary(callback: NoneToVoidFunction) {\n fastRaf(callback, true);\n}\n\nlet onTickEndCallbacks: NoneToVoidFunction[] | undefined;\nlet onTickEndPrimaryCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onTickEnd(callback: NoneToVoidFunction, isPrimary = false) {\n if (!onTickEndCallbacks) {\n onTickEndCallbacks = isPrimary ? [] : [callback];\n onTickEndPrimaryCallbacks = isPrimary ? [callback] : [];\n\n Promise.resolve().then(() => {\n const currentCallbacks = onTickEndCallbacks!;\n const currentPrimaryCallbacks = onTickEndPrimaryCallbacks!;\n onTickEndCallbacks = undefined;\n onTickEndPrimaryCallbacks = undefined;\n currentPrimaryCallbacks.forEach((cb) => cb());\n currentCallbacks.forEach((cb) => cb());\n });\n } else if (isPrimary) {\n onTickEndPrimaryCallbacks!.push(callback);\n } else {\n onTickEndCallbacks.push(callback);\n }\n}\n\nexport function onTickEndPrimary(callback: NoneToVoidFunction) {\n onTickEnd(callback, true);\n}\n\nlet beforeUnloadCallbacks: NoneToVoidFunction[] | undefined;\n\nexport function onBeforeUnload(callback: NoneToVoidFunction, isLast = false) {\n if (!beforeUnloadCallbacks) {\n beforeUnloadCallbacks = [];\n // eslint-disable-next-line no-restricted-globals\n self.addEventListener('beforeunload', () => {\n beforeUnloadCallbacks!.forEach((cb) => cb());\n });\n }\n\n if (isLast) {\n beforeUnloadCallbacks.push(callback);\n } else {\n beforeUnloadCallbacks.unshift(callback);\n }\n\n return () => {\n beforeUnloadCallbacks = beforeUnloadCallbacks!.filter((cb) => cb !== callback);\n };\n}\n","let RE_NOT_LETTER: RegExp;\n\ntry {\n RE_NOT_LETTER = new RegExp('[^\\\\p{L}\\\\p{M}]+', 'ui');\n} catch (e) {\n // Support for older versions of firefox\n RE_NOT_LETTER = new RegExp('[^\\\\wа-яё]+', 'i');\n}\n\nexport default function searchWords(haystack: string, needle: string | string[]) {\n if (!haystack || !needle) {\n return false;\n }\n\n const needleWords = typeof needle === 'string' ? needle.toLowerCase().split(RE_NOT_LETTER) : needle;\n const haystackLower = haystack.toLowerCase();\n\n // @optimization\n if (needleWords.length === 1 && !haystackLower.includes(needleWords[0])) {\n return false;\n }\n\n let haystackWords: string[];\n\n return needleWords.every((needleWord) => {\n if (!haystackLower.includes(needleWord)) {\n return false;\n }\n\n if (!haystackWords) {\n haystackWords = haystackLower.split(RE_NOT_LETTER);\n }\n\n return haystackWords.some((haystackWord) => haystackWord.startsWith(needleWord));\n });\n}\n\nexport function prepareSearchWordsForNeedle(needle: string) {\n const needleWords = needle.toLowerCase().split(RE_NOT_LETTER);\n\n return (haystack: string) => searchWords(haystack, needleWords);\n}\n","export const getServerTime = (serverTimeOffset: number) => {\n return Math.floor(Date.now() / 1000) + serverTimeOffset;\n};\n","import safariFix from 'safari-14-idb-fix';\n\nfunction promisifyRequest(request) {\n return new Promise((resolve, reject) => {\n // @ts-ignore - file size hacks\n request.oncomplete = request.onsuccess = () => resolve(request.result);\n // @ts-ignore - file size hacks\n request.onabort = request.onerror = () => reject(request.error);\n });\n}\nfunction createStore(dbName, storeName) {\n const dbp = safariFix().then(() => {\n const request = indexedDB.open(dbName);\n request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n return promisifyRequest(request);\n });\n return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n if (!defaultGetStoreFunc) {\n defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n }\n return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.put(value, key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n entries.forEach((entry) => store.put(entry[1], entry[0]));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => \n // Need to create the promise manually.\n // If I try to chain promises, the transaction closes in browsers\n // that use a promise polyfill (IE10/11).\n new Promise((resolve, reject) => {\n store.get(key).onsuccess = function () {\n try {\n store.put(updater(this.result), key);\n resolve(promisifyRequest(store.transaction));\n }\n catch (err) {\n reject(err);\n }\n };\n }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.delete(key);\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n keys.forEach((key) => store.delete(key));\n return promisifyRequest(store.transaction);\n });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n return customStore('readwrite', (store) => {\n store.clear();\n return promisifyRequest(store.transaction);\n });\n}\nfunction eachCursor(store, callback) {\n store.openCursor().onsuccess = function () {\n if (!this.result)\n return;\n callback(this.result);\n this.result.continue();\n };\n return promisifyRequest(store.transaction);\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAllKeys) {\n return promisifyRequest(store.getAllKeys());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.key)).then(() => items);\n });\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n if (store.getAll) {\n return promisifyRequest(store.getAll());\n }\n const items = [];\n return eachCursor(store, (cursor) => items.push(cursor.value)).then(() => items);\n });\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n return customStore('readonly', (store) => {\n // Fast path for modern browsers\n // (although, hopefully we'll get a simpler path some day)\n if (store.getAll && store.getAllKeys) {\n return Promise.all([\n promisifyRequest(store.getAllKeys()),\n promisifyRequest(store.getAll()),\n ]).then(([keys, values]) => keys.map((key, i) => [key, values[i]]));\n }\n const items = [];\n return customStore('readonly', (store) => eachCursor(store, (cursor) => items.push([cursor.key, cursor.value])).then(() => items));\n });\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import * as idb from 'idb-keyval';\n\nimport { ApiSessionData } from '../api/types';\n\nimport { DEBUG, LEGACY_SESSION_KEY, SESSION_USER_KEY } from '../config';\nimport * as cacheApi from './cacheApi';\n\nconst DC_IDS = [1, 2, 3, 4, 5];\n\nexport function hasStoredSession(withLegacy = false) {\n if (withLegacy && localStorage.getItem(LEGACY_SESSION_KEY)) {\n return true;\n }\n\n const userAuthJson = localStorage.getItem(SESSION_USER_KEY);\n if (!userAuthJson) return false;\n\n try {\n const userAuth = JSON.parse(userAuthJson);\n return Boolean(userAuth && userAuth.id && userAuth.dcID);\n } catch (err) {\n // Do nothing.\n return false;\n }\n}\n\nexport function storeSession(sessionData: ApiSessionData, currentUserId?: string) {\n const { mainDcId, keys, hashes } = sessionData;\n\n localStorage.setItem(SESSION_USER_KEY, JSON.stringify({ dcID: mainDcId, id: currentUserId }));\n localStorage.setItem('dc', String(mainDcId));\n Object.keys(keys).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_auth_key`, JSON.stringify(keys[dcId]));\n });\n\n if (hashes) {\n Object.keys(hashes).map(Number).forEach((dcId) => {\n localStorage.setItem(`dc${dcId}_hash`, JSON.stringify(hashes[dcId]));\n });\n }\n}\n\nexport function clearStoredSession() {\n [\n SESSION_USER_KEY,\n 'dc',\n ...DC_IDS.map((dcId) => `dc${dcId}_auth_key`),\n ...DC_IDS.map((dcId) => `dc${dcId}_hash`),\n ].forEach((key) => {\n localStorage.removeItem(key);\n });\n}\n\nexport function loadStoredSession(): ApiSessionData | undefined {\n if (!hasStoredSession()) {\n return undefined;\n }\n\n const userAuth = JSON.parse(localStorage.getItem(SESSION_USER_KEY)!);\n const mainDcId = Number(userAuth.dcID);\n const keys: Record<number, string> = {};\n const hashes: Record<number, string> = {};\n\n DC_IDS.forEach((dcId) => {\n try {\n const key = localStorage.getItem(`dc${dcId}_auth_key`);\n if (key) {\n keys[dcId] = JSON.parse(key);\n }\n\n const hash = localStorage.getItem(`dc${dcId}_hash`);\n if (hash) {\n hashes[dcId] = JSON.parse(hash);\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load stored session', err);\n }\n // Do nothing.\n }\n });\n\n if (!Object.keys(keys).length) return undefined;\n\n return {\n mainDcId,\n keys,\n hashes,\n };\n}\n\nexport async function importLegacySession() {\n const sessionId = localStorage.getItem(LEGACY_SESSION_KEY);\n if (!sessionId) return;\n\n const sessionJson = await idb.get(`GramJs:${sessionId}`);\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData;\n storeSession(sessionData);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load legacy session', err);\n }\n // Do nothing.\n }\n}\n\n// Remove previously created IndexedDB and cache API sessions\nexport async function clearLegacySessions() {\n localStorage.removeItem(LEGACY_SESSION_KEY);\n\n const idbKeys = await idb.keys();\n\n await Promise.all<Promise<any>>([\n cacheApi.clear('GramJs'),\n ...idbKeys\n .filter((k) => typeof k === 'string' && k.startsWith('GramJs:GramJs-session-'))\n .map((k) => idb.del(k)),\n ]);\n}\n\nexport function importTestSession() {\n const sessionJson = process.env.TEST_SESSION!;\n try {\n const sessionData = JSON.parse(sessionJson) as ApiSessionData & { userId: string };\n storeSession(sessionData, sessionData.userId);\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.warn('Failed to load test session', err);\n }\n // Do nothing.\n }\n}\n","import { ISettings } from '../types';\n\nimport { animateSingle } from './animation';\nimport { fastRaf } from './schedulers';\n\nimport themeColors from '../styles/themes.json';\n\ntype RGBAColor = {\n r: number;\n g: number;\n b: number;\n a?: number;\n};\n\nlet isInitialized = false;\n\nconst HEX_COLOR_REGEX = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})?$/i;\nconst DURATION_MS = 200;\nconst ENABLE_ANIMATION_DELAY_MS = 500;\nconst RGB_VARIABLES = new Set([\n '--color-primary-shade',\n '--color-text-secondary',\n]);\n\nconst lerp = (start: number, end: number, interpolationRatio: number) => {\n return (1 - interpolationRatio) * start + interpolationRatio * end;\n};\n\nconst colors = (Object.keys(themeColors) as Array<keyof typeof themeColors>).map((property) => ({\n property,\n colors: [hexToRgb(themeColors[property][0]), hexToRgb(themeColors[property][1])],\n}));\n\nconst switchTheme = (theme: ISettings['theme'], withAnimation: boolean) => {\n const isDarkTheme = theme === 'dark';\n const shouldAnimate = isInitialized && withAnimation;\n const startIndex = isDarkTheme ? 0 : 1;\n const endIndex = isDarkTheme ? 1 : 0;\n const startAt = Date.now();\n const themeColorTag = document.querySelector('meta[name=\"theme-color\"]');\n\n document.documentElement.classList.remove(`theme-${isDarkTheme ? 'light' : 'dark'}`);\n if (isInitialized) {\n document.documentElement.classList.add('no-animations');\n }\n document.documentElement.classList.add(`theme-${theme}`);\n if (themeColorTag) {\n themeColorTag.setAttribute('content', isDarkTheme ? '#212121' : '#fff');\n }\n\n setTimeout(() => {\n document.documentElement.classList.remove('no-animations');\n }, ENABLE_ANIMATION_DELAY_MS);\n\n isInitialized = true;\n\n if (shouldAnimate) {\n fastRaf(() => {\n animateSingle(() => {\n const t = Math.min((Date.now() - startAt) / DURATION_MS, 1);\n\n applyColorAnimationStep(startIndex, endIndex, transition(t));\n\n return t < 1;\n });\n });\n } else {\n applyColorAnimationStep(startIndex, endIndex);\n }\n};\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n\nfunction hexToRgb(hex: string): RGBAColor {\n const result = HEX_COLOR_REGEX.exec(hex)!;\n\n return {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n a: result[4] !== undefined ? parseInt(result[4], 16) : undefined,\n };\n}\n\nfunction applyColorAnimationStep(startIndex: number, endIndex: number, interpolationRatio: number = 1) {\n colors.forEach(({ property, colors: propertyColors }) => {\n const r = Math.round(lerp(propertyColors[startIndex].r, propertyColors[endIndex].r, interpolationRatio));\n const g = Math.round(lerp(propertyColors[startIndex].g, propertyColors[endIndex].g, interpolationRatio));\n const b = Math.round(lerp(propertyColors[startIndex].b, propertyColors[endIndex].b, interpolationRatio));\n const a = propertyColors[startIndex].a !== undefined\n ? Math.round(lerp(propertyColors[startIndex].a!, propertyColors[endIndex].a!, interpolationRatio))\n : undefined;\n\n document.documentElement.style.setProperty(property, a !== undefined\n ? `rgba(${r},${g},${b},${a / 255})`\n : `rgb(${r},${g},${b})`);\n\n if (RGB_VARIABLES.has(property)) {\n document.documentElement.style.setProperty(`${property}-rgb`, `${r},${g},${b}`);\n }\n });\n}\n\nexport default switchTheme;\n","import EMOJI_REGEX from '../lib/twemojiRegex';\nimport { fixNonStandardEmoji } from './emoji';\n\nexport function formatInteger(value: number) {\n return String(value).replace(/\\d(?=(\\d{3})+$)/g, '$& ');\n}\n\nfunction formatFixedNumber(number: number) {\n const fixed = String(number.toFixed(1));\n if (fixed.substr(-2) === '.0') {\n return Math.round(number);\n }\n\n return number.toFixed(1).replace('.', ',');\n}\n\nexport function formatIntegerCompact(views: number) {\n if (views < 1e3) {\n return views;\n }\n\n if (views < 1e6) {\n return `${formatFixedNumber(views / 1e3)}K`;\n }\n\n return `${formatFixedNumber(views / 1e6)}M`;\n}\n\nexport function getFirstLetters(phrase: string, count = 2) {\n return phrase\n .replace(/[.,!@#$%^&*()_+=\\-`~[\\]/\\\\{}:\"|<>?]+/gi, '')\n .trim()\n .split(/\\s+/)\n .slice(0, count)\n .map((word: string) => {\n if (!word.length) return '';\n word = fixNonStandardEmoji(word);\n const emojis = word.match(EMOJI_REGEX);\n if (emojis && word.startsWith(emojis[0])) {\n return emojis[0];\n }\n return word.match(/./u)![0].toUpperCase();\n })\n .join('');\n}\n","export default function trimText<T extends string | undefined>(text: T, length?: number) {\n if (!text || !length || text.length <= length) {\n return text;\n }\n\n return `${text.substring(0, length)}...`;\n}\n","import { isWebpSupported } from './environment';\nimport { dataUriToBlob, blobToDataUri } from './files';\nimport { pause } from './schedulers';\n\nconst WORKER_INITIALIZATION_TIMEOUT = 2000;\n\nlet canvas: HTMLCanvasElement;\nlet worker: IWebpWorker;\n\nexport const EMPTY_IMAGE_DATA_URI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk'\n + 'YAAAAAYAAjCB0C8AAAAASUVORK5CYII=';\n\nexport async function webpToPng(url: string, blob: Blob): Promise<Blob | undefined> {\n initWebpWorker();\n\n while (!worker.wasmReady) {\n await pause(WORKER_INITIALIZATION_TIMEOUT);\n }\n\n const { result, width, height } = await getDecodePromise(url, blob);\n if (!width || !height) {\n return undefined;\n }\n\n return createPng({ result, width, height });\n}\n\nexport async function webpToPngBase64(key: string, dataUri: string): Promise<string> {\n if (isWebpSupported() || dataUri.substr(0, 15) !== 'data:image/webp') {\n return dataUri;\n }\n\n initWebpWorker();\n\n const pngBlob = await webpToPng(key, dataUriToBlob(dataUri));\n\n if (!pngBlob) {\n throw new Error(`Can't convert webp to png. Url: ${dataUri}`);\n }\n\n return blobToDataUri(pngBlob);\n}\n\nfunction initWebpWorker() {\n if (!worker) {\n worker = new Worker(new URL('../lib/webp/webp_wasm.worker.js', import.meta.url)) as IWebpWorker;\n worker.wasmReady = false;\n worker.onmessage = handleLibWebpMessage;\n }\n}\n\nfunction createPng({ result, width, height }: TEncodedImage): Promise<Blob | undefined> {\n if (!canvas) {\n canvas = document.createElement('canvas');\n }\n\n return new Promise((resolve) => {\n const img = new ImageData(result, width, height);\n\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.putImageData(img, 0, 0);\n\n canvas.toBlob((blob) => {\n resolve(blob ?? undefined);\n }, 'image/png', 1);\n });\n}\n\nfunction handleLibWebpMessage(e: MessageEvent) {\n const { id } = e.data;\n switch (e.data.type) {\n case 'initialized': {\n worker.wasmReady = true;\n break;\n }\n\n case 'result': {\n if (worker.requests.has(id)) {\n const resolve = worker.requests.get(id)!;\n\n worker.requests.delete(id);\n resolve(e.data!);\n }\n break;\n }\n }\n}\n\nfunction getDecodePromise(url: string, blob: Blob): Promise<TEncodedImage> {\n return new Promise((resolve) => {\n if (!worker.requests) {\n worker.requests = new Map();\n }\n\n worker.requests.set(url, resolve);\n worker.postMessage({ id: url, blob });\n });\n}\n","import { APP_VERSION, DEBUG } from '../config';\nimport { getGlobal } from '../lib/teact/teactn';\nimport { hasStoredSession } from './sessions';\n\nconst WEBSYNC_URLS = [\n 't.me',\n 'telegram.me',\n].map((domain) => `//${domain}/_websync_?`);\nconst WEBSYNC_VERSION = `${APP_VERSION} Z`;\nconst WEBSYNC_KEY = 'tgme_sync';\nconst WEBSYNC_TIMEOUT = 86400;\n\nconst getTs = () => {\n return Math.floor(Number(new Date()) / 1000);\n};\n\nconst saveSync = (authed: boolean) => {\n const ts = getTs();\n localStorage.setItem(WEBSYNC_KEY, JSON.stringify({\n canRedirect: authed,\n ts,\n }));\n};\n\nlet lastTimeout: NodeJS.Timeout | undefined;\n\nexport const forceWebsync = (authed: boolean) => {\n const currentTs = getTs();\n\n const { canRedirect, ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n if (canRedirect !== authed || ts + WEBSYNC_TIMEOUT <= currentTs) {\n return Promise.all(WEBSYNC_URLS.map((url) => {\n return new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n\n const removeElement = () => Boolean(document.body.removeChild(script));\n\n script.src = url + new URLSearchParams({\n authed: Number(authed).toString(),\n version: WEBSYNC_VERSION,\n });\n\n document.body.appendChild(script);\n\n script.onload = () => {\n saveSync(authed);\n removeElement();\n if (lastTimeout) {\n clearTimeout(lastTimeout);\n lastTimeout = undefined;\n }\n startWebsync();\n resolve();\n };\n\n script.onerror = () => {\n removeElement();\n reject();\n };\n });\n }));\n } else {\n return Promise.resolve();\n }\n};\n\nexport function startWebsync() {\n if (DEBUG) {\n return;\n }\n\n if (lastTimeout !== undefined) return;\n const currentTs = getTs();\n\n const { ts } = JSON.parse(localStorage.getItem(WEBSYNC_KEY) || '{}');\n\n const timeout = WEBSYNC_TIMEOUT - (currentTs - ts);\n\n lastTimeout = setTimeout(() => {\n const { authState } = getGlobal();\n\n const authed = authState === 'authorizationStateReady' || hasStoredSession(true);\n forceWebsync(authed);\n }, Math.max(0, timeout * 1000));\n}\n\nexport function clearWebsync() {\n localStorage.removeItem(WEBSYNC_KEY);\n}\n","import { throttle } from './schedulers';\nimport {\n MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT,\n MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH,\n MOBILE_SCREEN_MAX_WIDTH,\n} from '../config';\nimport { IS_IOS, IS_SINGLE_COLUMN_LAYOUT } from './environment';\n\ntype IDimensions = {\n width: number;\n height: number;\n};\n\nconst IS_LANDSCAPE = IS_SINGLE_COLUMN_LAYOUT && isLandscape();\n\nconst initialHeight = window.innerHeight;\nlet currentWindowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n currentWindowSize = updateSizes();\n\n if (!isRefreshDisabled && (\n isMobileScreen() !== IS_SINGLE_COLUMN_LAYOUT\n || (IS_SINGLE_COLUMN_LAYOUT && IS_LANDSCAPE !== isLandscape())\n )) {\n window.location.reload();\n }\n}, 250, true);\n\nwindow.addEventListener('orientationchange', handleResize);\nif (IS_IOS) {\n window.visualViewport.addEventListener('resize', handleResize);\n} else {\n window.addEventListener('resize', handleResize);\n}\n\nexport function updateSizes(): IDimensions {\n let height: number;\n if (IS_IOS) {\n height = window.visualViewport.height + window.visualViewport.pageTop;\n } else {\n height = window.innerHeight;\n }\n const vh = height * 0.01;\n\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n}\n\nfunction isMobileScreen() {\n return currentWindowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n currentWindowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH\n && currentWindowSize.height <= MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT\n );\n}\n\nfunction isLandscape() {\n if (IS_IOS) {\n return window.matchMedia('(orientation: landscape)').matches;\n }\n\n // eslint-disable-next-line max-len\n // Source: https://web.archive.org/web/20160509220835/http://blog.abouthalf.com/development/orientation-media-query-challenges-in-android-browsers/\n // Feature is marked as deprecated now, but it is still supported\n // https://developer.mozilla.org/en-US/docs/Web/CSS/@media/device-aspect-ratio#browser_compatibility\n return window.matchMedia('screen and (min-device-aspect-ratio: 1/1) and (orientation: landscape)').matches;\n}\n\nconst windowSize = {\n get: () => currentWindowSize,\n getIsKeyboardVisible: () => initialHeight > currentWindowSize.height,\n disableRefresh,\n enableRefresh,\n};\n\nexport default windowSize;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"47\":\"6587cf7cd58625267285\",\"99\":\"4acb17d13e1a5b87b131\",\"126\":\"6c11ab2d3cdbd7baf2dd\",\"133\":\"7825bcf69db105db21d4\",\"161\":\"4fade15904bfe66b4f71\",\"302\":\"1d8fb1e8ea7f52fb7236\",\"354\":\"b73ee1ca5b4052509fe6\",\"472\":\"65a66b6c1fb1be8db986\",\"501\":\"3c8f4d2d9fb141fac95f\",\"524\":\"5bc50ddd32084536b8b8\",\"536\":\"ab2a889dae72ec88f68c\",\"538\":\"6bd37e70917b1b6ff08e\",\"626\":\"dd96f6cb20b270561325\",\"640\":\"c329e19eedaf84c239cd\",\"745\":\"cc53f6e29328dbd2c9ff\",\"830\":\"cf4ac714b9e5af5f91a7\",\"915\":\"af01666698d37aea6ce6\",\"941\":\"367e239e47c825643813\",\"993\":\"5065d2f591c9fc4f83b4\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"47\":\"6587cf7cd58625267285\",\"126\":\"6c11ab2d3cdbd7baf2dd\",\"133\":\"7825bcf69db105db21d4\",\"472\":\"65a66b6c1fb1be8db986\",\"538\":\"6bd37e70917b1b6ff08e\",\"640\":\"c329e19eedaf84c239cd\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktelegram_t\"] = self[\"webpackChunktelegram_t\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import { DEBUG, DEBUG_MORE } from '../config';\nimport { getDispatch } from '../lib/teact/teactn';\nimport { IS_ANDROID, IS_IOS, IS_SERVICE_WORKER_SUPPORTED } from './environment';\nimport { notifyClientReady, playNotifySoundDebounced } from './notifications';\n\ntype WorkerAction = {\n type: string;\n payload: Record<string, any>;\n};\n\nfunction handleWorkerMessage(e: MessageEvent) {\n const action: WorkerAction = e.data;\n if (DEBUG_MORE) {\n // eslint-disable-next-line no-console\n console.log('[SW] Message from worker', action);\n }\n if (!action.type) return;\n const dispatch = getDispatch();\n switch (action.type) {\n case 'focusMessage':\n if (dispatch.focusMessage) {\n dispatch.focusMessage(action.payload);\n }\n break;\n case 'playNotificationSound':\n playNotifySoundDebounced(action.payload.id);\n break;\n }\n}\n\nfunction subscribeToWorker() {\n navigator.serviceWorker.removeEventListener('message', handleWorkerMessage);\n navigator.serviceWorker.addEventListener('message', handleWorkerMessage);\n // Notify web worker that client is ready to receive messages\n notifyClientReady();\n}\n\nif (IS_SERVICE_WORKER_SUPPORTED) {\n window.addEventListener('load', async () => {\n try {\n if (!navigator.serviceWorker.controller) {\n const registrations = await navigator.serviceWorker.getRegistrations();\n if (registrations.length) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] Hard reload detected, re-enabling Service Worker');\n }\n await Promise.all(registrations.map(r => r.unregister()));\n }\n }\n\n await navigator.serviceWorker.register(new URL('../serviceWorker.ts', import.meta.url));\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker registered');\n }\n\n await navigator.serviceWorker.ready;\n\n if (navigator.serviceWorker.controller) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('[SW] ServiceWorker ready');\n }\n subscribeToWorker();\n } else {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker not available');\n }\n\n if (!IS_IOS && !IS_ANDROID) {\n getDispatch().showDialog({ data: { message: 'SERVICE_WORKER_DISABLED', hasErrorKey: true } });\n }\n }\n } catch (err) {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.error('[SW] ServiceWorker registration failed: ', err);\n }\n }\n });\n window.addEventListener('focus', async () => {\n await navigator.serviceWorker.ready;\n subscribeToWorker();\n });\n}\n","import { GlobalState } from './types';\nimport { NewChatMembersProgress } from '../types';\n\nimport {\n ANIMATION_LEVEL_DEFAULT, DARK_THEME_PATTERN_COLOR, DEFAULT_MESSAGE_TEXT_SIZE_PX, DEFAULT_PATTERN_COLOR,\n DEFAULT_PLAYBACK_RATE,\n DEFAULT_VOLUME,\n IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX, MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX,\n} from '../config';\nimport { IS_IOS, IS_MAC_OS } from '../util/environment';\n\nexport const INITIAL_STATE: GlobalState = {\n isLeftColumnShown: true,\n isChatInfoShown: false,\n newChatMembersProgress: NewChatMembersProgress.Closed,\n uiReadyState: 0,\n serverTimeOffset: 0,\n\n authRememberMe: true,\n countryList: {\n phoneCodes: [],\n general: [],\n },\n\n blocked: {\n ids: [],\n totalCount: 0,\n },\n\n users: {\n byId: {},\n statusesById: {},\n },\n\n chats: {\n listIds: {},\n isFullyLoaded: {},\n orderedPinnedIds: {},\n totalCount: {},\n byId: {},\n },\n\n messages: {\n byChatId: {},\n messageLists: [],\n sponsoredByChatId: {},\n },\n\n groupCalls: {\n byId: {},\n },\n\n scheduledMessages: {\n byChatId: {},\n },\n\n chatFolders: {\n byId: {},\n activeChatFolder: 0,\n },\n\n fileUploads: {\n byMessageLocalId: {},\n },\n\n recentEmojis: ['grinning', 'kissing_heart', 'christmas_tree', 'brain', 'trophy'],\n\n stickers: {\n setsById: {},\n added: {},\n recent: {\n stickers: [],\n },\n favorite: {\n stickers: [],\n },\n greeting: {\n stickers: [],\n },\n featured: {\n setIds: [],\n },\n search: {},\n forEmoji: {},\n },\n\n emojiKeywords: {},\n\n gifs: {\n saved: {},\n search: {},\n },\n\n inlineBots: {\n isLoading: false,\n byUsername: {},\n },\n\n globalSearch: {},\n\n userSearch: {},\n\n localTextSearch: {\n byChatThreadKey: {},\n },\n\n localMediaSearch: {\n byChatId: {},\n },\n\n management: {\n byChatId: {},\n },\n\n topPeers: {},\n\n topInlineBots: {},\n\n mediaViewer: {},\n\n audioPlayer: {\n volume: DEFAULT_VOLUME,\n playbackRate: DEFAULT_PLAYBACK_RATE,\n isMuted: false,\n },\n\n forwardMessages: {},\n\n pollResults: {},\n\n payment: {},\n\n notifications: [],\n\n dialogs: [],\n\n activeSessions: [],\n\n settings: {\n byKey: {\n theme: 'light',\n shouldUseSystemTheme: true,\n messageTextSize: IS_IOS\n ? IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX\n : (IS_MAC_OS ? MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX : DEFAULT_MESSAGE_TEXT_SIZE_PX),\n animationLevel: ANIMATION_LEVEL_DEFAULT,\n messageSendKeyCombo: 'enter',\n canAutoLoadPhotoFromContacts: true,\n canAutoLoadPhotoInPrivateChats: true,\n canAutoLoadPhotoInGroups: true,\n canAutoLoadPhotoInChannels: true,\n canAutoLoadVideoFromContacts: true,\n canAutoLoadVideoInPrivateChats: true,\n canAutoLoadVideoInGroups: true,\n canAutoLoadVideoInChannels: true,\n canAutoLoadFileFromContacts: false,\n canAutoLoadFileInPrivateChats: false,\n canAutoLoadFileInGroups: false,\n canAutoLoadFileInChannels: false,\n autoLoadFileMaxSizeMb: 10,\n hasWebNotifications: true,\n hasPushNotifications: true,\n notificationSoundVolume: 5,\n canAutoPlayGifs: true,\n canAutoPlayVideos: true,\n shouldSuggestStickers: true,\n shouldLoopStickers: true,\n language: 'en',\n timeFormat: '24h',\n wasTimeFormatSetManually: false,\n isConnectionStatusMinimized: true,\n },\n themes: {\n light: {\n isBlurred: true,\n patternColor: DEFAULT_PATTERN_COLOR,\n },\n dark: {\n isBlurred: true,\n patternColor: DARK_THEME_PATTERN_COLOR,\n },\n },\n privacy: {},\n notifyExceptions: {},\n },\n\n twoFaSettings: {},\n activeReactions: {},\n\n shouldShowContextMenuHint: true,\n\n activeDownloads: {\n byChatId: {},\n },\n\n serviceNotifications: [],\n};\n","import {\n addCallback, addReducer, getGlobal, removeCallback,\n} from '../lib/teact/teactn';\n\nimport { GlobalState } from './types';\nimport { MAIN_THREAD_ID } from '../api/types';\n\nimport { onBeforeUnload, onIdle, throttle } from '../util/schedulers';\nimport {\n DEBUG,\n GLOBAL_STATE_CACHE_DISABLED,\n GLOBAL_STATE_CACHE_KEY,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT,\n GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n DEFAULT_VOLUME,\n DEFAULT_PLAYBACK_RATE,\n ALL_FOLDER_ID,\n ARCHIVED_FOLDER_ID,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { isHeavyAnimating } from '../hooks/useHeavyAnimationCheck';\nimport { pick, unique } from '../util/iteratees';\nimport {\n selectCurrentChat,\n selectCurrentMessageList,\n selectVisibleUsers,\n} from '../modules/selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initial';\nimport { parseLocationHash } from '../util/routing';\nimport { isUserId } from '../modules/helpers';\nimport { getOrderedIds } from '../util/folderManager';\n\nconst UPDATE_THROTTLE = 5000;\n\nconst updateCacheThrottled = throttle(() => onIdle(updateCache), UPDATE_THROTTLE, false);\n\nlet isCaching = false;\nlet unsubscribeFromBeforeUnload: NoneToVoidFunction | undefined;\n\nexport function initCache() {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return;\n }\n\n addReducer('saveSession', () => {\n if (isCaching) {\n return;\n }\n\n setupCaching();\n });\n\n addReducer('reset', () => {\n localStorage.removeItem(GLOBAL_STATE_CACHE_KEY);\n\n if (!isCaching) {\n return;\n }\n\n clearCaching();\n });\n}\n\nexport function loadCache(initialState: GlobalState): GlobalState | undefined {\n if (GLOBAL_STATE_CACHE_DISABLED) {\n return undefined;\n }\n\n if (hasStoredSession(true)) {\n setupCaching();\n\n return readCache(initialState);\n } else {\n clearCaching();\n\n return undefined;\n }\n}\n\nfunction setupCaching() {\n isCaching = true;\n unsubscribeFromBeforeUnload = onBeforeUnload(updateCache, true);\n window.addEventListener('blur', updateCache);\n addCallback(updateCacheThrottled);\n}\n\nfunction clearCaching() {\n isCaching = false;\n removeCallback(updateCacheThrottled);\n window.removeEventListener('blur', updateCache);\n if (unsubscribeFromBeforeUnload) {\n unsubscribeFromBeforeUnload();\n }\n}\n\nfunction readCache(initialState: GlobalState): GlobalState {\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.time('global-state-cache-read');\n }\n\n const json = localStorage.getItem(GLOBAL_STATE_CACHE_KEY);\n const cached = json ? JSON.parse(json) as GlobalState : undefined;\n\n if (DEBUG) {\n // eslint-disable-next-line no-console\n console.timeEnd('global-state-cache-read');\n }\n\n if (cached) {\n migrateCache(cached, initialState);\n }\n\n const newState = {\n ...initialState,\n ...cached,\n };\n\n const parsedMessageList = !IS_SINGLE_COLUMN_LAYOUT ? parseLocationHash() : undefined;\n\n return {\n ...newState,\n messages: {\n ...newState.messages,\n messageLists: parsedMessageList ? [parsedMessageList] : [],\n },\n };\n}\n\nfunction migrateCache(cached: GlobalState, initialState: GlobalState) {\n // Migrate from legacy setting names\n if ('shouldAutoDownloadMediaFromContacts' in cached.settings.byKey) {\n const {\n shouldAutoDownloadMediaFromContacts,\n shouldAutoDownloadMediaInPrivateChats,\n shouldAutoDownloadMediaInGroups,\n shouldAutoDownloadMediaInChannels,\n shouldAutoPlayVideos,\n shouldAutoPlayGifs,\n ...rest\n } = cached.settings.byKey;\n\n cached.settings.byKey = {\n ...rest,\n canAutoLoadPhotoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadVideoFromContacts: shouldAutoDownloadMediaFromContacts,\n canAutoLoadPhotoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadVideoInPrivateChats: shouldAutoDownloadMediaInPrivateChats,\n canAutoLoadPhotoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadVideoInGroups: shouldAutoDownloadMediaInGroups,\n canAutoLoadPhotoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoLoadVideoInChannels: shouldAutoDownloadMediaInChannels,\n canAutoPlayVideos: shouldAutoPlayVideos,\n canAutoPlayGifs: shouldAutoPlayGifs,\n };\n }\n\n // Pre-fill settings with defaults\n cached.settings.byKey = {\n ...initialState.settings.byKey,\n ...cached.settings.byKey,\n };\n\n cached.settings.themes = {\n ...initialState.settings.themes,\n ...cached.settings.themes,\n };\n\n cached.chatFolders = {\n ...initialState.chatFolders,\n ...cached.chatFolders,\n };\n\n if (!cached.stickers.greeting) {\n cached.stickers.greeting = initialState.stickers.greeting;\n }\n\n if (!cached.activeDownloads) {\n cached.activeDownloads = {\n byChatId: {},\n };\n }\n\n if (!cached.serviceNotifications) {\n cached.serviceNotifications = [];\n }\n\n if (cached.audioPlayer.volume === undefined) {\n cached.audioPlayer.volume = DEFAULT_VOLUME;\n }\n\n if (cached.audioPlayer.playbackRate === undefined) {\n cached.audioPlayer.playbackRate = DEFAULT_PLAYBACK_RATE;\n }\n\n if (!cached.groupCalls) {\n cached.groupCalls = initialState.groupCalls;\n }\n\n if (!cached.users.statusesById) {\n cached.users.statusesById = {};\n }\n\n if (!cached.messages.sponsoredByChatId) {\n cached.messages.sponsoredByChatId = {};\n }\n\n if (!cached.activeReactions) {\n cached.activeReactions = {};\n }\n}\n\nfunction updateCache() {\n if (!isCaching || isHeavyAnimating()) {\n return;\n }\n\n const global = getGlobal();\n\n if (global.isLoggingOut) {\n return;\n }\n\n const reducedGlobal: GlobalState = {\n ...INITIAL_STATE,\n ...pick(global, [\n 'authState',\n 'authPhoneNumber',\n 'authRememberMe',\n 'authNearestCountry',\n 'currentUserId',\n 'contactList',\n 'topPeers',\n 'topInlineBots',\n 'recentEmojis',\n 'push',\n 'shouldShowContextMenuHint',\n 'leftColumnWidth',\n 'serviceNotifications',\n ]),\n audioPlayer: {\n volume: global.audioPlayer.volume,\n playbackRate: global.audioPlayer.playbackRate,\n isMuted: global.audioPlayer.isMuted,\n },\n isChatInfoShown: reduceShowChatInfo(global),\n users: reduceUsers(global),\n chats: reduceChats(global),\n messages: reduceMessages(global),\n globalSearch: {\n recentlyFoundChatIds: global.globalSearch.recentlyFoundChatIds,\n },\n settings: reduceSettings(global),\n chatFolders: reduceChatFolders(global),\n groupCalls: reduceGroupCalls(global),\n availableReactions: reduceAvailableReactions(global),\n };\n\n const json = JSON.stringify(reducedGlobal);\n localStorage.setItem(GLOBAL_STATE_CACHE_KEY, json);\n}\n\nfunction reduceShowChatInfo(global: GlobalState): boolean {\n return window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN\n ? global.isChatInfoShown\n : false;\n}\n\nfunction reduceUsers(global: GlobalState): GlobalState['users'] {\n const { users: { byId, statusesById }, currentUserId } = global;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const visibleUserIds = selectVisibleUsers(global)?.map(({ id }) => id);\n\n const idsToSave = unique([\n ...currentUserId ? [currentUserId] : [],\n ...currentChatId && isUserId(currentChatId) ? [currentChatId] : [],\n ...visibleUserIds || [],\n ...global.topPeers.userIds || [],\n ...getOrderedIds(ALL_FOLDER_ID)?.filter(isUserId) || [],\n ...getOrderedIds(ARCHIVED_FOLDER_ID)?.filter(isUserId) || [],\n ...global.contactList?.userIds || [],\n ...global.globalSearch.recentlyFoundChatIds?.filter(isUserId) || [],\n ...Object.keys(byId),\n ]).slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\n statusesById: pick(statusesById, idsToSave),\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const { chats: { byId }, currentUserId } = global;\n const currentChat = selectCurrentChat(global);\n const idsToSave = unique([\n ...currentUserId ? [currentUserId] : [],\n ...currentChat ? [currentChat.id] : [],\n ...getOrderedIds(ALL_FOLDER_ID) || [],\n ...getOrderedIds(ARCHIVED_FOLDER_ID) || [],\n ...global.globalSearch.recentlyFoundChatIds || [],\n ...Object.keys(byId),\n ]).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n\n return {\n ...global.chats,\n isFullyLoaded: {},\n byId: pick(global.chats.byId, idsToSave),\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const { currentUserId } = global;\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const chatIdsToSave = [\n ...currentChatId ? [currentChatId] : [],\n ...currentUserId ? [currentUserId] : [],\n ...getOrderedIds(ALL_FOLDER_ID)?.slice(0, GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT) || [],\n ];\n\n chatIdsToSave.forEach((chatId) => {\n const current = global.messages.byChatId[chatId];\n if (!current) {\n return;\n }\n\n const mainThread = current.threadsById[MAIN_THREAD_ID];\n if (!mainThread || !mainThread.viewportIds) {\n return;\n }\n\n byChatId[chatId] = {\n byId: pick(current.byId, mainThread.viewportIds),\n threadsById: {\n [MAIN_THREAD_ID]: mainThread,\n },\n };\n });\n\n return {\n byChatId,\n messageLists: [],\n sponsoredByChatId: {},\n };\n}\n\nfunction reduceSettings(global: GlobalState): GlobalState['settings'] {\n const { byKey, themes } = global.settings;\n\n return {\n byKey,\n themes,\n privacy: {},\n notifyExceptions: {},\n };\n}\n\nfunction reduceChatFolders(global: GlobalState): GlobalState['chatFolders'] {\n return {\n ...global.chatFolders,\n activeChatFolder: 0,\n };\n}\n\nfunction reduceGroupCalls(global: GlobalState): GlobalState['groupCalls'] {\n return {\n ...global.groupCalls,\n byId: {},\n activeGroupCallId: undefined,\n isGroupCallPanelHidden: undefined,\n isFallbackConfirmOpen: undefined,\n };\n}\n\nfunction reduceAvailableReactions(global: GlobalState): GlobalState['availableReactions'] {\n return global.availableReactions\n ?.map((r) => pick(r, ['reaction', 'staticIcon', 'title', 'isInactive']));\n}\n","import { addReducer } from '../lib/teact/teactn';\n\nimport { INITIAL_STATE } from './initial';\nimport { initCache, loadCache } from './cache';\nimport { cloneDeep } from '../util/iteratees';\n\ninitCache();\n\naddReducer('init', () => {\n const initial = cloneDeep(INITIAL_STATE);\n return loadCache(initial) || initial;\n});\n","const STORAGE_KEY = 'tt-active-tab';\nconst INTERVAL = 2000;\n\nconst tabKey = String(Date.now() + Math.random());\n\nlocalStorage.setItem(STORAGE_KEY, tabKey);\n\nlet callback: NoneToVoidFunction;\n\nconst interval = window.setInterval(() => {\n if (callback && localStorage.getItem(STORAGE_KEY) !== tabKey) {\n callback();\n clearInterval(interval);\n }\n}, INTERVAL);\n\nexport function addActiveTabChangeListener(_callback: NoneToVoidFunction) {\n callback = _callback;\n}\n","const SITE_FONTS = ['400 1em Roboto', '500 1em Roboto'];\n\nexport default function preloadFonts() {\n if ('fonts' in document) {\n return Promise.all(SITE_FONTS.map((font) => document.fonts.load(font)));\n }\n\n return undefined;\n}\n","import React, { FC, useEffect } from '../../lib/teact/teact';\nimport { getDispatch, getGlobal, withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiMediaFormat } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport { getChatAvatarHash } from '../../modules/helpers/chats'; // Direct import for better module splitting\nimport useFlag from '../../hooks/useFlag';\nimport useShowTransition from '../../hooks/useShowTransition';\nimport { pause } from '../../util/schedulers';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport * as mediaLoader from '../../util/mediaLoader';\nimport { Bundles, loadModule } from '../../util/moduleLoader';\nimport buildClassName from '../../util/buildClassName';\n\nimport './UiLoader.scss';\n\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\nimport reactionThumbsPath from '../../assets/reaction-thumbs.png';\nimport monkeyPath from '../../assets/monkey.svg';\nimport { selectIsRightColumnShown, selectTheme } from '../../modules/selectors';\n\ntype OwnProps = {\n page: 'main' | 'authCode' | 'authPassword' | 'authPhoneNumber' | 'authQrCode';\n children: any;\n};\n\ntype StateProps =\n Pick<GlobalState, 'uiReadyState' | 'shouldSkipHistoryAnimations'>\n & {\n hasCustomBackground?: boolean;\n hasCustomBackgroundColor: boolean;\n isRightColumnShown?: boolean;\n leftColumnWidth?: number;\n };\n\nconst MAX_PRELOAD_DELAY = 700;\nconst SECOND_STATE_DELAY = 1000;\nconst AVATARS_TO_PRELOAD = 10;\n\nfunction preloadAvatars() {\n const { listIds, byId } = getGlobal().chats;\n if (!listIds.active) {\n return undefined;\n }\n\n return Promise.all(listIds.active.slice(0, AVATARS_TO_PRELOAD).map((chatId) => {\n const chat = byId[chatId];\n if (!chat) {\n return undefined;\n }\n\n const avatarHash = getChatAvatarHash(chat);\n if (!avatarHash) {\n return undefined;\n }\n\n return mediaLoader.fetch(avatarHash, ApiMediaFormat.BlobUrl);\n }));\n}\n\nconst preloadTasks = {\n main: () => Promise.all([\n loadModule(Bundles.Main, 'Main')\n .then(preloadFonts),\n preloadAvatars(),\n preloadImage(reactionThumbsPath),\n ]),\n authPhoneNumber: () => Promise.all([\n preloadFonts(),\n preloadImage(telegramLogoPath),\n ]),\n authCode: () => preloadImage(monkeyPath),\n authPassword: () => preloadImage(monkeyPath),\n authQrCode: preloadFonts,\n};\n\nconst UiLoader: FC<OwnProps & StateProps> = ({\n page,\n children,\n hasCustomBackground,\n hasCustomBackgroundColor,\n isRightColumnShown,\n shouldSkipHistoryAnimations,\n leftColumnWidth,\n}) => {\n const { setIsUiReady } = getDispatch();\n\n const [isReady, markReady] = useFlag();\n const {\n shouldRender: shouldRenderMask, transitionClassNames,\n } = useShowTransition(!isReady, undefined, true);\n\n useEffect(() => {\n let timeout: number | undefined;\n\n const safePreload = async () => {\n try {\n await preloadTasks[page]();\n } catch (err) {\n // Do nothing\n }\n };\n\n Promise.race([\n pause(MAX_PRELOAD_DELAY),\n safePreload(),\n ]).then(() => {\n markReady();\n setIsUiReady({ uiReadyState: 1 });\n\n timeout = window.setTimeout(() => {\n setIsUiReady({ uiReadyState: 2 });\n }, SECOND_STATE_DELAY);\n });\n\n return () => {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n setIsUiReady({ uiReadyState: 0 });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div id=\"UiLoader\">\n {children}\n {shouldRenderMask && !shouldSkipHistoryAnimations && (\n <div className={buildClassName('mask', transitionClassNames)}>\n {page === 'main' ? (\n <>\n <div\n className=\"left\"\n style={leftColumnWidth ? `width: ${leftColumnWidth}px` : undefined}\n />\n <div\n className={buildClassName(\n 'middle',\n hasCustomBackground && 'custom-bg-image',\n hasCustomBackgroundColor && 'custom-bg-color',\n isRightColumnShown && 'with-right-column',\n )}\n />\n {isRightColumnShown && <div className=\"right\" />}\n </>\n ) : (\n <div className=\"blank\" />\n )}\n </div>\n )}\n </div>\n );\n};\n\nexport default withGlobal<OwnProps>(\n (global): StateProps => {\n const theme = selectTheme(global);\n const { background, backgroundColor } = global.settings.themes[theme] || {};\n\n return {\n shouldSkipHistoryAnimations: global.shouldSkipHistoryAnimations,\n uiReadyState: global.uiReadyState,\n hasCustomBackground: Boolean(background),\n hasCustomBackgroundColor: Boolean(backgroundColor),\n isRightColumnShown: selectIsRightColumnShown(global),\n leftColumnWidth: global.leftColumnWidth,\n };\n },\n)(UiLoader);\n","import * as langProvider from '../util/langProvider';\nimport { useState } from '../lib/teact/teact';\n\nconst useLangString = (langCode: string | undefined, key: string): string | undefined => {\n const [translation, setTranslation] = useState<string>();\n\n if (langCode) {\n langProvider\n .getTranslationForLangString(langCode, key)\n .then(setTranslation);\n }\n\n return translation;\n};\n\nexport default useLangString;\n","import { LangCode } from '../../../types';\n\nexport function getSuggestedLanguage() {\n let suggestedLanguage = navigator.language;\n\n if (suggestedLanguage && suggestedLanguage !== 'pt-br') {\n suggestedLanguage = suggestedLanguage.substr(0, 2);\n }\n\n return suggestedLanguage as LangCode;\n}\n","import React, {\n FC, useState, memo, useCallback, useRef,\n} from '../../lib/teact/teact';\nimport { withGlobal } from '../../lib/teact/teactn';\n\nimport { ApiCountryCode } from '../../api/types';\n\nimport { ANIMATION_END_DELAY } from '../../config';\nimport { prepareSearchWordsForNeedle } from '../../util/searchWords';\nimport buildClassName from '../../util/buildClassName';\nimport renderText from '../common/helpers/renderText';\nimport useLang from '../../hooks/useLang';\nimport { isoToEmoji } from '../../util/emoji';\nimport useOnChange from '../../hooks/useOnChange';\n\nimport DropdownMenu from '../ui/DropdownMenu';\nimport MenuItem from '../ui/MenuItem';\nimport Spinner from '../ui/Spinner';\n\nimport './CountryCodeInput.scss';\n\ntype StateProps = {\n phoneCodeList: ApiCountryCode[];\n};\n\ntype OwnProps = {\n id: string;\n value?: ApiCountryCode;\n isLoading?: boolean;\n onChange: (value: ApiCountryCode) => void;\n};\n\nconst MENU_HIDING_DURATION = 200 + ANIMATION_END_DELAY;\nconst SELECT_TIMEOUT = 50;\n\nconst CountryCodeInput: FC<OwnProps & StateProps> = ({\n id,\n value,\n isLoading,\n onChange,\n phoneCodeList,\n}) => {\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [filter, setFilter] = useState<string | undefined>();\n const [filteredList, setFilteredList] = useState<ApiCountryCode[]>([]);\n\n const updateFilter = useCallback((filterValue?: string) => {\n setFilter(filterValue);\n setFilteredList(getFilteredList(phoneCodeList, filterValue));\n }, [phoneCodeList]);\n\n useOnChange(([prevPhoneCodeList]) => {\n if (prevPhoneCodeList?.length === 0 && phoneCodeList.length > 0) {\n updateFilter(filter);\n }\n }, [phoneCodeList, updateFilter]);\n\n const handleChange = useCallback((country: ApiCountryCode) => {\n onChange(country);\n\n setTimeout(() => updateFilter(undefined), MENU_HIDING_DURATION);\n }, [onChange, updateFilter]);\n\n const handleInput = useCallback((e: React.FormEvent<HTMLInputElement>) => {\n updateFilter(e.currentTarget.value);\n }, [updateFilter]);\n\n const handleInputKeyDown = useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.keyCode !== 8) {\n return;\n }\n\n const target = e.currentTarget;\n if (value && filter === undefined) {\n target.value = '';\n }\n\n updateFilter(target.value);\n }, [filter, updateFilter, value]);\n\n const CodeInput: FC<{ onTrigger: () => void; isOpen?: boolean }> = ({ onTrigger, isOpen }) => {\n const handleTrigger = () => {\n if (isOpen) {\n return;\n }\n\n setTimeout(() => {\n inputRef.current!.select();\n }, SELECT_TIMEOUT);\n\n onTrigger();\n\n const formEl = document.getElementById('auth-phone-number-form')!;\n formEl.scrollTo({ top: formEl.scrollHeight, behavior: 'smooth' });\n };\n\n const handleCodeInput = (e: React.FormEvent<HTMLInputElement>) => {\n handleInput(e);\n handleTrigger();\n };\n\n const inputValue = filter ?? (value?.name || value?.defaultName || '');\n\n return (\n <div className={buildClassName('input-group', value && 'touched')}>\n <input\n ref={inputRef}\n className={buildClassName('form-control', isOpen && 'focus')}\n type=\"text\"\n id={id}\n value={inputValue}\n autoComplete=\"off\"\n onClick={handleTrigger}\n onFocus={handleTrigger}\n onInput={handleCodeInput}\n onKeyDown={handleInputKeyDown}\n />\n <label>{lang('Login.SelectCountry.Title')}</label>\n {isLoading ? (\n <Spinner color=\"black\" />\n ) : (\n <i onClick={handleTrigger} className={buildClassName('css-icon-down', isOpen && 'open')} />\n )}\n </div>\n );\n };\n\n return (\n <DropdownMenu\n className=\"CountryCodeInput\"\n trigger={CodeInput}\n >\n {filteredList\n .map((country: ApiCountryCode) => (\n <MenuItem\n key={country.iso2}\n className={value && country.iso2 === value.iso2 ? 'selected' : ''}\n onClick={() => handleChange(country)}\n >\n <span className=\"country-flag\">{renderText(isoToEmoji(country.iso2), ['hq_emoji'])}</span>\n <span className=\"country-name\">{country.name || country.defaultName}</span>\n <span className=\"country-code\">{country.countryCode}</span>\n </MenuItem>\n ))}\n {!filteredList.length && (\n <MenuItem\n key=\"no-results\"\n className=\"no-results\"\n disabled\n >\n <span>{lang('lng_country_none')}</span>\n </MenuItem>\n )}\n </DropdownMenu>\n );\n};\n\nfunction getFilteredList(countryList: ApiCountryCode[], filter = ''): ApiCountryCode[] {\n if (!filter.length) {\n return countryList;\n }\n\n const searchWords = prepareSearchWordsForNeedle(filter);\n\n return countryList.filter((country) => (\n searchWords(country.defaultName) || (country.name && searchWords(country.name))\n ));\n}\n\nexport default memo(withGlobal<OwnProps>(\n (global): StateProps => {\n const { countryList: { phoneCodes: phoneCodeList } } = global;\n return {\n phoneCodeList,\n };\n },\n)(CountryCodeInput));\n","import { ChangeEvent } from 'react';\n\nimport monkeyPath from '../../assets/monkey.svg';\n\nimport React, {\n FC, memo, useCallback, useEffect, useLayoutEffect, useRef, useState,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\nimport { LangCode } from '../../types';\nimport { ApiCountryCode } from '../../api/types';\n\nimport { IS_SAFARI, IS_TOUCH_ENV } from '../../util/environment';\nimport { preloadImage } from '../../util/files';\nimport preloadFonts from '../../util/fonts';\nimport { pick } from '../../util/iteratees';\nimport { formatPhoneNumber, getCountryCodesByIso, getCountryFromPhoneNumber } from '../../util/phoneNumber';\nimport { setLanguage } from '../../util/langProvider';\nimport useLang from '../../hooks/useLang';\nimport useFlag from '../../hooks/useFlag';\nimport useLangString from '../../hooks/useLangString';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport Button from '../ui/Button';\nimport Checkbox from '../ui/Checkbox';\nimport InputText from '../ui/InputText';\nimport Loading from '../ui/Loading';\nimport CountryCodeInput from './CountryCodeInput';\n\ntype StateProps = Pick<GlobalState, (\n 'connectionState' | 'authState' |\n 'authPhoneNumber' | 'authIsLoading' |\n 'authIsLoadingQrCode' | 'authError' |\n 'authRememberMe' | 'authNearestCountry'\n)> & {\n language?: LangCode;\n phoneCodeList: ApiCountryCode[];\n};\n\nconst MIN_NUMBER_LENGTH = 7;\n\nlet isPreloadInitiated = false;\n\nconst AuthPhoneNumber: FC<StateProps> = ({\n connectionState,\n authState,\n authPhoneNumber,\n authIsLoading,\n authIsLoadingQrCode,\n authError,\n authRememberMe,\n authNearestCountry,\n phoneCodeList,\n language,\n}) => {\n const {\n setAuthPhoneNumber,\n setAuthRememberMe,\n loadNearestCountry,\n loadCountryList,\n clearAuthError,\n goToAuthQrCode,\n setSettingOption,\n } = getDispatch();\n\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const inputRef = useRef<HTMLInputElement>(null);\n const suggestedLanguage = getSuggestedLanguage();\n\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [country, setCountry] = useState<ApiCountryCode | undefined>();\n const [phoneNumber, setPhoneNumber] = useState<string | undefined>();\n const [isTouched, setIsTouched] = useState(false);\n const [lastSelection, setLastSelection] = useState<[number, number] | undefined>();\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n const fullNumber = country ? `+${country.countryCode} ${phoneNumber || ''}` : phoneNumber;\n const canSubmit = fullNumber && fullNumber.replace(/[^\\d]+/g, '').length >= MIN_NUMBER_LENGTH;\n\n useEffect(() => {\n if (!IS_TOUCH_ENV) {\n inputRef.current!.focus();\n }\n }, [country]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady' && !authNearestCountry) {\n loadNearestCountry();\n }\n }, [connectionState, authNearestCountry, loadNearestCountry]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady') {\n loadCountryList({ langCode: language });\n }\n }, [connectionState, language, loadCountryList]);\n\n useEffect(() => {\n if (authNearestCountry && phoneCodeList && !country && !isTouched) {\n setCountry(getCountryCodesByIso(phoneCodeList, authNearestCountry)[0]);\n }\n }, [country, authNearestCountry, isTouched, phoneCodeList]);\n\n const parseFullNumber = useCallback((newFullNumber: string) => {\n if (!newFullNumber.length) {\n setPhoneNumber('');\n }\n\n const suggestedCountry = phoneCodeList && getCountryFromPhoneNumber(phoneCodeList, newFullNumber);\n\n // Any phone numbers should be allowed, in some cases ignoring formatting\n const selectedCountry = !country\n || (suggestedCountry && suggestedCountry.iso2 !== country.iso2)\n || (!suggestedCountry && newFullNumber.length)\n ? suggestedCountry\n : country;\n\n if (!country || !selectedCountry || (selectedCountry && selectedCountry.iso2 !== country.iso2)) {\n setCountry(selectedCountry);\n }\n setPhoneNumber(formatPhoneNumber(newFullNumber, selectedCountry));\n }, [phoneCodeList, country]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n useEffect(() => {\n if (phoneNumber === undefined && authPhoneNumber) {\n parseFullNumber(authPhoneNumber);\n }\n }, [authPhoneNumber, phoneNumber, parseFullNumber]);\n\n useLayoutEffect(() => {\n if (inputRef.current && lastSelection) {\n inputRef.current.setSelectionRange(...lastSelection);\n }\n }, [lastSelection]);\n\n const isJustPastedRef = useRef(false);\n const handlePaste = useCallback(() => {\n isJustPastedRef.current = true;\n requestAnimationFrame(() => {\n isJustPastedRef.current = false;\n });\n }, []);\n\n const handleCountryChange = useCallback((value: ApiCountryCode) => {\n setCountry(value);\n setPhoneNumber('');\n }, []);\n\n const handlePhoneNumberChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n if (authError) {\n clearAuthError();\n }\n\n // This is for further screens. We delay it until user input to speed up the initial loading.\n if (!isPreloadInitiated) {\n isPreloadInitiated = true;\n preloadFonts();\n void preloadImage(monkeyPath);\n }\n\n const { value, selectionStart, selectionEnd } = e.target;\n setLastSelection(\n selectionStart && selectionEnd && selectionEnd < value.length\n ? [selectionStart, selectionEnd]\n : undefined,\n );\n\n setIsTouched(true);\n\n const shouldFixSafariAutoComplete = (\n IS_SAFARI && country && fullNumber !== undefined\n && value.length - fullNumber.length > 1 && !isJustPastedRef.current\n );\n parseFullNumber(shouldFixSafariAutoComplete ? `${country!.countryCode} ${value}` : value);\n }, [authError, clearAuthError, country, fullNumber, parseFullNumber]);\n\n const handleKeepSessionChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setAuthRememberMe(e.target.checked);\n }, [setAuthRememberMe]);\n\n function handleSubmit(event: React.FormEvent<HTMLFormElement>) {\n event.preventDefault();\n\n if (authIsLoading) {\n return;\n }\n\n if (canSubmit) {\n setAuthPhoneNumber({ phoneNumber: fullNumber });\n }\n }\n\n const isAuthReady = authState === 'authorizationStateWaitPhoneNumber';\n\n return (\n <div id=\"auth-phone-number-form\" className=\"custom-scroll\">\n <div className=\"auth-form\">\n <div id=\"logo\" />\n <h2>Telegram</h2>\n <p className=\"note\">{lang('StartText')}</p>\n <form action=\"\" onSubmit={handleSubmit}>\n <CountryCodeInput\n id=\"sign-in-phone-code\"\n value={country}\n isLoading={!authNearestCountry && !country}\n onChange={handleCountryChange}\n />\n <InputText\n ref={inputRef}\n id=\"sign-in-phone-number\"\n label={lang('Login.PhonePlaceholder')}\n value={fullNumber}\n error={authError && lang(authError)}\n inputMode=\"tel\"\n onChange={handlePhoneNumberChange}\n onPaste={IS_SAFARI ? handlePaste : undefined}\n />\n <Checkbox\n id=\"sign-in-keep-session\"\n label=\"Keep me signed in\"\n checked={Boolean(authRememberMe)}\n onChange={handleKeepSessionChange}\n />\n {canSubmit && (\n isAuthReady ? (\n <Button type=\"submit\" ripple isLoading={authIsLoading}>{lang('Login.Next')}</Button>\n ) : (\n <Loading />\n )\n )}\n {isAuthReady && (\n <Button isText ripple isLoading={authIsLoadingQrCode} onClick={goToAuthQrCode}>\n {lang('Login.QR.Login')}\n </Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </form>\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n settings: { byKey: { language } },\n countryList: { phoneCodes: phoneCodeList },\n } = global;\n\n return {\n ...pick(global, [\n 'connectionState',\n 'authState',\n 'authPhoneNumber',\n 'authIsLoading',\n 'authIsLoadingQrCode',\n 'authError',\n 'authRememberMe',\n 'authNearestCountry',\n ]),\n language,\n phoneCodeList,\n };\n },\n)(AuthPhoneNumber));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthCodeAsync: FC = () => {\n const AuthCode = useModuleLoader(Bundles.Auth, 'AuthCode');\n\n return AuthCode ? <AuthCode /> : <Loading />;\n};\n\nexport default memo(AuthCodeAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthPasswordAsync: FC = () => {\n const AuthPassword = useModuleLoader(Bundles.Auth, 'AuthPassword');\n\n return AuthPassword ? <AuthPassword /> : <Loading />;\n};\n\nexport default memo(AuthPasswordAsync);\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\nimport Loading from '../ui/Loading';\n\nconst AuthRegisterAsync: FC = () => {\n const AuthRegister = useModuleLoader(Bundles.Auth, 'AuthRegister');\n\n return AuthRegister ? <AuthRegister /> : <Loading />;\n};\n\nexport default memo(AuthRegisterAsync);\n","/*\n jquery-qrcode v0.14.0 - https://larsjung.de/jquery-qrcode/ */\n'use strict';let G=null;class H{}H.render=function(w,B){G(w,B)};self.QrCreator=H;\n(function(w){function B(t,c,a,e){var b={},h=w(a,c);h.u(t);h.J();e=e||0;var r=h.h(),d=h.h()+2*e;b.text=t;b.level=c;b.version=a;b.O=d;b.a=function(b,a){b-=e;a-=e;return 0>b||b>=r||0>a||a>=r?!1:h.a(b,a)};return b}function C(t,c,a,e,b,h,r,d,g,x){function u(b,a,f,c,d,r,g){b?(t.lineTo(a+r,f+g),t.arcTo(a,f,c,d,h)):t.lineTo(a,f)}r?t.moveTo(c+h,a):t.moveTo(c,a);u(d,e,a,e,b,-h,0);u(g,e,b,c,b,0,-h);u(x,c,b,c,a,h,0);u(r,c,a,e,a,0,h)}function z(t,c,a,e,b,h,r,d,g,x){function u(b,a,c,d){t.moveTo(b+c,a);t.lineTo(b,\na);t.lineTo(b,a+d);t.arcTo(b,a,b+c,a,h)}r&&u(c,a,h,h);d&&u(e,a,-h,h);g&&u(e,b,-h,-h);x&&u(c,b,h,-h)}function A(t,c){var a=c.fill;if(\"string\"===typeof a)t.fillStyle=a;else{var e=a.type,b=a.colorStops;a=a.position.map((b)=>Math.round(b*c.size));if(\"linear-gradient\"===e)var h=t.createLinearGradient.apply(t,a);else if(\"radial-gradient\"===e)h=t.createRadialGradient.apply(t,a);else throw Error(\"Unsupported fill\");b.forEach(([b,a])=>{h.addColorStop(b,a)});t.fillStyle=h}}function y(t,c){a:{var a=c.text,e=\nc.v,b=c.N,h=c.K,r=c.P;b=Math.max(1,b||1);for(h=Math.min(40,h||40);b<=h;b+=1)try{var d=B(a,e,b,r);break a}catch(J){}d=void 0}if(!d)return null;a=t.getContext(\"2d\");c.background&&(a.fillStyle=c.background,a.fillRect(c.left,c.top,c.size,c.size));e=d.O;h=c.size/e;a.beginPath();for(r=0;r<e;r+=1)for(b=0;b<e;b+=1){var g=a,x=c.left+b*h,u=c.top+r*h,p=r,q=b,f=d.a,k=x+h,m=u+h,D=p-1,E=p+1,n=q-1,l=q+1,y=Math.floor(Math.min(.5,Math.max(0,c.R))*h),v=f(p,q),I=f(D,n),w=f(D,q);D=f(D,l);var F=f(p,l);l=f(E,l);q=f(E,\nq);E=f(E,n);p=f(p,n);x=Math.round(x);u=Math.round(u);k=Math.round(k);m=Math.round(m);v?C(g,x,u,k,m,y,!w&&!p,!w&&!F,!q&&!F,!q&&!p):z(g,x,u,k,m,y,w&&p&&I,w&&F&&D,q&&F&&l,q&&p&&E)}A(a,c);a.fill();return t}var v={minVersion:1,maxVersion:40,ecLevel:\"L\",left:0,top:0,size:200,fill:\"#000\",background:null,text:\"no text\",radius:.5,quiet:0};G=function(t,c){var a={};Object.assign(a,v,t);a.N=a.minVersion;a.K=a.maxVersion;a.v=a.ecLevel;a.left=a.left;a.top=a.top;a.size=a.size;a.fill=a.fill;a.background=a.background;\na.text=a.text;a.R=a.radius;a.P=a.quiet;if(c instanceof HTMLCanvasElement){if(c.width!==a.size||c.height!==a.size)c.width=a.size,c.height=a.size;c.getContext(\"2d\").clearRect(0,0,c.width,c.height);y(c,a)}else t=document.createElement(\"canvas\"),t.width=a.size,t.height=a.size,a=y(t,a),c.appendChild(a)}})(function(){function w(c){var a=C.s(c);return{S:function(){return 4},b:function(){return a.length},write:function(c){for(var b=0;b<a.length;b+=1)c.put(a[b],8)}}}function B(){var c=[],a=0,e={B:function(){return c},\nc:function(b){return 1==(c[Math.floor(b/8)]>>>7-b%8&1)},put:function(b,h){for(var a=0;a<h;a+=1)e.m(1==(b>>>h-a-1&1))},f:function(){return a},m:function(b){var h=Math.floor(a/8);c.length<=h&&c.push(0);b&&(c[h]|=128>>>a%8);a+=1}};return e}function C(c,a){function e(b,h){for(var a=-1;7>=a;a+=1)if(!(-1>=b+a||d<=b+a))for(var c=-1;7>=c;c+=1)-1>=h+c||d<=h+c||(r[b+a][h+c]=0<=a&&6>=a&&(0==c||6==c)||0<=c&&6>=c&&(0==a||6==a)||2<=a&&4>=a&&2<=c&&4>=c?!0:!1)}function b(b,a){for(var f=d=4*c+17,k=Array(f),m=0;m<\nf;m+=1){k[m]=Array(f);for(var p=0;p<f;p+=1)k[m][p]=null}r=k;e(0,0);e(d-7,0);e(0,d-7);f=y.G(c);for(k=0;k<f.length;k+=1)for(m=0;m<f.length;m+=1){p=f[k];var q=f[m];if(null==r[p][q])for(var n=-2;2>=n;n+=1)for(var l=-2;2>=l;l+=1)r[p+n][q+l]=-2==n||2==n||-2==l||2==l||0==n&&0==l}for(f=8;f<d-8;f+=1)null==r[f][6]&&(r[f][6]=0==f%2);for(f=8;f<d-8;f+=1)null==r[6][f]&&(r[6][f]=0==f%2);f=y.w(h<<3|a);for(k=0;15>k;k+=1)m=!b&&1==(f>>k&1),r[6>k?k:8>k?k+1:d-15+k][8]=m,r[8][8>k?d-k-1:9>k?15-k:14-k]=m;r[d-8][8]=!b;if(7<=\nc){f=y.A(c);for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[Math.floor(k/3)][k%3+d-8-3]=m;for(k=0;18>k;k+=1)m=!b&&1==(f>>k&1),r[k%3+d-8-3][Math.floor(k/3)]=m}if(null==g){b=t.I(c,h);f=B();for(k=0;k<x.length;k+=1)m=x[k],f.put(4,4),f.put(m.b(),y.f(4,c)),m.write(f);for(k=m=0;k<b.length;k+=1)m+=b[k].j;if(f.f()>8*m)throw Error(\"code length overflow. (\"+f.f()+\">\"+8*m+\")\");for(f.f()+4<=8*m&&f.put(0,4);0!=f.f()%8;)f.m(!1);for(;!(f.f()>=8*m);){f.put(236,8);if(f.f()>=8*m)break;f.put(17,8)}var u=0;m=k=0;p=Array(b.length);\nq=Array(b.length);for(n=0;n<b.length;n+=1){var v=b[n].j,w=b[n].o-v;k=Math.max(k,v);m=Math.max(m,w);p[n]=Array(v);for(l=0;l<p[n].length;l+=1)p[n][l]=255&f.B()[l+u];u+=v;l=y.C(w);v=z(p[n],l.b()-1).l(l);q[n]=Array(l.b()-1);for(l=0;l<q[n].length;l+=1)w=l+v.b()-q[n].length,q[n][l]=0<=w?v.c(w):0}for(l=f=0;l<b.length;l+=1)f+=b[l].o;f=Array(f);for(l=u=0;l<k;l+=1)for(n=0;n<b.length;n+=1)l<p[n].length&&(f[u]=p[n][l],u+=1);for(l=0;l<m;l+=1)for(n=0;n<b.length;n+=1)l<q[n].length&&(f[u]=q[n][l],u+=1);g=f}b=g;f=\n-1;k=d-1;m=7;p=0;a=y.F(a);for(q=d-1;0<q;q-=2)for(6==q&&--q;;){for(n=0;2>n;n+=1)null==r[k][q-n]&&(l=!1,p<b.length&&(l=1==(b[p]>>>m&1)),a(k,q-n)&&(l=!l),r[k][q-n]=l,--m,-1==m&&(p+=1,m=7));k+=f;if(0>k||d<=k){k-=f;f=-f;break}}}var h=A[a],r=null,d=0,g=null,x=[],u={u:function(b){b=w(b);x.push(b);g=null},a:function(b,a){if(0>b||d<=b||0>a||d<=a)throw Error(b+\",\"+a);return r[b][a]},h:function(){return d},J:function(){for(var a=0,h=0,c=0;8>c;c+=1){b(!0,c);var d=y.D(u);if(0==c||a>d)a=d,h=c}b(!1,h)}};return u}\nfunction z(c,a){if(\"undefined\"==typeof c.length)throw Error(c.length+\"/\"+a);var e=function(){for(var b=0;b<c.length&&0==c[b];)b+=1;for(var r=Array(c.length-b+a),d=0;d<c.length-b;d+=1)r[d]=c[d+b];return r}(),b={c:function(b){return e[b]},b:function(){return e.length},multiply:function(a){for(var h=Array(b.b()+a.b()-1),c=0;c<b.b();c+=1)for(var g=0;g<a.b();g+=1)h[c+g]^=v.i(v.g(b.c(c))+v.g(a.c(g)));return z(h,0)},l:function(a){if(0>b.b()-a.b())return b;for(var c=v.g(b.c(0))-v.g(a.c(0)),h=Array(b.b()),\ng=0;g<b.b();g+=1)h[g]=b.c(g);for(g=0;g<a.b();g+=1)h[g]^=v.i(v.g(a.c(g))+c);return z(h,0).l(a)}};return b}C.s=function(c){for(var a=[],e=0;e<c.length;e++){var b=c.charCodeAt(e);128>b?a.push(b):2048>b?a.push(192|b>>6,128|b&63):55296>b||57344<=b?a.push(224|b>>12,128|b>>6&63,128|b&63):(e++,b=65536+((b&1023)<<10|c.charCodeAt(e)&1023),a.push(240|b>>18,128|b>>12&63,128|b>>6&63,128|b&63))}return a};var A={L:1,M:0,Q:3,H:2},y=function(){function c(b){for(var a=0;0!=b;)a+=1,b>>>=1;return a}var a=[[],[6,18],\n[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],\n[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],e={w:function(b){for(var a=b<<10;0<=c(a)-c(1335);)a^=1335<<c(a)-c(1335);return(b<<10|a)^21522},A:function(b){for(var a=b<<12;0<=c(a)-c(7973);)a^=7973<<c(a)-c(7973);return b<<12|a},G:function(b){return a[b-1]},F:function(b){switch(b){case 0:return function(b,a){return 0==(b+a)%2};case 1:return function(b){return 0==b%2};case 2:return function(b,a){return 0==a%3};case 3:return function(b,a){return 0==\n(b+a)%3};case 4:return function(b,a){return 0==(Math.floor(b/2)+Math.floor(a/3))%2};case 5:return function(b,a){return 0==b*a%2+b*a%3};case 6:return function(b,a){return 0==(b*a%2+b*a%3)%2};case 7:return function(b,a){return 0==(b*a%3+(b+a)%2)%2};default:throw Error(\"bad maskPattern:\"+b);}},C:function(b){for(var a=z([1],0),c=0;c<b;c+=1)a=a.multiply(z([1,v.i(c)],0));return a},f:function(b,a){if(4!=b||1>a||40<a)throw Error(\"mode: \"+b+\"; type: \"+a);return 10>a?8:16},D:function(b){for(var a=b.h(),c=0,\nd=0;d<a;d+=1)for(var g=0;g<a;g+=1){for(var e=0,t=b.a(d,g),p=-1;1>=p;p+=1)if(!(0>d+p||a<=d+p))for(var q=-1;1>=q;q+=1)0>g+q||a<=g+q||(0!=p||0!=q)&&t==b.a(d+p,g+q)&&(e+=1);5<e&&(c+=3+e-5)}for(d=0;d<a-1;d+=1)for(g=0;g<a-1;g+=1)if(e=0,b.a(d,g)&&(e+=1),b.a(d+1,g)&&(e+=1),b.a(d,g+1)&&(e+=1),b.a(d+1,g+1)&&(e+=1),0==e||4==e)c+=3;for(d=0;d<a;d+=1)for(g=0;g<a-6;g+=1)b.a(d,g)&&!b.a(d,g+1)&&b.a(d,g+2)&&b.a(d,g+3)&&b.a(d,g+4)&&!b.a(d,g+5)&&b.a(d,g+6)&&(c+=40);for(g=0;g<a;g+=1)for(d=0;d<a-6;d+=1)b.a(d,g)&&!b.a(d+\n1,g)&&b.a(d+2,g)&&b.a(d+3,g)&&b.a(d+4,g)&&!b.a(d+5,g)&&b.a(d+6,g)&&(c+=40);for(g=e=0;g<a;g+=1)for(d=0;d<a;d+=1)b.a(d,g)&&(e+=1);return c+=Math.abs(100*e/a/a-50)/5*10}};return e}(),v=function(){for(var c=Array(256),a=Array(256),e=0;8>e;e+=1)c[e]=1<<e;for(e=8;256>e;e+=1)c[e]=c[e-4]^c[e-5]^c[e-6]^c[e-8];for(e=0;255>e;e+=1)a[c[e]]=e;return{g:function(b){if(1>b)throw Error(\"glog(\"+b+\")\");return a[b]},i:function(b){for(;0>b;)b+=255;for(;256<=b;)b-=255;return c[b]}}}(),t=function(){function c(b,c){switch(c){case A.L:return a[4*\n(b-1)];case A.M:return a[4*(b-1)+1];case A.Q:return a[4*(b-1)+2];case A.H:return a[4*(b-1)+3]}}var a=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,\n2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,\n45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,\n151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],\n[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],\n[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],e={I:function(b,a){var e=c(b,a);if(\"undefined\"==\ntypeof e)throw Error(\"bad rs block @ typeNumber:\"+b+\"/errorCorrectLevel:\"+a);b=e.length/3;a=[];for(var d=0;d<b;d+=1)for(var g=e[3*d],h=e[3*d+1],t=e[3*d+2],p=0;p<g;p+=1){var q=t,f={};f.o=h;f.j=q;a.push(f)}return a}};return e}();return C}());\nexport default QrCreator;\n//# sourceMappingURL=qr-creator.min.js.map\n","import QrCreator from 'qr-creator';\nimport React, {\n FC, useEffect, useRef, memo, useCallback,\n} from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\nimport { LangCode } from '../../types';\n\nimport { DEFAULT_LANG_CODE } from '../../config';\nimport { setLanguage } from '../../util/langProvider';\nimport renderText from '../common/helpers/renderText';\nimport useLangString from '../../hooks/useLangString';\nimport useFlag from '../../hooks/useFlag';\nimport useLang from '../../hooks/useLang';\nimport { getSuggestedLanguage } from './helpers/getSuggestedLanguage';\n\nimport Loading from '../ui/Loading';\nimport Button from '../ui/Button';\n\ntype StateProps =\n Pick<GlobalState, 'connectionState' | 'authState' | 'authQrCode'>\n & {\n language?: LangCode;\n };\n\nconst DATA_PREFIX = 'tg://login?token=';\n\nconst AuthCode: FC<StateProps> = ({\n connectionState,\n authState,\n authQrCode,\n language,\n}) => {\n const {\n returnToAuthPhoneNumber,\n setSettingOption,\n } = getDispatch();\n\n const suggestedLanguage = getSuggestedLanguage();\n const lang = useLang();\n // eslint-disable-next-line no-null/no-null\n const qrCodeRef = useRef<HTMLDivElement>(null);\n const continueText = useLangString(suggestedLanguage, 'ContinueOnThisLanguage');\n const [isLoading, markIsLoading, unmarkIsLoading] = useFlag();\n\n useEffect(() => {\n if (!authQrCode || connectionState !== 'connectionStateReady') {\n return;\n }\n\n const container = qrCodeRef.current!;\n\n container.innerHTML = '';\n container.classList.remove('pre-animate');\n\n QrCreator.render({\n text: `${DATA_PREFIX}${authQrCode.token}`,\n radius: 0.5,\n ecLevel: 'M',\n fill: '#4E96D4',\n size: 280,\n }, container);\n }, [connectionState, authQrCode]);\n\n useEffect(() => {\n if (connectionState === 'connectionStateReady') {\n void setLanguage(DEFAULT_LANG_CODE);\n }\n }, [connectionState]);\n\n const handleLangChange = useCallback(() => {\n markIsLoading();\n\n void setLanguage(suggestedLanguage, () => {\n unmarkIsLoading();\n\n setSettingOption({ language: suggestedLanguage });\n });\n }, [markIsLoading, setSettingOption, suggestedLanguage, unmarkIsLoading]);\n\n const isAuthReady = authState === 'authorizationStateWaitQrCode';\n\n return (\n <div id=\"auth-qr-form\" className=\"custom-scroll\">\n <div className=\"auth-form qr\">\n {authQrCode ? (\n <div key=\"qr-container\" className=\"qr-container pre-animate\" ref={qrCodeRef} />\n ) : (\n <div key=\"qr-loading\" className=\"qr-loading\"><Loading /></div>\n )}\n <h3>{lang('Login.QR.Title')}</h3>\n <ol>\n <li><span>{lang('Login.QR.Help1')}</span></li>\n <li><span>{renderText(lang('Login.QR.Help2'), ['simple_markdown'])}</span></li>\n <li><span>{lang('Login.QR.Help3')}</span></li>\n </ol>\n {isAuthReady && (\n <Button isText onClick={returnToAuthPhoneNumber}>{lang('Login.QR.Cancel')}</Button>\n )}\n {suggestedLanguage && suggestedLanguage !== language && continueText && (\n <Button isText isLoading={isLoading} onClick={handleLangChange}>{continueText}</Button>\n )}\n </div>\n </div>\n );\n};\n\nexport default memo(withGlobal(\n (global): StateProps => {\n const {\n connectionState, authState, authQrCode, settings: { byKey: { language } },\n } = global;\n\n return {\n connectionState,\n authState,\n authQrCode,\n language,\n };\n },\n)(AuthCode));\n","import React, { FC, useEffect, memo } from '../../lib/teact/teact';\nimport { getDispatch, withGlobal } from '../../lib/teact/teactn';\n\nimport { GlobalState } from '../../global/types';\n\nimport '../../modules/actions/initial';\nimport { pick } from '../../util/iteratees';\nimport { PLATFORM_ENV } from '../../util/environment';\nimport windowSize from '../../util/windowSize';\nimport useHistoryBack from '../../hooks/useHistoryBack';\n\nimport UiLoader from '../common/UiLoader';\nimport AuthPhoneNumber from './AuthPhoneNumber';\nimport AuthCode from './AuthCode.async';\nimport AuthPassword from './AuthPassword.async';\nimport AuthRegister from './AuthRegister.async';\nimport AuthQrCode from './AuthQrCode';\n\nimport './Auth.scss';\n\ntype StateProps = Pick<GlobalState, 'authState'>;\n\nconst Auth: FC<StateProps> = ({\n authState,\n}) => {\n const {\n reset, initApi, returnToAuthPhoneNumber, goToAuthQrCode,\n } = getDispatch();\n\n useEffect(() => {\n reset();\n initApi();\n }, [reset, initApi]);\n\n const isMobile = PLATFORM_ENV === 'iOS' || PLATFORM_ENV === 'Android';\n\n const handleChangeAuthorizationMethod = () => {\n if (!isMobile) {\n goToAuthQrCode();\n } else {\n returnToAuthPhoneNumber();\n }\n };\n\n useHistoryBack(\n (!isMobile && authState === 'authorizationStateWaitPhoneNumber')\n || (isMobile && authState === 'authorizationStateWaitQrCode'), handleChangeAuthorizationMethod,\n );\n\n // Prevent refresh when rotating device\n useEffect(() => {\n windowSize.disableRefresh();\n\n return () => {\n windowSize.enableRefresh();\n };\n }, []);\n\n switch (authState) {\n case 'authorizationStateWaitCode':\n return <UiLoader page=\"authCode\" key=\"authCode\"><AuthCode /></UiLoader>;\n case 'authorizationStateWaitPassword':\n return <UiLoader page=\"authPassword\" key=\"authPassword\"><AuthPassword /></UiLoader>;\n case 'authorizationStateWaitRegistration':\n return <AuthRegister />;\n case 'authorizationStateWaitPhoneNumber':\n return <UiLoader page=\"authPhoneNumber\" key=\"authPhoneNumber\"><AuthPhoneNumber /></UiLoader>;\n case 'authorizationStateWaitQrCode':\n return <UiLoader page=\"authQrCode\" key=\"authQrCode\"><AuthQrCode /></UiLoader>;\n default:\n return isMobile\n ? <UiLoader page=\"authPhoneNumber\" key=\"authPhoneNumber\"><AuthPhoneNumber /></UiLoader>\n : <UiLoader page=\"authQrCode\" key=\"authQrCode\"><AuthQrCode /></UiLoader>;\n }\n};\n\nexport default memo(withGlobal(\n (global): StateProps => pick(global, ['authState']),\n)(Auth));\n","import React, { FC, memo } from '../../lib/teact/teact';\nimport { Bundles } from '../../util/moduleLoader';\n\nimport useModuleLoader from '../../hooks/useModuleLoader';\n\nconst MainAsync: FC = () => {\n const Main = useModuleLoader(Bundles.Main, 'Main');\n\n return Main ? <Main /> : undefined;\n};\n\nexport default memo(MainAsync);\n","import React, { FC } from '../../lib/teact/teact';\n\nimport Button from '../ui/Button';\n\nimport appInactivePath from '../../assets/app-inactive.png';\nimport './AppInactive.scss';\n\nconst AppInactive: FC = () => {\n const handleReload = () => {\n window.location.reload();\n };\n\n return (\n <div id=\"AppInactive\">\n <div className=\"content\">\n <img src={appInactivePath} alt=\"\" />\n <h3 className=\"title\">Such error, many tabs</h3>\n <div className=\"description\">\n Telegram supports only one active tab with the app.\n <br />\n Please reload this page to continue using this tab or close it.\n </div>\n <div className=\"actions\">\n <Button isText ripple onClick={handleReload}>Reload app</Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default AppInactive;\n","import { FC, useEffect } from './lib/teact/teact';\nimport React, { getDispatch, withGlobal } from './lib/teact/teactn';\n\nimport { GlobalState } from './global/types';\n\nimport { INACTIVE_MARKER, PAGE_TITLE } from './config';\nimport { pick } from './util/iteratees';\nimport { updateSizes } from './util/windowSize';\nimport { addActiveTabChangeListener } from './util/activeTabMonitor';\nimport useFlag from './hooks/useFlag';\n\nimport Auth from './components/auth/Auth';\nimport UiLoader from './components/common/UiLoader';\nimport Main from './components/main/Main.async';\nimport AppInactive from './components/main/AppInactive';\nimport { hasStoredSession } from './util/sessions';\n// import Test from './components/test/TestNoRedundancy';\n\ntype StateProps = Pick<GlobalState, 'authState'>;\n\nconst App: FC<StateProps> = ({ authState }) => {\n const { disconnect } = getDispatch();\n\n const [isInactive, markInactive] = useFlag(false);\n\n useEffect(() => {\n updateSizes();\n addActiveTabChangeListener(() => {\n disconnect();\n document.title = `${PAGE_TITLE}${INACTIVE_MARKER}`;\n\n markInactive();\n });\n }, [disconnect, markInactive]);\n\n // return <Test />;\n\n if (isInactive) {\n return <AppInactive />;\n }\n\n if (authState) {\n switch (authState) {\n case 'authorizationStateWaitPhoneNumber':\n case 'authorizationStateWaitCode':\n case 'authorizationStateWaitPassword':\n case 'authorizationStateWaitRegistration':\n case 'authorizationStateWaitQrCode':\n return <Auth />;\n case 'authorizationStateClosed':\n case 'authorizationStateClosing':\n case 'authorizationStateLoggingOut':\n case 'authorizationStateReady':\n return renderMain();\n }\n }\n\n return hasStoredSession(true) ? renderMain() : <Auth />;\n};\n\nfunction renderMain() {\n return (\n <UiLoader page=\"main\" key=\"main\">\n <Main />\n </UiLoader>\n );\n}\n\nexport default withGlobal(\n (global): StateProps => pick(global, ['authState']),\n)(App);\n","import './util/handleError';\nimport './util/setupServiceWorker';\n\nimport React, { getDispatch, getGlobal } from './lib/teact/teactn';\nimport TeactDOM from './lib/teact/teact-dom';\n\nimport './global';\n\nimport { DEBUG } from './config';\n\nimport App from './App';\n\nimport './styles/index.scss';\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> INIT');\n}\n\ngetDispatch().init();\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> START INITIAL RENDER');\n}\n\nTeactDOM.render(\n <App />,\n document.getElementById('root'),\n);\n\nif (DEBUG) {\n // eslint-disable-next-line no-console\n console.log('>>> FINISH INITIAL RENDER');\n}\n\ndocument.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.warn('GLOBAL STATE', getGlobal());\n});\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","worker","requestStates","Map","requestStatesByCallback","initApi","onUpdate","initialArgs","DEBUG","console","log","Worker","URL","addEventListener","data","type","update","requestState","get","messageId","error","reject","resolve","response","callback","callbackArgs","Error","message","subscribeToWorker","platform","window","ensureWorkerPing","setTimeout","makeRequest","args","callApi","fnName","warn","promise","name","err","cancelApiProgress","progressCallback","isCanceled","postMessage","generateIdFor","payload","Promise","Object","assign","pop","set","catch","finally","delete","startedAt","Date","now","async","race","pause","then","location","reload","ApiMediaFormat","ApiMessageEntityTypes","MAIN_THREAD_ID","MESSAGE_DELETED","base","maxint","adapt","delta","numpoints","firsttime","k","Math","floor","decode","input","preserveCase","output","case_flags","input_length","length","n","out","i","bias","basic","j","ic","oldi","w","digit","t","len","lastIndexOf","charCodeAt","RangeError","push","cp","splice","String","fromCharCode","toUpperCase","value","join","utf16","getDomain","url","href","ensureProtocol","decodedHref","decodeURI","match","domain","replace","domain_array","split","s","slice","convertPunycode","memo","text","className","children","isRtl","toggleSafeLinkModal","openTelegramLink","getDispatch","content","isNotSafe","handleClick","useCallback","e","ctrlKey","altKey","shiftKey","metaKey","RE_TME_LINK","RE_TG_LINK","preventDefault","classNames","buildClassName","title","target","rel","onClick","dir","getFileSizeString","bytes","ONE_GIGABYTE","toFixed","ONE_MEGABYTE","getDocumentExtension","document","fileName","mimeType","getFileExtension","indexOf","getColorFromExtension","extension","getDocumentHasPreview","Boolean","previewBlobUrl","thumbnail","RE_EMOJI_ONLY","RegExp","twemojiRegex","DETECT_UP_TO","emojiCount","sender","openChat","id","Link","focusMessage","handleMessageClick","chatId","groupCall","joinGroupCall","accessHash","MAX_LENGTH","NBSP","renderActionMessageText","lang","actionOriginUser","actionOriginChat","targetUsers","targetMessage","targetChatId","options","action","translationValues","amount","currency","call","noLinks","asPlainText","asTextWithSpoilers","translationKey","processed","unprocessed","undefined","includes","processPlaceholder","formatCurrency","code","renderUserContent","renderChatContent","map","user","filter","renderMessageContent","renderProductContent","renderMigratedContent","trim","renderGroupCallContent","invoice","getMessageSummaryText","messageSummary","renderMessageSummary","trimText","getUserFullName","renderText","chat","getChatTitle","placeholder","replaceValue","placeholderPosition","substring","Array","isArray","forEach","index","renderMessageText","highlight","shouldRenderHqEmoji","isSimple","truncateLength","entities","contentNotSupportedText","getMessageText","renderTextWithEntities","noEmoji","TRUNCATED_SUMMARY_LENGTH","hasSpoilers","some","emoji","getMessageSummaryEmoji","emojiWithSpace","description","getMessageSummaryDescription","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","part","filters","params","compact","reduce","escapeHtml","EMOJI_REGEX","replaceEmojis","addLineBreaks","addHighlight","addLinks","replaceSimpleMarkdown","textParts","divEl","createElement","result","innerText","innerHTML","size","IS_EMOJI_SUPPORTED","parts","fixNonStandardEmoji","emojis","emojiResult","nativeToUnified","removeVS16s","src","alt","splittenParts","line","source","trimmedLine","trimLeft","indentLength","repeat","lowerCaseText","toLowerCase","queryPosition","nextSymbol","newParts","RE_LINK","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","links","nextLink","shift","lastIndex","startsWith","username","endsWith","entityResult","entity","actionsByMessageId","createClassNameBuilder","contentRef","useRef","isRevealed","reveal","conceal","useFlag","stopPropagation","actions","contentLength","current","readingMs","round","timeoutMs","max","min","useEffect","has","ref","shouldRenderAsHtml","renderMessagePart","deleteLineBreakAfterPre","organizedEntities","organizedEntityIndexes","Set","organizedEntity","organizeEntity","organizedIndexes","organizedIndex","add","organizeEntities","renderEntity","textPartStart","textPartEnd","isLastEntity","renderResult","nestedEntities","offset","textBefore","textBeforeLength","substr","entityStartIndex","entityEndIndex","entityContent","nestedEntityContent","nestedIndex","nestedEntity","nestedEntityIndex","nestedResult","nestedEntityEndIndex","newEntity","rawEntityText","renderedContent","userId","getLinkUrl","processEntityAsHtml","entityText","renderNestedMessagePart","handleBotCommandClick","handleHashtagClick","MentionLink","SafeLink","processEntity","textAfter","arrayIndex","getTextWithEntitiesAsHtml","formattedText","c","concat","parsedEntity","isChanged","sendBotCommand","command","currentTarget","setLocalTextSearchQuery","query","searchTextMessagesLocal","preventMessageInputBlur","withBubbling","IS_IOS","activeElement","EDITABLE_INPUT_ID","preventMessageInputBlurWithBubbling","withGlobal","global","userOrChat","selectUser","openChatByUsername","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","color","backgroundImage","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","withClickPropagation","elementRef","isClicked","setIsClicked","useState","fullClassName","handleMouseDown","style","label","subLabel","checked","blocking","onChange","onCheck","useLang","handleChange","event","trigger","positionX","positionY","footer","forceOpen","onOpen","onClose","menuRef","dropdownRef","isOpen","setIsOpen","onKeyDown","menu","keyCode","focusedElement","elementChildren","from","focus","onTrigger","containerRef","autoClose","shouldSkipTransition","success","readOnly","autoComplete","inputMode","maxLength","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","backgroundColor","bubbleStyle","transformOriginX","transformOriginY","noCloseOnBackdrop","onCloseAnimationEnd","backdropContainerRef","transitionClassNames","useShowTransition","captureEscKeyListener","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","dispatchHeavyAnimationEvent","handleKeyDown","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","transformOriginYStyle","transformOriginXStyle","props","icon","destructive","origin","role","ripples","setRipples","cleanUpDebounced","useMemo","debounce","button","container","position","getBoundingClientRect","rippleSize","offsetWidth","x","clientX","y","clientY","requestAnimationFrame","PAGE_TITLE","INACTIVE_MARKER","APP_NAME","process","APP_VERSION","DEBUG_MORE","IS_TEST","DEBUG_ALERT_MSG","SESSION_USER_KEY","LEGACY_SESSION_KEY","GLOBAL_STATE_CACHE_DISABLED","GLOBAL_STATE_CACHE_KEY","GLOBAL_STATE_CACHE_USER_LIST_LIMIT","GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_CHATS_WITH_MESSAGES_LIMIT","MEDIA_CACHE_DISABLED","MEDIA_CACHE_NAME","MEDIA_CACHE_NAME_AVATARS","MEDIA_PROGRESSIVE_CACHE_NAME","CUSTOM_BG_CACHE_NAME","LANG_CACHE_NAME","AUTODOWNLOAD_FILESIZE_MB_LIMITS","isBigScreen","innerHeight","MIN_PASSWORD_LENGTH","MESSAGE_LIST_SLICE","MESSAGE_LIST_VIEWPORT_LIMIT","CHAT_HEIGHT_PX","CHAT_LIST_SLICE","CHAT_LIST_LOAD_SLICE","SHARED_MEDIA_SLICE","MESSAGE_SEARCH_SLICE","GLOBAL_SEARCH_SLICE","MEMBERS_SLICE","MEMBERS_LOAD_SLICE","PROFILE_SENSITIVE_AREA","TOP_CHAT_MESSAGES_PRELOAD_LIMIT","DEFAULT_VOLUME","DEFAULT_PLAYBACK_RATE","ANIMATION_LEVEL_MIN","ANIMATION_LEVEL_MAX","ANIMATION_LEVEL_DEFAULT","DEFAULT_MESSAGE_TEXT_SIZE_PX","IOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","MACOS_DEFAULT_MESSAGE_TEXT_SIZE_PX","DRAFT_DEBOUNCE","SEND_MESSAGE_ACTION_INTERVAL","EDITABLE_INPUT_MODAL_ID","SAFE_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","SAFE_SCREEN_WIDTH_FOR_CHAT_INFO","MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN","MIN_SCREEN_WIDTH_FOR_STATIC_LEFT_COLUMN","MOBILE_SCREEN_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH","MOBILE_SCREEN_LANDSCAPE_MAX_HEIGHT","LOCAL_MESSAGE_ID_BASE","TMP_CHAT_ID","ANIMATION_END_DELAY","FAST_SMOOTH_MAX_DISTANCE","FAST_SMOOTH_MIN_DURATION","FAST_SMOOTH_MAX_DURATION","FAST_SMOOTH_SHORT_TRANSITION_MAX_DISTANCE","STICKER_SIZE_INLINE_DESKTOP_FACTOR","STICKER_SIZE_INLINE_MOBILE_FACTOR","STICKER_SIZE_AUTH","STICKER_SIZE_AUTH_MOBILE","STICKER_SIZE_PICKER","STICKER_SIZE_GENERAL_SETTINGS","STICKER_SIZE_PICKER_HEADER","STICKER_SIZE_SEARCH","STICKER_SIZE_MODAL","STICKER_SIZE_TWO_FA","STICKER_SIZE_DISCUSSION_GROUPS","STICKER_SIZE_FOLDER_SETTINGS","STICKER_SIZE_INLINE_BOT_RESULT","STICKER_SIZE_JOIN_REQUESTS","STICKER_SIZE_INVITES","NO_STICKER_SET_ID","BASE_EMOJI_KEYWORD_LANG","MENU_TRANSITION_DURATION","SLIDE_TRANSITION_DURATION","VIDEO_MOV_TYPE","SUPPORTED_IMAGE_CONTENT_TYPES","SUPPORTED_VIDEO_CONTENT_TYPES","CONTENT_TYPES_WITH_PREVIEW","CONTENT_NOT_SUPPORTED","COUNTRIES_WITH_12H_TIME_FORMAT","SERVICE_NOTIFICATIONS_USER_ID","REPLIES_USER_ID","ALL_FOLDER_ID","ARCHIVED_FOLDER_ID","MAX_MEDIA_FILES_FOR_ALBUM","MAX_ACTIVE_PINNED_CHATS","SCHEDULED_WHEN_ONLINE","DEFAULT_LANG_CODE","DEFAULT_LANG_PACK","LANG_PACKS","TIPS_USERNAME","LOCALIZED_TIPS","FEEDBACK_URL","LIGHT_THEME_BG_COLOR","DARK_THEME_BG_COLOR","DARK_THEME_PATTERN_COLOR","DEFAULT_PATTERN_COLOR","GROUP_CALL_VOLUME_MULTIPLIER","GROUP_CALL_DEFAULT_VOLUME","ENABLE_THUMBNAIL_VIDEO","cb","dependencies","debugKey","prevDeps","usePrevious","initial","setValue","setTrue","setFalse","setTrigger","ANIMATION_START_EVENT","ANIMATION_END_EVENT","timeout","isAnimating","isHeavyAnimating","duration","onEnd","clearTimeout","dispatchEvent","Event","handleAnimationStart","handleAnimationEnd","isDisabled","removeEventListener","LOCATION_HASH","hash","PATH_BASE","pathname","search","historyState","currentIndex","nextStateIndexToReplace","isHistoryAltered","isEdge","currentIndexes","disableHistoryBack","handleTouchEnd","isActive","onBack","onForward","currentState","shouldReplaceNext","hashes","indexRef","isForward","prevIsActive","isClosed","indexHashRef","prevHashes","isHashChangedFromEvent","isForceClose","prev","history","pushState","state","last","realDelta","indexLast","findIndex","l","go","replaceState","back","handlePopState","currIndex","disableHistoryAnimations","hasChanged","areSortedArraysEqual","forceClose","touches","pageX","innerWidth","onSelectWithEnter","itemSelector","noCaptureFocus","focusedIndex","setFocusedIndex","element","querySelectorAll","newIndex","item","forceUpdate","useForceUpdate","useOnChange","langProvider","bundleName","moduleName","noLoad","autoUpdate","module","getModuleFromMemory","addLoadListener","loadModule","d","next","shouldSkipUndefined","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","exec","shouldHaveOpenClassName","isClosing","shouldRender","handleEvent","contains","classList","NON_BUBBLEABLE_EVENTS","documentEventCounters","delegationRegistryByEventType","delegatedEventTypesByElement","propName","handler","asCapture","eventType","resolveEventType","canUseEventDelegation","addDelegatedListener","removeDelegatedListener","tagName","realEventType","resolveDelegationRegistry","existing","newSet","resolveDelegatedEventTypes","removeAllDelegatedListeners","eventTypes","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","body","parentNode","documentListenersCount","keys","delegatedHandlersCount1","values","acc","counter","delegationRegistriesCount","delegatedHandlersCount2","delegationRegistry","delegationElementsCount","delegatedEventTypesCount","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$new","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","isCurrentComponent","isComponentElement","isNewComponent","hasElementChanged","updateComponent","componentInstance","isMounted","setupComponentUpdateListener","initComponent","node","createNode","setTarget","childNodes","insertBefore","appendChild","removeChild","getTarget","unmountTree","replaceChild","areComponents","isRealElement","nextSibling","updateAttributes","renderChildren","$element","mountComponent","$firstChild","renderComponent","isEmptyElement","createTextNode","isTextElement","tag","entries","key","setAttribute","$child","currentEl","teactFastList","newKeys","$newChild","currentRemainingIndex","remainingByKey","$currentChild","isKeyPresent","newChildKey","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","currentChildrenLength","newChildrenLength","createDocumentFragment","$fragmentChild","currentEntries","newEntries","currentValue","newValue","cssText","removeAttribute","__html","render","headId","getAttribute","$head","VirtualElementTypesEnum","Fragment","Symbol","DEBUG_SILENT_RENDERS_FOR","renderingInstance","Empty","Text","isTagElement","Tag","Component","flatten","createComponentInstance","buildTagElement","parsedChildren","hooks","cursor","byCursor","effects","memos","buildComponentElement","dropEmptyTail","buildChildElement","isEmptyPlaceholder","child","DEBUG_components","newRenderedValue","DEBUG_startAt","componentName","renderCount","renderTimes","performance","handleError","renderedValue","newChild","$old","memoContainer","cleanup","hook","effect","nextValue","setter","helpGc","prepareComponentForFrame","prepareForFrame","throttleWithPrimaryRaf","throttleWithRaf","forceUpdateComponent","currentElement","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","primarySchedulerFn","execCleanup","dependency","causedBy","res","prevValue","fastRaf","fastRafPrimary","useLayoutEffect","onTickEnd","onTickEndPrimary","resolver","getUnequalProps","newCallback","areEqual","arePropsShallowEqual","propsRef","renderedRef","orderBy","React","currentGlobal","reducers","callbacks","containers","mapStateToProps","ownProps","mappedProps","newMappedProps","Number","isNaN","DEBUG_componentName","areMappedPropsChanged","DEBUG_updates","updateTime","runCallbacksThrottled","throttleWithTickEnd","runCallbacks","forceOnHeavyAnimation","setGlobal","newGlobal","forceSyncOnIOs","getGlobal","addReducer","reducer","onDispatch","addCallback","removeCallback","TeactNContainer","vs16RegExp","zeroWidthJoiner","rawEmoji","importLegacySession","clearLegacySessions","apiUpdate","userAgent","navigator","PLATFORM_ENV","sessionData","loadStoredSession","isTest","isMovSupported","IS_MOV_SUPPORTED","isWebmSupported","IS_WEBM_SUPPORTED","phoneNumber","authIsLoading","authError","password","file","firstName","lastName","authIsLoadingQrCode","storeSession","currentUserId","clearStoredSession","unsubscribe","forceWebsync","reset","cacheApi","langCachePrefix","langCacheVersion","updateAppBadge","init","connectionState","authNearestCountry","deviceToken","subscribedAt","buildInputPrivacyRules","visibility","allowedIds","deniedIds","users","byId","usersById","chats","chatsById","rules","collectUsers","isUserId","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","photo","bio","about","profileEdit","progress","ProfileEditProgress","currentUser","updateUser","fullInfo","isUsernameAvailable","settings","loadedWallpapers","wallpapers","createObjectURL","slug","UPLOADING_WALLPAPER_SLUG","wallpaper","firstWallpaper","withLocalMedia","addUsers","buildCollectionByKey","updateChats","blocked","ids","blockedIds","totalCount","contactId","addBlockedContact","removeBlockedContact","activeSessions","session","isCurrent","serverTimeOffset","addNotifyExceptions","replaceSettings","peerType","isSilent","shouldShowPreviews","updateNotifySettings","hasPushNotifications","hasWebNotifications","byKey","subscribe","hasContactJoinedNotifications","languages","phoneNumberSettings","lastSeenSettings","profilePhotoSettings","forwardsSettings","chatInviteSettings","all","privacy","lastSeen","profilePhoto","forwards","chatInvite","privacyKey","allowUserIds","allowChatIds","blockUserIds","blockChatIds","isAllowList","contactsIds","isSensitiveEnabled","langCode","language","countryList","timeFormat","setSettingOption","setTimeFormat","wasTimeFormatSetManually","nearestCountryCode","appConfig","selectNotifySettings","setLanguage","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","onUpdateAuthorizationState","onUpdateAuthorizationError","signOut","onUpdateConnectionState","authRememberMe","isEmpty","mainDcId","saveSession","onUpdateSession","onUpdateServerTimeOffset","sessionUserAuth","localStorage","getItem","userAuth","JSON","parse","setItem","stringify","updateSessionUserId","onUpdateCurrentUser","paymentShippingError","getShippingError","addPaymentError","showDialog","handleSystemThemeChange","currentThemeMatch","documentElement","currentTheme","nextTheme","selectTheme","animationLevel","switchTheme","mql","matchMedia","addListener","subscribeToSystemThemeChange","messageTextSize","theme","setProperty","toString","IS_TOUCH_ENV","ensurePermanentWebVersion","startWebsync","IS_ANDROID","IS_MAC_OS","IS_SAFARI","uiReadyState","remove","authPhoneNumber","shouldSkipHistoryAnimations","replaceThemeSettings","FOREVER_BANNED_DATE","VERIFIED_PRIORITY_BASE","PINNED_PRIORITY_BASE","entityId","isChatGroup","isChatBasicGroup","isChatSuperGroup","isChatChannel","isCommonBoxChat","isChatWithRepliesBot","getChatTypeString","getPrivateChatUserId","isSelf","getChatDescription","getChatLink","inviteLink","getChatAvatarHash","owner","avatarHash","isChatSummaryOnly","lastMessage","isChatAdmin","adminRights","getHasAdminRight","isUserRightBanned","currentUserBannedRights","defaultBannedRights","getCanPostInChat","threadId","isRestricted","migratedTo","isNotJoined","isCreator","getAllowedAttachmentOptions","isChatWithBot","canAttachMedia","canAttachPolls","canSendStickers","canSendGifs","canAttachEmbedLinks","isAdmin","getMessageSendingRestrictionReason","sendMessages","untilDate","formatDateToString","formatTime","getChatSlowModeOptions","slowMode","isChatArchived","folderId","selectIsChatMuted","notifySettings","notifyExceptions","isMuted","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","selectShouldShowMessagePreview","hasPrivateChatsMessagePreview","hasBroadcastMessagePreview","hasGroupMessagePreview","getCanDeleteChat","getFolderDescriptionText","folder","chatsCount","emoticon","pinnedChatIds","excludedChatIds","includedChatIds","excludeArchived","excludeMuted","excludeRead","bots","groups","channels","contacts","nonContacts","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","priority","date","isVerified","filterChatsByName","searchWords","prepareSearchWordsForNeedle","getMessageKey","msgId","buildMessageKey","parseMessageKey","getMessageOriginalId","previousLocalId","sticker","video","audio","voice","poll","webPage","contact","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","link","find","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","isServiceNotificationMessage","isAnonymousOwnMessage","senderId","getSenderTitle","getSendingState","sendingState","isMessageLocal","isHistoryClearMessage","getMessageContentFilename","isLottie","isGif","isWebpSupported","baseFilename","IS_OPUS_SUPPORTED","areReactionsEmpty","reactions","results","count","SPOILER_CHARS","getMessageTextWithSpoilers","accText","spoiler","fill","random","generateBrailleSpoiler","groupedId","truncatedText","performer","getMessageAudioCaption","summary","question","getMessageContent","hasMessageMedia","getMessagePhoto","getMessageVideo","getMessageDocument","getMessageSticker","getMessageContact","getMessagePoll","getMessageAction","getMessageAudio","getMessageVoice","getMessageRoundVideo","isMessageDocumentPhoto","mediaType","isMessageDocumentVideo","getMessageInvoice","getMessageWebPage","getMessageWebPagePhoto","getMessageWebPageVideo","getMessageMediaThumbDataUri","media","getMessageMediaThumbnail","dataUri","getMessageMediaHash","webPagePhoto","webPageVideo","messageVideo","messagePhoto","mediaId","hasMessageLocalBlobUrl","getVideoOrAudioBaseHash","getAudioHasCover","IS_PROGRESSIVE_SUPPORTED","thumbnailSizes","getMessageMediaFormat","fullVideo","getMessageFileName","getMessageFileSize","blobUrl","getChatMediaMessageIds","messages","listedIds","isFromSharedMedia","getMessageContentIds","getPhotoFullDimensions","sizes","getPhotoInlineDimensions","getVideoDimensions","width","height","getMediaTransferState","isLoadNeeded","isUploading","isTransferring","transferProgress","messageIds","contentType","validator","matchLinkInMessageText","getMediaDuration","buildChatThreadKey","STRIPE_ERRORS","missing_payment_information","field","invalid_number","number","exp_year","exp_month","invalid_expiry_year","invalid_expiry_month","cvc","invalid_cvc","getStripeError","param","USER_COLOR_KEYS","isDeletedUser","getUserStatus","userStatus","wasOnline","getTime","wasOnlineDate","diff","today","setHours","yesterday","setDate","getDate","formatFullDate","isUserOnline","noStatus","isUserBot","getCanAddContact","isContact","sortUserIds","userIds","userStatusesById","getServerTime","expires","filterUsersByName","savedMessagesLang","getUserIdDividend","abs","getUserColorKey","peer","replaceChatListIds","newIds","listIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","updatedChat","getUpdatedChat","updatedById","addChats","isUpdated","addedById","isMin","shouldOmitMinInfo","omit","photos","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","orderedPinnedIds","totalChatCount","isFullyLoaded","leaveChat","leftChatId","selectChatListType","listId","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","stickers","setsById","setIds","updateStickerSet","stickerSetId","currentStickerSet","addedSets","added","installedDate","updateGifSearch","isNew","nextOffset","currentResults","gifs","newResults","currentIds","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","unique","forEmoji","rebuildStickersForEmoji","replaceUsers","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","deleteContact","MEMO_EMPTY_ARRAY","updateUserSearch","searchStatePartial","userSearch","updateUserSearchFetchingStatus","newState","fetchingStatus","updateUserBlockedState","isBlocked","replaceUserStatuses","statusesById","addUserStatuses","pick","getComplexKey","updateGlobalSearch","globalSearch","updateGlobalSearchContent","currentContent","updateGlobalSearchResults","newFoundMessages","nextRate","resultsByType","newFoundMessagesById","foundIdsForType","foundIds","every","newId","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","prototype","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","localMediaSearch","byChatId","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","sort","a","b","updateManagementProgress","management","updateManagement","newSettings","themes","notifyException","exceptionData","addNotifyException","updateTwoFaSettings","twoFaSettings","updateShippingOptions","shippingOptions","payment","setRequestInfoId","requestId","setPaymentStep","step","setInvoiceMessageInfo","photoUrl","invoiceContent","setStripeCardInfo","cardInfo","stripeCredentials","setPaymentForm","form","setReceipt","receipt","messageInvoice","clearPayment","closeInvoice","isPaymentModalOpen","updateCurrentMessageList","shouldReplaceHistory","messageLists","newMessageLists","replaceChatMessages","updateMessageStore","threadsById","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","selectScheduledMessages","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","pickTruthy","isLinkedChannelPost","threadInfo","selectThreadInfo","selectListedIds","outlyingIds","selectOutlyingIds","viewportIds","selectViewportIds","pinnedIds","selectPinnedIds","newMessageCount","messagesCount","currentMessageList","selectCurrentMessageList","canDeleteCurrentThread","currentThreadId","fromChatId","fromMessageId","originalPost","selectChatMessage","deleteChatScheduledMessages","scheduledIds","selectScheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","addViewportId","safeReplaceViewportIds","newViewportIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","scheduledMessages","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateSponsoredMessage","sponsoredByChatId","updateFocusDirection","direction","enterMessageSelectMode","selectedMessages","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","to","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","selectChat","selectChatUser","selectIsChatWithSelf","selectIsChatWithBot","selectSupportChat","isSupport","selectChatOnlineCount","members","onlineCount","selectChatBot","selectIsChatBotNotStarted","bot","messageInfo","selectAreActiveChatsLoaded","active","selectIsChatListed","targetList","list","selectChatFolder","chatFolders","selectIsChatPinned","archived","chatFoldersById","selectChatByUsername","usernameLowered","selectIsServiceChatReady","selectSendAs","sendAsId","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","selectStickerSetByShortName","shortName","stickerSets","stickersForEmoji","favorite","packs","cleanEmoji","selectAnimatedEmoji","cleanedEmoji","selectAnimatedEmojiEffect","animatedEmojiEffects","selectAnimatedEmojiSound","emojiSounds","selectLocalAnimatedEmoji","selectLocalAnimatedEmojiEffect","selectLocalAnimatedEmojiEffectByName","selectCurrentChat","selectThreadParam","thread","selectScrollOffset","selectReplyingToId","selectEditingId","selectEditingScheduledId","selectDraft","selectNoWebPage","selectFirstMessageId","selectReplyStack","selectThreadOriginChat","originChannelId","selectThreadTopMessageId","topMessageId","selectThreadByMessage","replyToTopMessageId","isMessageInCurrentMessageList","selectIsViewportNewest","chatMessages","selectScheduledMessage","selectEditingMessage","selectChatMessageByPollId","pollId","messageWithPoll","selectFocusedMessageId","focusedChatId","selectIsMessageFocused","focusedId","selectIsMessageUnread","lastReadOutboxMessageId","selectOutgoingStatus","isScheduledList","selectSender","selectForwardedSender","isChannelPost","senderUserId","selectAllowedMessageActions","isPrivate","isChatWithSelf","isBasicGroup","isSuperGroup","isChannel","isLocal","isServiceNotification","isOwn","isAction","isMessageEditable","viaBotId","canReply","hasPinPermission","canPin","canUnpin","pinnedMessageIds","canDelete","canReport","canDeleteForAll","canEdit","canForward","hasSticker","hasFavoriteSticker","selectIsStickerFavorite","canFaveSticker","canUnfaveSticker","canCopy","canCopyLink","canSelect","canDownload","noOptions","ability","selectCanDeleteSelectedMessages","messageActions","selectCanReportSelectedMessages","selectCanDownloadSelectedMessages","selectIsDownloading","activeInChat","activeDownloads","selectActiveDownloadIds","selectUploadProgress","fileUploads","byMessageLocalId","selectRealLastReadId","lastReadInboxMessageId","Infinity","selectFirstUnreadId","lastReadId","lastReadServiceNotificationId","serviceNotifications","notification","isUnread","findAfterLastReadId","isFromScheduled","found","selectIsForwardModalOpen","forwardMessages","isModalShown","selectCommonBoxChatId","fromLastMessage","selectIsInSelectMode","selectIsMessageSelected","selectForwardedMessageIdsByGroupId","selectIsDocumentGroupSelected","selectedIds","groupIds","selectSelectedMessagesCount","selectNewestMessageWithBotKeyboardButtons","findLast","keyboardButtons","replyHideMessageId","shouldHideKeyboardButtons","selectCanAutoLoadMedia","isPhoto","isVideo","isFile","canAutoLoadPhotoFromContacts","canAutoLoadPhotoInPrivateChats","canAutoLoadPhotoInGroups","canAutoLoadPhotoInChannels","canAutoLoadVideoFromContacts","canAutoLoadVideoInPrivateChats","canAutoLoadVideoInGroups","canAutoLoadVideoInChannels","canAutoLoadFileFromContacts","canAutoLoadFileInPrivateChats","canAutoLoadFileInGroups","canAutoLoadFileInChannels","canAutoLoadMedia","canAutoLoadMediaFromContacts","canAutoLoadMediaInPrivateChats","canAutoLoadMediaInGroups","canAutoLoadMediaInChannels","isMediaFromContact","selectIsUserOrChatContact","selectCanAutoPlayMedia","canAutoPlayVideos","canAutoPlayGifs","asGif","selectShouldLoopStickers","shouldLoopStickers","selectLastServiceNotification","maxId","selectIsMessageProtected","isProtected","selectHasProtectedMessage","selectSponsoredMessage","expiresAt","selectDefaultReaction","defaultReaction","availableReactions","reaction","isInactive","enabledReactions","selectVisibleUsers","selectCurrentTextSearch","currentSearch","selectCurrentMediaSearch","selectManagement","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","pollResults","selectIsPollResultsOpen","RightColumnContent","IS_SINGLE_COLUMN_LAYOUT","currentManagement","selectCurrentManagement","newChatMembersProgress","NewChatMembersProgress","isChatInfoShown","selectIsRightColumnShown","shouldUseSystemTheme","getSystemTheme","selectCurrentGlobalSearchQuery","selectPaymentChatId","selectPaymentMessageId","selectPaymentFormId","formId","selectPaymentRequestId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","selectNotifyExceptions","selectUserStatus","selectIsUserBlocked","LoadMoreDirection","FocusDirection","SettingsScreens","LeftColumnContent","GlobalSearchContent","MediaViewerOrigin","AudioOrigin","ChatCreationProgress","ManagementProgress","ProfileState","PaymentStep","ManagementScreens","currentInstance","animateSingle","tick","instance","isCancelled","animate","timingFunctions","linear","easeIn","easeOut","easeInOut","sin","PI","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","animateNumber","timing","t0","canceled","f","unreadCount","setAppBadge","currentProps","newProps","currentKeys","currentKeysLength","prop","elementName","baseName","modifiers","modifier","self","caches","Type","fetch","cacheName","isHtmlAllowed","request","Request","cache","open","headers","Blob","blob","shouldRecreate","resolvedType","Json","json","save","cacheData","Response","put","clear","createCallbackManager","hasCallbacks","captureKeyboardListener","onEsc","keyToHandlerName","Enter","Backspace","Delete","Esc","Escape","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Tab","handlers","onEnter","onDelete","onBackspace","onUp","onDown","onLeft","onRight","onTab","captureKeyboardListeners","hasActiveHandlers","handlerName","currentEventHandlers","releaseKeyboardListener","keyHandlers","WEEKDAYS_FULL","MONTHS_FULL","MONTHS_FULL_LOWERCASE","month","MILLISECONDS_IN_DAY","isToday","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","format","formatDate","formatMonthAndYear","isShort","formatCountdown","msLeft","days","formatMediaDuration","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","formatKey","day","monthIndex","formatMediaDateTime","maxValue","minutes","seconds","maxHours","maxMinutes","string","formatVoiceRecordDuration","durationInMs","milliseconds","locale","toLocaleString","year","formatDateTimeToString","hour","minute","second","isValidDate","MAX_MONTH_IN_YEAR","parseDateString","matchStringDate","matchEuropeStringDate","matchNumberDate","dateParts","timestampPlusDay","str","EXCLUDE_EMOJIS","EMOJI_EXCEPTIONS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","regex","replacement","pairs","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","isoToEmoji","iso","test","codePointAt","isWebpSupportedCache","webp","Image","handleLoadOrError","onload","onerror","hasWebp","systemThemeCache","matches","os","getPlatform","IS_PWA","standalone","referrer","IS_TABLET_COLUMN_LAYOUT","IS_VOICE_RECORDING_SUPPORTED","mediaDevices","AudioContext","webkitAudioContext","IS_SERVICE_WORKER_SUPPORTED","Audio","canPlayType","IS_CANVAS_FILTER_SUPPORTED","getContext","IS_REQUEST_FULLSCREEN_SUPPORTED","ARE_CALLS_SUPPORTED","LAYERS_ANIMATION_NAME","TEST_VIDEO","DPR","devicePixelRatio","MASK_IMAGE_DISABLED","IS_SCROLL_PATCH_NEEDED","MESSAGE_LIST_SENSITIVE_AREA","dataUriToBlob","arr","mime","bstr","atob","u8arr","Uint8Array","blobToDataUri","reader","FileReader","readAsDataURL","blobToFile","File","lastModified","preloadImage","img","preloadVideo","volume","onloadedmetadata","createPosterForVideo","onseeked","videoWidth","videoHeight","canvas","drawImage","toDataURL","currentTime","fetchBlob","fetchFile","imgToCanvas","constructor","fileBits","rest","super","this","initials","buildInitials","prevGlobal","prepared","updateFolderManagerThrottled","throttle","onIdle","updateFolderManager","inited","getOrderedIds","orderedIdsByFolderId","getPinnedChatsCount","pinnedCountByFolderId","getChatsCount","chatsCountByFolderId","getUnreadCounters","unreadCountersByFolderId","getAllNotificationsCount","notificationsCount","addOrderedIdsCallback","addChatsCountCallback","addUnreadCountersCallback","DEBUG_startedAt","isAllFolderChanged","isMainFolderChanged","isArchivedFolderChanged","isAllFullyLoadedChanged","isAllFolderFullyLoaded","isArchivedFullyLoadedChanged","isArchivedFolderFullyLoaded","areFoldersChanged","foldersById","areChatsChanged","areUsersChanged","areNotifySettingsChanged","areNotifyExceptionsChanged","affectedFolderIds","emptyFolderIds","folderSummariesById","updateFullyLoaded","updateResults","prevAllFolderListIds","allFolderListIds","prevArchivedFolderListIds","archivedFolderListIds","changedFolders","newListIds","newPinnedIds","buildFolderSummaryFromMainList","allFolderPinnedIds","archivedFolderPinnedIds","newFoldersById","buildFolderSummary","updateFolders","newChatsById","newUsersById","newNotifySettings","newNotifyExceptions","folderSummaries","newAllFolderListIds","newArchivedFolderListIds","allIds","newFolderIds","currentSummary","chatSummariesById","newSummary","unreadMentionsCount","hasUnreadMark","joinDate","draftDate","userInfo","isListed","isArchived","isUserContact","buildChatSummary","chatSummary","folderSummary","isChatInFolder","buildChatFolderIds","currentFolderIds","folderIdsByChatId","deletedFolderIds","currentFolderIdsSet","newFolderIdsSet","currentFolderOrderedIds","chatIdsByFolderId","isOrderedListJustPatched","updateListsForChat","currentPinnedIds","wasUnreadCountersChanged","wasChatsCountChanged","pinnedCount","newPinnedCount","orderedIds","newOrderedIds","prevOrderedIds","sortedPinnedIds","allListIds","sortedNotPinnedIds","chatId1","chatId2","buildFolderOrderedIds","currentOrderedIds","currentPinnedCount","currentChatsCount","newChatsCount","currentUnreadCounters","newUnreadCounters","buildFolderUnreadCounters","newInitials","totalPrice","Intl","NumberFormat","store","hasOwnProperty","READABLE_ERROR_MESSAGES","CHAT_RESTRICTED","CHAT_WRITE_FORBIDDEN","CHAT_SEND_POLL_FORBIDDEN","CHAT_SEND_STICKERS_FORBIDDEN","CHAT_SEND_GIFS_FORBIDDEN","CHAT_SEND_MEDIA_FORBIDDEN","CHAT_LINK_EXISTS","SLOWMODE_WAIT_X","USER_BANNED_IN_CHANNEL","USER_IS_BLOCKED","YOU_BLOCKED_USER","IMAGE_PROCESS_FAILED","MEDIA_EMPTY","MEDIA_INVALID","PHOTO_EXT_INVALID","PHOTO_INVALID_DIMENSIONS","PHOTO_SAVE_FILE_INVALID","MESSAGE_DELETE_FORBIDDEN","MESSAGE_POLL_CLOSED","MESSAGE_EDIT_TIME_EXPIRED","CHAT_ADMIN_REQUIRED","PINNED_DIALOGS_TOO_MUCH","DIALOG_FILTERS_TOO_MUCH","CHANNEL_PRIVATE","MEDIA_CAPTION_TOO_LONG","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_CITY_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_POSTCODE_INVALID","ADDRESS_STATE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_PHONE_INVALID","REQ_INFO_EMAIL_INVALID","LINK_NOT_MODIFIED","MESSAGE_TOO_LONG","SERVICE_WORKER_DISABLED","MESSAGE_TOO_LONG_PLEASE_REMOVE_CHARACTERS","FRESH_RESET_AUTHORISATION_FORBIDDEN","BOTS_TOO_MUCH","BOT_GROUPS_BLOCKED","USERS_TOO_MUCH","USER_CHANNELS_TOO_MUCH","USER_KICKED","USER_NOT_MUTUAL_CONTACT","USER_PRIVACY_RESTRICTED","INVITE_HASH_EMPTY","INVITE_HASH_EXPIRED","INVITE_HASH_INVALID","CHANNELS_TOO_MUCH","USER_ALREADY_PARTICIPANT","SCHEDULE_DATE_INVALID","WALLPAPER_DIMENSIONS_INVALID","ADMINS_TOO_MUCH","ADMIN_RANK_EMOJI_NOT_ALLOWED","ADMIN_RANK_INVALID","FRESH_CHANGE_ADMINS_FORBIDDEN","INPUT_USER_DEACTIVATED","SHIPPING_ERRORS","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","handleErrorEvent","ErrorEvent","reason","alert","collection","member","mapValues","newByKey","object","stringKeys","orderRule","mode","compareValues","currentOrderRule","isAsc","aValue","bValue","mode1","mode2","orderRule1","orderRule2","isAsc1","isAsc2","array","array1","array2","areSortedArraysIntersecting","findIntersectionWithSet","chunkSize","cloneDeep","predicate","SUBSTITUTION_REGEX","PLURAL_OPTIONS","PLURAL_RULES","en","ar","ca","de","es","fa","fr","it","ko","ms","nl","pl","pt_BR","ru","tr","uk","uz","langPack","fallbackLangPack","currentLangCode","currentTimeFormat","getTranslation","cacheValue","cached","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","translateString","remoteLangPack","remote","fetchRemoteString","withFallback","newLangPack","fetchRemote","langInfo","rtl","default","sourceLangPacks","template","optionIndex","getPluralOption","translationSlices","initialValue","processTemplate","formatInteger","SAMPLE_RATE","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","wavWorker","onmessage","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","memoryCache","fetchPromises","progressCallbacks","cancellableCallbacks","mediaFormat","onProgress","callbackUniqueId","getProgressive","fetchFromCacheOrRemote","activeCallbacks","getFromMemory","cancelProgress","parentCallback","progressiveUrl","mediaPng","webpToPng","prepareMedia","mediaSource","MediaSource","streamUrl","sourceBuffer","addSourceBuffer","makeOnProgress","revokeObjectURL","endOfStream","appendBuffer","mediaData","serviceWorker","fullSize","controller","Bundles","LOAD_PROMISES","MEMORY_CACHE","Auth","Main","Extra","Calls","bundle","getDeviceToken","subscription","toJSON","endpoint","checkIfPushSupported","ServiceWorkerRegistration","Notification","permission","soundPlayedIds","playNotifySound","notificationSoundVolume","currentVolume","once","play","playNotifySoundDebounced","requestPermission","unsubscribeFromPush","dispatch","deleteDeviceToken","serviceWorkerRegistration","ready","pushManager","getSubscription","areSettingsLoaded","checkIfShouldResubscribe","userVisibleOnly","setDeviceToken","DOMException","ABORT_ERR","notifyAboutNewMessage","resultSettings","resultExceptions","loadNotificationSettings","hasFocus","checkIfShouldNotify","areNotificationsSupported","messageSender","messageAction","actionTargetMessage","targetUserIds","actionTargetUserIds","actionTargetChatId","actionTargetUsers","privateChatUserId","privateChatUser","isChat","senderName","getNotificationContent","imageHash","mediaLoader","getAvatar","badge","vibrate","onclick","close","onshow","closeMessageNotifications","notifyClientReady","PERMANENT_VERSION_KEY","AVAILABLE_VERSIONS","setPermanentWebVersion","version","hasPermanentWebVersion","PATTERN_PLACEHOLDER","DEFAULT_PATTERN","getCountryCodesByIso","phoneCodeList","country","iso2","getCountryFromPhoneNumber","possibleCountries","countryCode","codesWithPrefix","prefixes","prefix","bestMatches","formatPhoneNumber","pattern","numberWithoutCode","patterns","defaultPattern","stripped","getBestPattern","formatPhoneNumberWithCode","numberWithPlus","createMessageHash","messageList","typeOrThreadId","parseLocationHash","isType","fn","waitingTimeout","shouldRunFirst","shouldRunLast","interval","isPending","_args","setInterval","clearInterval","throttleWith","waiting","requestIdleCallback","rafPromise","fastRafCallbacks","fastRafPrimaryCallbacks","onTickEndCallbacks","onTickEndPrimaryCallbacks","beforeUnloadCallbacks","isPrimary","currentCallbacks","currentPrimaryCallbacks","onBeforeUnload","isLast","unshift","RE_NOT_LETTER","haystack","needle","needleWords","haystackLower","haystackWords","needleWord","haystackWord","promisifyRequest","oncomplete","onsuccess","onabort","defaultGetStoreFunc","defaultGetStore","dbName","storeName","dbp","userAgentData","indexedDB","databases","tryIdb","intervalId","onupgradeneeded","createObjectStore","txMode","db","transaction","objectStore","createStore","DC_IDS","hasStoredSession","withLegacy","userAuthJson","dcID","dcId","removeItem","sessionId","sessionJson","customStore","idb","idbKeys","getAllKeys","items","openCursor","continue","eachCursor","isInitialized","HEX_COLOR_REGEX","RGB_VARIABLES","lerp","start","end","interpolationRatio","colors","themeColors","property","hexToRgb","hex","r","g","applyColorAnimationStep","startIndex","endIndex","propertyColors","withAnimation","isDarkTheme","shouldAnimate","startAt","themeColorTag","querySelector","transition","formatFixedNumber","formatIntegerCompact","views","getFirstLetters","phrase","word","EMPTY_IMAGE_DATA_URI","initWebpWorker","wasmReady","requests","getDecodePromise","ImageData","putImageData","toBlob","createPng","webpToPngBase64","pngBlob","handleLibWebpMessage","WEBSYNC_URLS","WEBSYNC_VERSION","WEBSYNC_KEY","getTs","lastTimeout","authed","currentTs","canRedirect","ts","script","removeElement","URLSearchParams","saveSync","clearWebsync","IS_LANDSCAPE","isLandscape","initialHeight","currentWindowSize","updateSizes","isRefreshDisabled","handleResize","visualViewport","pageTop","vh","getIsKeyboardVisible","disableRefresh","enableRefresh","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","__webpack_modules__","m","getter","__esModule","getPrototypeOf","obj","ns","create","def","getOwnPropertyNames","definition","o","defineProperty","enumerable","chunkId","promises","u","miniCssF","globalThis","Function","done","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","doneFns","bind","head","toStringTag","scriptUrl","importScripts","currentScript","fullhref","existingLinkTags","dataHref","existingStyleTags","findStylesheet","linkTag","errorType","realHref","createStylesheet","miniCss","baseURI","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","handleWorkerMessage","registrations","getRegistrations","unregister","register","hasErrorKey","INITIAL_STATE","isLeftColumnShown","phoneCodes","general","groupCalls","activeChatFolder","recentEmojis","recent","greeting","featured","emojiKeywords","saved","inlineBots","byUsername","topPeers","topInlineBots","audioPlayer","playbackRate","notifications","dialogs","messageSendKeyCombo","autoLoadFileMaxSizeMb","shouldSuggestStickers","isConnectionStatusMinimized","light","isBlurred","patternColor","dark","activeReactions","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","reduceAvailableReactions","currentChatId","visibleUserIds","idsToSave","currentChat","mainThread","activeGroupCallId","isGroupCallPanelHidden","isFallbackConfirmOpen","initialState","time","timeEnd","shouldAutoDownloadMediaFromContacts","shouldAutoDownloadMediaInPrivateChats","shouldAutoDownloadMediaInGroups","shouldAutoDownloadMediaInChannels","shouldAutoPlayVideos","shouldAutoPlayGifs","migrateCache","parsedMessageList","readCache","loadCache","STORAGE_KEY","tabKey","SITE_FONTS","preloadFonts","font","fonts","load","preloadAvatars","preloadTasks","main","reactionThumbsPath","telegramLogoPath","authCode","monkeyPath","authPassword","background","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","leftColumnWidth","setIsUiReady","isReady","markReady","shouldRenderMask","safePreload","translation","setTranslation","getSuggestedLanguage","suggestedLanguage","MENU_HIDING_DURATION","inputRef","setFilter","filteredList","setFilteredList","updateFilter","filterValue","defaultName","getFilteredList","prevPhoneCodeList","handleInput","handleInputKeyDown","DropdownMenu","handleTrigger","select","formEl","getElementById","scrollTo","top","scrollHeight","behavior","inputValue","Spinner","MenuItem","isPreloadInitiated","setAuthPhoneNumber","setAuthRememberMe","loadNearestCountry","loadCountryList","clearAuthError","goToAuthQrCode","continueText","useLangString","setCountry","setPhoneNumber","isTouched","setIsTouched","lastSelection","setLastSelection","markIsLoading","unmarkIsLoading","fullNumber","canSubmit","parseFullNumber","newFullNumber","suggestedCountry","selectedCountry","handleLangChange","setSelectionRange","isJustPastedRef","handlePaste","handleCountryChange","handlePhoneNumberChange","selectionStart","selectionEnd","shouldFixSafariAutoComplete","handleKeepSessionChange","isAuthReady","onSubmit","InputText","Checkbox","Button","Loading","AuthCode","useModuleLoader","AuthPassword","AuthRegister","G","H","B","QrCreator","h","J","level","O","C","lineTo","arcTo","moveTo","z","v","N","K","P","fillStyle","fillRect","left","beginPath","q","D","E","R","I","F","colorStops","createLinearGradient","apply","createRadialGradient","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","HTMLCanvasElement","clearRect","write","S","multiply","L","M","Q","returnToAuthPhoneNumber","qrCodeRef","token","isMobile","windowSize","AuthQrCode","appInactivePath","renderMain","disconnect","markInactive","TeactDOM"],"sourceRoot":""}