telegram-tt/dist/main.a370659192d9281c47be.js.map
Alexander Zinchuk d5c70fb42e [Build]
2021-12-31 18:37:46 +01:00

1 line
768 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.a370659192d9281c47be.js","mappings":"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,GACdhtC,EACAitC,GAEA,MAAO,IACFjtC,EACHktC,QAAS,IACJltC,EAAOktC,QACVD,gBAAAA,IAKC,SAASE,GAAiBntC,EAAqBlI,GACpD,MAAO,IACFkI,EACHktC,QAAS,IACJltC,EAAOktC,QACVE,UAAWt1C,IAKV,SAASu1C,GAAertC,EAAqBstC,GAClD,MAAO,IACFttC,EACHktC,QAAS,IACJltC,EAAOktC,QACVI,KAAAA,IAKC,SAASC,GAAsBvtC,EAAqB1P,GACzD,IAAKA,EAAQ6E,UAAY7E,EAAQ6E,QAAQgG,QACvC,OAAO6E,EAET,MAAM,MACJ/J,EADI,KAEJrB,EAFI,OAGJoE,EAHI,SAIJC,EAJI,OAKJypB,EALI,SAMJ8qB,GACEl9C,EAAQ6E,QAAQgG,QACpB,MAAO,IACF6E,EACHktC,QAAS,IACJltC,EAAOktC,QACVO,eAAgB,CACdx3C,MAAAA,EACArB,KAAAA,EACA44C,SAAAA,EACAx0C,OAAAA,EACAC,SAAAA,EACAypB,OAAAA,KAMD,SAASgrB,GAAkB1tC,EAAqB2tC,GACrD,MAAO,IACF3tC,EACHktC,QAAS,IACJltC,EAAOktC,QACVU,kBAAmB,IACdD,KAMJ,SAASE,GAAe7tC,EAAqB8tC,GAClD,MAAO,IACF9tC,EACHktC,QAAS,IACJltC,EAAOktC,WACPY,IAKF,SAASC,GACd/tC,EACAguC,EACA19C,GAEA,IAAK09C,IAAY19C,EACf,MAAO,IACF0P,EACHktC,QAAS,IACJltC,EAAOktC,QACVc,aAASz0C,IAKf,MAAQ4B,QAAS8yC,GAAmB39C,EAAQ6E,SACtC,SAAEq4C,EAAF,KAAY54C,EAAZ,MAAkBqB,GAAWg4C,GAAkB,GAErD,MAAO,IACFjuC,EACHktC,QAAS,IACJltC,EAAOktC,QACVc,QAAS,IACJA,EACHR,SAAAA,EACA54C,KAAAA,EACAqB,MAAAA,KAMD,SAASi4C,GAAaluC,GAC3B,MAAO,IACFA,EACHktC,QAAS,IAIN,SAASiB,GAAanuC,GAC3B,MAAO,IACFA,EACHktC,QAAS,IACJltC,EAAOktC,QACVkB,oBAAoB,M,sOCvHnB,SAASC,EAAWruC,EAAqB9H,GAC9C,OAAO8H,EAAO2kB,MAAMF,KAAKvsB,GAGpB,SAASo2C,EAAetuC,EAAqB/F,GAClD,MAAMgG,GAASouB,EAAAA,EAAAA,IAAqBp0B,GACpC,QAAKgG,IAIEE,EAAAA,EAAAA,IAAWH,EAAQC,GAGrB,SAASsuC,EAAqBvuC,EAAqB9H,GACxD,OAAOA,IAAW8H,EAAOsjB,cAGpB,SAASkrB,EAAoBxuC,EAAqB/F,GACvD,MAAMO,EAAO8zC,EAAetuC,EAAQ/F,GACpC,OAAOO,IAAQyjC,EAAAA,EAAAA,IAAUzjC,GAGpB,SAASi0C,EAAkBzuC,GAChC,OAAOtP,OAAOsvB,OAAOhgB,EAAO2kB,MAAMF,MAAMwS,MAAK,EAAGyX,UAAAA,KAAyBA,IAGpE,SAASC,EAAsB3uC,EAAqB/F,GACzD,KAAIF,EAAAA,EAAAA,IAASE,EAAKnC,OAAOm2B,EAAAA,EAAAA,IAAch0B,IAAUA,EAAK0rB,SAItD,OAAK1rB,EAAK0rB,SAASipB,SAAW30C,EAAK0rB,SAASipB,QAAQx8C,SAAWgX,EAAAA,GAIxDnP,EAAK0rB,SAASipB,QAAQtyC,QAAO,CAACuyC,GAAe5uC,OAAAA,KAEhDA,IAAWD,EAAOsjB,eACftjB,EAAOwkB,MAAMC,KAAKxkB,KAClB89B,EAAAA,EAAAA,IAAa/9B,EAAOwkB,MAAMC,KAAKxkB,GAASD,EAAOwkB,MAAM2lB,aAAalqC,IAE9D4uC,EAAc,EAGhBA,GACN,GAbM50C,EAAK0rB,SAASkpB,YAgBlB,SAASC,EAAc9uC,EAAqB9H,GACjD,MAAM+B,EAAOo0C,EAAWruC,EAAQ9H,GAC1B+H,EAAShG,IAAQo0B,EAAAA,EAAAA,IAAqBp0B,GACtCO,EAAOyF,IAAUE,EAAAA,EAAAA,IAAWH,EAAQC,GAC1C,GAAKzF,IAASyjC,EAAAA,EAAAA,IAAUzjC,GAIxB,OAAOA,EAGF,SAASu0C,EAA0B/uC,EAAqB9H,GAC7D,MAAM+B,EAAOo0C,EAAWruC,EAAQ9H,GAC1B82C,EAAMF,EAAc9uC,EAAQ9H,GAClC,IAAK+B,IAAS+0C,EACZ,OAAO,EAGT,GAAI/0C,EAAK60B,cAAemJ,EAAAA,EAAAA,IAAsBh+B,EAAK60B,aACjD,OAAO,EAGT,MAAMmgB,EAAcjvC,EAAO86B,SAASqG,SAASjpC,GAC7C,IAAK+2C,EACH,OAAO,EAGT,MAAM,UAAElU,GAAckU,EAAY7N,YAAYjwC,EAAAA,KAAmB,GACjE,OAAO4pC,IAAcA,EAAU3oC,OAG1B,SAAS88C,EAA2BlvC,GACzC,OAAO5I,QAAQ4I,EAAO2kB,MAAMyO,QAAQlB,QAG/B,SAASid,EAAmBnvC,EAAqB9H,EAAgBhK,GACtE,MAAM,QAAEklC,GAAYpzB,EAAO2kB,MAC3B,GAAIz2B,EAAM,CACR,MAAMkhD,EAAahc,EAAQllC,GAC3B,OAAOkJ,QAAQg4C,GAAcA,EAAW51C,SAAStB,IAGnD,OAAOxH,OAAOsvB,OAAOoT,GAAS3f,MAAM47B,GAASA,GAAQA,EAAK71C,SAAStB,KAG9D,SAASyoC,EAAmB3gC,EAAqB9H,GACtD,MAAM+B,EAAOo0C,EAAWruC,EAAQ9H,GAChC,GAAK+B,GAASk1C,EAAmBnvC,EAAQ9H,GAIzC,OAAO+B,EAAK82B,WAAapkB,EAAAA,GAAqB,WAAa,SAGtD,SAAS2iC,EAAiBtvC,EAAqB+wB,GACpD,OAAO/wB,EAAOuvC,YAAY9qB,KAAKsM,GAe1B,SAASye,EAAmBxvC,EAAqB9H,EAAgB64B,EAAWrkB,EAAAA,IACjF,MAAM,OAAEwlB,EAAF,SAAUC,GAAanyB,EAAO2kB,MAAM0O,iBAE1C,GAAItC,IAAarkB,EAAAA,GACf,QAASwlB,GAAUA,EAAO14B,SAAStB,GAGrC,GAAI64B,IAAapkB,EAAAA,GACf,QAASwlB,GAAYA,EAAS34B,SAAStB,GAGzC,MAAQusB,KAAMgrB,GAAoBzvC,EAAOuvC,aAEnC,cAAEtd,GAAkBwd,EAAgB1e,IAAa,GACvD,QAASkB,GAAiBA,EAAcz4B,SAAStB,GAI5C,SAASw3C,EAAqB1vC,EAAqBnC,GACxD,MAAM8xC,EAAkB9xC,EAASV,cACjC,OAAOzM,OAAOsvB,OAAOhgB,EAAO2kB,MAAMF,MAAMwS,MACrCh9B,GAASA,EAAK4D,UAAY5D,EAAK4D,SAASV,gBAAkBwyC,IAKxD,SAASC,EAA0B5vC,GACxC,MAAM6vC,EAAgB7vC,EAAO2kB,MAAMyO,QAAQlB,OAC3C,IAAK2d,EACH,OAAO,EAGT,MAAMlrB,EAAQ3kB,EAAO2kB,MAAMF,KACrBwM,GAAiBtH,EAAAA,EAAAA,GAAqB3pB,GACtCkxB,GAAmB4e,EAAAA,EAAAA,GAAuB9vC,GAEhD,OAAO6vC,EAAcvzC,QAAO,CAACod,EAAKxhB,KAChC,MAAM+B,EAAO0qB,EAAMzsB,GAEnB,QACE+B,GACGA,EAAKu4B,aACLv4B,EAAKm4B,WACJn4B,EAAKw1B,aACLx1B,EAAKs1B,eACLt1B,EAAKo4B,sBAAwBrB,EAAAA,EAAAA,IAAkB/2B,EAAMg3B,EAAgBC,GAKpExX,EAHEA,EAAMzf,EAAKu4B,cAInB,GAGE,SAASud,EAAyB/vC,GACvC,OAAO5I,QAAQi3C,EAAWruC,EAAQwM,EAAAA,KAG7B,SAASwjC,EAAahwC,EAAqB9H,GAAgB,MAChE,MAAM+B,EAAOo0C,EAAWruC,EAAQ9H,GAChC,IAAK+B,EAAM,OAEX,MAAMnC,EAAKmC,MAAAA,GAAH,UAAGA,EAAM0rB,gBAAT,aAAG,EAAgBsqB,SAC3B,OAAKn4C,GAEEqI,EAAAA,EAAAA,IAAWH,EAAQlI,IAAOu2C,EAAWruC,EAAQlI,QAFpD,I,+lCCzLK,SAASo4C,EAA2BlwC,GACzC,OAAOA,EAAOqnC,SAAS93B,OAGlB,SAAS4gC,EAAuBnwC,GACrC,OAAOA,EAAOgoC,KAAKz4B,OAGd,SAAS6gC,EAAiBpwC,EAAqBlI,GACpD,OAAOkI,EAAOqnC,SAASC,SAASxvC,GAG3B,SAASu4C,EAA4BrwC,EAAqBswC,GAC/D,OAAO5/C,OAAOsvB,OAAOhgB,EAAOqnC,SAASC,UAAUrQ,MAAM1lB,GAAMA,EAAE++B,UAAUnzC,gBAAkBmzC,EAAUnzC,gBAG9F,SAASqrC,EAAuBxoC,EAAqBzB,GAC1D,MAAMgyC,EAAc7/C,OAAOsvB,OAAOhgB,EAAOqnC,SAASC,UAClD,IAAIkJ,EAAiC,GAUrC,OATAD,EAAYx0C,SAAQ,EAAG00C,MAAAA,MACrB,IAAKA,EACH,OAEF,MAAMpJ,EAAWoJ,EAAMlyC,GACnB8oC,IACFmJ,EAAmBA,EAAiBl2B,OAAO+sB,OAGxCmJ,EAGF,SAASE,EAAoB1wC,EAAqBzB,GACvD,MAAM,eAAE6pC,GAAmBpoC,EAC3B,IAAKooC,IAAmBA,EAAef,SACrC,OAIF,MAAMsJ,EAAepyC,EAAMlK,QAAQ,IAAU,IAE7C,OAAO+zC,EAAef,SAASpQ,MAAMp8B,GAAYA,EAAQ0D,QAAUA,GAAS1D,EAAQ0D,QAAUoyC,I,uBCHzF,SAAStN,EAAyBrjC,GACvC,MAAM,aAAE+gC,GAAiB/gC,EAAO86B,SAEhC,GAAIiG,EAAa3uC,OACf,OAAO2uC,EAAaA,EAAa3uC,OAAS,GAMvC,SAASw+C,EAAkB5wC,GAChC,MAAM,OAAE9H,GAAWmrC,EAAyBrjC,IAAW,GAEvD,OAAO9H,GAASm2C,EAAAA,EAAAA,IAAWruC,EAAQ9H,QAAUqB,EAGxC,SAASsoC,EAAmB7hC,EAAqB9H,GAAgB,MACtE,iBAAO8H,EAAO86B,SAASqG,SAASjpC,UAAhC,aAAO,EAAkCusB,KAGpC,SAAS2d,EAAwBpiC,EAAqB9H,GAAgB,MAC3E,iBAAO8H,EAAO6kC,kBAAkB1D,SAASjpC,UAAzC,aAAO,EAA2CusB,KAG7C,SAASosB,EACd7wC,EACA9H,EACAo3B,EACAxW,GAEA,MAAMm2B,EAAcjvC,EAAO86B,SAASqG,SAASjpC,GAC7C,IAAK+2C,EACH,OAGF,MAAM6B,EAAS7B,EAAY7N,YAAY9R,GACvC,OAAKwhB,EAIEA,EAAOh4B,QAJd,EAOK,SAAS8pB,EAAgB5iC,EAAqB9H,EAAgBo3B,GACnE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,aAG9C,SAASwT,EAAkB9iC,EAAqB9H,EAAgBo3B,GACrE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,eAG9C,SAAS6W,EACdnmC,EAAqB9H,EAAgBo3B,EAAkBqW,GAEvD,OAAQA,GACN,IAAK,SACH,OAAO3C,EAAkBhjC,EAAQ9H,EAAQo3B,GAC3C,IAAK,SACH,OAAO2T,EAAgBjjC,EAAQ9H,GACjC,IAAK,YACH,OAAO4rC,EAAmB9jC,EAAQ9H,IAMjC,SAAS8qC,EAAkBhjC,EAAqB9H,EAAgBo3B,GACrE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,eAG9C,SAAS2T,EAAgBjjC,EAAqB9H,GACnD,OAAO24C,EAAkB7wC,EAAQ9H,EAAQ/G,EAAAA,GAAgB,aAGpD,SAAS2yC,EAAmB9jC,EAAqB9H,GACtD,OAAO24C,EAAkB7wC,EAAQ9H,EAAQ/G,EAAAA,GAAgB,gBAGpD,SAAS4/C,EAAmB/wC,EAAqB9H,EAAgBo3B,GACtE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,gBAG9C,SAAS0hB,EAAmBhxC,EAAqB9H,EAAgBo3B,GACtE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,gBAG9C,SAAS2hB,EAAgBjxC,EAAqB9H,EAAgBo3B,GACnE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,aAG9C,SAAS4hB,EAAyBlxC,EAAqB9H,GAC5D,OAAO24C,EAAkB7wC,EAAQ9H,EAAQ/G,EAAAA,GAAgB,sBAGpD,SAASggD,EAAYnxC,EAAqB9H,EAAgBo3B,GAC/D,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,SAG9C,SAAS8hB,EAAgBpxC,EAAqB9H,EAAgBo3B,GACnE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,aAG9C,SAASqT,EAAiB3iC,EAAqB9H,EAAgBo3B,GACpE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,cAG9C,SAAS+hB,EAAqBrxC,EAAqB9H,EAAgBo3B,GACxE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,kBAG9C,SAASgiB,EAAiBtxC,EAAqB9H,EAAgBo3B,GACpE,OAAOuhB,EAAkB7wC,EAAQ9H,EAAQo3B,EAAU,cAG9C,SAASiiB,EAAuBvxC,EAAqB9H,EAAgBo3B,GAC1E,GAAIA,IAAan+B,EAAAA,GACf,OAAOk9C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAG5B,MAAMwqC,EAAaC,EAAiB3iC,EAAQ9H,EAAQo3B,GACpD,OAAKoT,GAIE2L,EAAAA,EAAAA,IAAWruC,EAAQ0iC,EAAW8O,iBAAmBt5C,QAJxD,EAOK,SAASu5C,EAAyBzxC,EAAqB9H,EAAgBo3B,GAC5E,GAAIA,IAAan+B,EAAAA,GACf,OAGF,MAAMuxC,EAAaC,EAAiB3iC,EAAQ9H,EAAQo3B,GACpD,OAAKoT,EAIEA,EAAWgP,kBAJlB,EAOK,SAASC,EAAsB3xC,EAAqB9H,EAAgB5H,GACzE,MAAM2+C,EAAcjvC,EAAO86B,SAASqG,SAASjpC,GAC7C,IAAK+2C,EACH,OAGF,MAAM,iBAAE3X,EAAF,oBAAoBsa,GAAwBthD,EAClD,OAAKgnC,GAAqBsa,EAInBlhD,OAAOsvB,OAAeivB,EAAY7N,aAAanK,MAAM6Z,GACnDA,EAAOpO,aACXpL,GAAoBA,IAAqBwZ,EAAOpO,WAAWgP,cACxDE,GAAuBA,IAAwBd,EAAOpO,WAAWgP,qBAPzE,EAYK,SAASG,EAA8B7xC,EAAqB9H,EAAgB5H,GACjF,MAAM8yC,EAAqBC,EAAyBrjC,GACpD,IAAKojC,EACH,OAAO,EAGT,MAAM,WAAEV,GAAeiP,EAAsB3xC,EAAQ9H,EAAQ5H,IAAY,GACzE,OACE4H,IAAWkrC,EAAmBlrC,SAE3BkrC,EAAmB9T,WAAan+B,EAAAA,IAC7BuxC,GAAcU,EAAmB9T,WAAaoT,EAAWpT,UAK5D,SAASwiB,EAAuB9xC,EAAqB9H,EAAgBo3B,GAC1E,MAAMyT,EAAcC,EAAkBhjC,EAAQ9H,EAAQo3B,GACtD,IAAKyT,IAAgBA,EAAY3wC,OAC/B,OAAO,EAGT,IAAIu0C,EAEJ,GAAIrX,IAAan+B,EAAAA,GAAgB,CAC/B,MAAM8I,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAChC,IAAK+B,IAASA,EAAK60B,YACjB,OAAO,EAGT6X,EAAgB1sC,EAAK60B,YAAYh3B,OAC5B,CACL,MAAM4qC,EAAaC,EAAiB3iC,EAAQ9H,EAAQo3B,GACpD,IAAKoT,IAAeA,EAAWiE,cAC7B,OAGFA,EAAgBjE,EAAWiE,cAI7B,OAAIA,GAAiBj8B,EAAAA,KAA0Bi5B,EAAkB3jC,EAAQ9H,EAAQyuC,IAI1E5D,EAAYA,EAAY3wC,OAAS,IAAMu0C,EAGzC,SAAShD,EAAkB3jC,EAAqB9H,EAAgB5J,GACrE,MAAMyjD,EAAelQ,EAAmB7hC,EAAQ9H,GAEhD,OAAO65C,EAAeA,EAAazjD,QAAaiL,EAG3C,SAASy4C,EAAuBhyC,EAAqB9H,EAAgB5J,GAC1E,MAAMyjD,EAAe3P,EAAwBpiC,EAAQ9H,GAErD,OAAO65C,EAAeA,EAAazjD,QAAaiL,EAG3C,SAAS04C,EACdjyC,EAAqB9H,EAAgBo3B,EAAkBqW,GAEvD,GAAwB,cAApBA,EAAiC,CACnC,MAAMr3C,EAAY4iD,EAAyBlxC,EAAQ9H,GACnD,OAAO5J,EAAY0jD,EAAuBhyC,EAAQ9H,EAAQ5J,QAAaiL,EAClE,CACL,MAAMjL,EAAY2iD,EAAgBjxC,EAAQ9H,EAAQo3B,GAClD,OAAOhhC,EAAYq1C,EAAkB3jC,EAAQ9H,EAAQ5J,QAAaiL,GAI/D,SAAS24C,EAA0BlyC,EAAqBmyC,GAC7D,IAAIC,EAGJ,IAAK,MAAML,KAAgBrhD,OAAOsvB,OAAOhgB,EAAO86B,SAASqG,UAAW,CAClE,MAAM,KAAE1c,GAASstB,EAIjB,GAHAK,EAAkB1hD,OAAOsvB,OAAOyE,GAAMwS,MAAM3mC,GACnCA,EAAQ6E,QAAQ8gC,MAAQ3lC,EAAQ6E,QAAQ8gC,KAAKn+B,KAAOq6C,IAEzDC,EACF,MAIJ,OAAOA,EAGF,SAASC,EAAuBryC,EAAqB9H,GAC1D,MAAQA,OAAQo6C,EAAV,UAAyBhkD,GAAc0R,EAAOklC,gBAAkB,GAEtE,OAAOoN,IAAkBp6C,EAAS5J,OAAYiL,EAGzC,SAASg5C,EAAuBvyC,EAAqB1P,GAC1D,MAAMkiD,EAAYH,EAAuBryC,EAAQ1P,EAAQ4H,QAEzD,QAAOs6C,IAAYA,IAAcliD,EAAQwH,IAAM06C,IAAcliD,EAAQslC,iBAQhE,SAAS6c,EACdzyC,EAAqB1P,EAAqBoiD,GAAkB,GAE5D,OARK,SAA+B1yC,EAAqB1P,GACzD,MAAM,wBAAEqiD,IAA4BtE,EAAAA,EAAAA,IAAWruC,EAAQ1P,EAAQ4H,SAAW,GAC1E,OAAO8/B,EAAAA,EAAAA,IAAe1nC,KAAaqiD,GAA2BA,EAA0BriD,EAAQwH,GAM3F86C,CAAsB5yC,EAAQ1P,IAAaoiD,GAIzC5a,EAAAA,EAAAA,IAAgBxnC,GAHd,OAMJ,SAASuiD,EAAa7yC,EAAqB1P,GAChD,MAAM,SAAEsnC,GAAatnC,EACrB,GAAKsnC,EAIL,OAAO79B,EAAAA,EAAAA,IAAS69B,IAAYz3B,EAAAA,EAAAA,IAAWH,EAAQ43B,IAAYyW,EAAAA,EAAAA,IAAWruC,EAAQ43B,GAGzE,SAASkb,EAAsB9yC,EAAqB1P,GACzD,MAAM,YAAEknC,GAAgBlnC,EACxB,GAAKknC,EAIL,OAAIA,EAAYub,eAAiBvb,EAAYgM,YACpC6K,EAAAA,EAAAA,IAAWruC,EAAQw3B,EAAYgM,YAC7BhM,EAAYwb,cACd7yC,EAAAA,EAAAA,IAAWH,EAAQw3B,EAAYwb,gBAAiB3E,EAAAA,EAAAA,IAAWruC,EAAQw3B,EAAYwb,mBADjF,EAOF,SAASC,EAA4BjzC,EAAqB1P,EAAqBg/B,GAAkB,YACtG,MAAMr1B,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ1P,EAAQ4H,QACxC,IAAK+B,GAAQA,EAAKs1B,aAChB,MAAO,GAGT,MAAM2jB,GAAYn5C,EAAAA,EAAAA,IAASE,EAAKnC,IAC1Bq7C,GAAiB5E,EAAAA,EAAAA,IAAqBvuC,EAAQ1P,EAAQ4H,QACtDk7C,GAAerlB,EAAAA,EAAAA,IAAiB9zB,GAChCo5C,GAAerlB,EAAAA,EAAAA,IAAiB/zB,GAChCq5C,GAAYrlB,EAAAA,EAAAA,IAAch0B,GAC1Bs5C,GAAUvb,EAAAA,EAAAA,IAAe1nC,GACzBkjD,GAAwB9b,EAAAA,EAAAA,IAA6BpnC,GACrDmjD,GAAQtc,EAAAA,EAAAA,IAAa7mC,GACrBojD,GAAWjc,EAAAA,EAAAA,IAAgBnnC,IAC3B,QAAE6E,GAAY7E,EAKdqjD,GAH8BR,GAC9BE,IAAgBpkB,EAAAA,EAAAA,IAAiBh1B,EAAM,gBACvCq5C,IAAarkB,EAAAA,EAAAA,IAAiBh1B,EAAM,kBAInCqkC,EAAAA,EAAAA,GAAct+B,EAAOmnB,kBAAoB72B,EAAQugC,KApUxB,WAsU5B17B,EAAQ0F,SAAW1F,EAAQ6gC,SAAW7gC,EAAQ8gC,MAAQ9gC,EAAQ2D,QAAU3D,EAAQ2gC,OAAhF,UACI3gC,EAAQyF,aADZ,OACI,EAAeg8B,YAEjBW,EAAAA,EAAAA,IAAmBjnC,KACnBA,EAAQsjD,SAGRC,GAAYN,IAAYC,IAAyBnkB,EAAAA,EAAAA,IAAiBp1B,EAAMq1B,GAExEwkB,EAAmBZ,GACvBj5C,EAAKy1B,YACA4jB,KAAcpkB,EAAAA,EAAAA,IAAkBj1B,EAAM,iBACxCg1B,EAAAA,EAAAA,IAAiBh1B,EAAM,eAG5B,IAAI85C,GAAUR,IAAYC,IAA0BE,GAAYI,EAC5DE,GAAW,EAEf,MAAMC,EAAmBhR,EAAgBjjC,EAAQ/F,EAAKnC,IAElDi8C,IACFC,EAAW58C,QAAQ68C,GAAoBA,EAAiBz6C,SAASlJ,EAAQwH,KACzEi8C,GAAUC,GAGZ,MAAME,GAAaX,IAAYC,IAC7BN,GACGO,GACAL,GACAn5C,EAAKy1B,YACLT,EAAAA,EAAAA,IAAiBh1B,EAAM,mBAGtBk6C,GAAajB,IAAcO,EAE3BW,EAAkBF,IACrBhB,IAAcC,GACXC,IACFK,IAASxkB,EAAAA,EAAAA,IAAiBh1B,EAAM,mBAAqBA,EAAKy1B,YAIxD2kB,GAAWd,IAAYG,GAAYC,IACvCF,GACIH,IAAcr5C,EAAKy1B,YAAaT,EAAAA,EAAAA,IAAiBh1B,EAAM,kBAGvDq6C,GAAcf,IAAYG,EAE1Ba,EAAan9C,QAAQ9G,EAAQ6E,QAAQ0F,SACrC25C,EAAqBD,GDhatB,SAAiCv0C,EAAqBnF,GAC3D,MAAM,SAAEwsC,GAAarnC,EAAOqnC,SAASoN,SACrC,OAAOpN,GAAYA,EAAS5zB,MAAK,EAAG3b,GAAAA,KAASA,IAAO+C,EAAQ/C,KC8ZnB48C,CAAwB10C,EAAQ1P,EAAQ6E,QAAQ0F,SACnF85C,GAAkBjB,GAAYa,IAAeC,EAC7CI,GAAoBlB,GAAYc,EAChCK,GAAWnB,EACXoB,GAAepB,IAAaJ,GAAaD,GACzC0B,GAAarB,EAEbsB,EAAc59C,SAAQ,UAAAjC,EAAQuhC,eAAR,eAAiB9/B,YAAjB,UAA6BzB,EAAQuhC,eAArC,aAA6B,EAAiB97B,SAA9C,UAAuDzF,EAAQuhC,eAA/D,aAAuD,EAAiB/7B,QAC/FxF,EAAQ2gC,OAAS3gC,EAAQ4gC,OAAS5gC,EAAQwF,OAASxF,EAAQyF,OAASzF,EAAQyB,UAAYzB,EAAQ0F,SAmBrG,MAAO,CACLo6C,UAlBgB,CAChBpB,EACAQ,EACAN,EACAC,EACAG,EACAD,EACAE,EACAE,EACAK,EACAC,EACAC,EACAC,EACAC,EACAC,GACAlT,OAAOoT,IAAaA,IAIpBrB,SAAAA,EACAQ,QAAAA,EACAN,OAAAA,EACAC,SAAAA,EACAG,UAAAA,EACAD,UAAAA,EACAE,gBAAAA,EACAE,WAAAA,EACAK,eAAAA,EACAC,iBAAAA,EACAC,QAAAA,EACAC,YAAAA,EACAC,UAAAA,EACAC,YAAAA,GAKG,SAASG,GAAgCn1C,GAC9C,MAAQ87B,WAAYkK,GAAuBhmC,EAAOwlC,kBAAoB,IAChE,OAAEttC,EAAF,SAAUo3B,GAAa+T,EAAyBrjC,IAAW,GAC3D+xC,EAAe75C,GAAU2pC,EAAmB7hC,EAAQ9H,GAC1D,IAAK65C,IAAiB/L,IAAuB1W,EAC3C,MAAO,GAGT,MAAM8lB,EAAiBpP,EACpBzrC,KAAKzC,GAAOi6C,EAAaj6C,IAAOm7C,EAA4BjzC,EAAQ+xC,EAAaj6C,GAAKw3B,KACtF70B,OAAOrD,SAEV,MAAO,CACL88C,UAAWkB,EAAetT,OAAO9gB,GAAYA,EAAQkzB,YACrDE,gBAAiBgB,EAAetT,OAAO9gB,GAAYA,EAAQozB,mBAIxD,SAASiB,GAAgCr1C,GAC9C,MAAQ87B,WAAYkK,GAAuBhmC,EAAOwlC,kBAAoB,IAChE,OAAEttC,EAAF,SAAUo3B,GAAa+T,EAAyBrjC,IAAW,GAC3D+xC,EAAe75C,GAAU2pC,EAAmB7hC,EAAQ9H,GAC1D,SAAK65C,GAAiB/L,GAAuB1W,IAItB0W,EACpBzrC,KAAKzC,GAAOi6C,EAAaj6C,IAAOm7C,EAA4BjzC,EAAQ+xC,EAAaj6C,GAAKw3B,KACtF70B,OAAOrD,SAEY0qC,OAAO9gB,GAAYA,EAAQmzB,YAG5C,SAASmB,GAAkCt1C,GAChD,MAAQ87B,WAAYkK,GAAuBhmC,EAAOwlC,kBAAoB,IAChE,OAAEttC,EAAF,SAAUo3B,GAAa+T,EAAyBrjC,IAAW,GAC3D+xC,EAAe75C,GAAU2pC,EAAmB7hC,EAAQ9H,GAC1D,SAAK65C,GAAiB/L,GAAuB1W,IAItB0W,EACpBzrC,KAAKzC,GAAOi6C,EAAaj6C,IAAOm7C,EAA4BjzC,EAAQ+xC,EAAaj6C,GAAKw3B,KACtF70B,OAAOrD,SAEYqc,MAAMuN,GAAYA,EAAQg0B,cAG3C,SAASO,GAAoBv1C,EAAqB1P,GACvD,MAAMklD,EAAex1C,EAAOy1C,gBAAgBtU,SAAS7wC,EAAQ4H,QAC7D,QAAOs9C,GAAeA,EAAah8C,SAASlJ,EAAQwH,IAG/C,SAAS49C,GAAwB11C,EAAqB9H,GAC3D,OAAO8H,EAAOy1C,gBAAgBtU,SAASjpC,IAAWuxC,EAAAA,EAG7C,SAASkM,GAAqB31C,EAAqB1P,GAAqB,MAC7E,iBAAO0P,EAAO41C,YAAYC,iBAAiBvlD,EAAQslC,iBAAmBtlC,EAAQwH,WAA9E,aAAO,EAA4EytB,SAG9E,SAASuwB,GAAqB91C,EAAqB9H,EAAgBo3B,GACxE,GAAIA,IAAan+B,EAAAA,GAAgB,CAC/B,MAAM8I,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAChC,IAAK+B,EACH,OAIF,IAAKA,EAAK87C,uBACR,OAGF,OAAK97C,EAAK60B,aAINkJ,EAAAA,EAAAA,IAAe/9B,EAAK60B,aACf70B,EAAK60B,YAAYh3B,GAInBlG,KAAKy0C,IAAIpsC,EAAK60B,YAAYh3B,GAAImC,EAAK87C,wBARjC97C,EAAK87C,uBAST,CACL,MAAMrT,EAAaC,EAAiB3iC,EAAQ9H,EAAQo3B,GACpD,IAAKoT,EACH,OAGF,OAAKA,EAAWqT,uBAKTnkD,KAAKy0C,IAAI3D,EAAWqT,uBAAwBrT,EAAWiE,eAAiBqP,EAAAA,GAJtEtT,EAAWgP,cAQjB,SAASuE,GAAoBj2C,EAAqB9H,EAAgBo3B,GACvE,MAAMr1B,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAEhC,GAAIo3B,IAAan+B,EAAAA,IACf,IAAK8I,EACH,WAEG,CACL,MAAMyoC,EAAaC,EAAiB3iC,EAAQ9H,EAAQo3B,GACpD,IAAKoT,QAC8BnpC,IAA7BmpC,EAAWiE,eAA+BjE,EAAWiE,gBAAkBjE,EAAWqT,uBACtF,OAIJ,MAAMlT,EAAcC,EAAkB9iC,EAAQ9H,EAAQo3B,GAChDyL,EAAY6H,EAAgB5iC,EAAQ9H,EAAQo3B,GAC5C7K,EAAOod,EAAmB7hC,EAAQ9H,GACxC,IAAKusB,IAAUoe,IAAe9H,EAC5B,OAGF,MAAMmb,EAAaJ,GAAqB91C,EAAQ9H,EAAQo3B,GACxD,IAAK4mB,GAAcj8C,GAAQA,EAAKw1B,YAC9B,OAGF,MAAM0mB,EAAgCj+C,IAAWsU,EAAAA,GAC7CxM,EAAOo2C,qBAAqB95C,QAAO,CAACqe,EAAK07B,KACjCA,EAAajiB,UAAYiiB,EAAav+C,GAAK6iB,EAAM07B,EAAav+C,GAAK6iB,IACzE,IACD,EAEL,SAAS27B,EAAoBljB,GAC3B,OAAOA,EAAQ6D,MAAMn/B,KAEfo+C,GAAcp+C,EAAKo+C,IAClBzxB,EAAK3sB,MACH2sB,EAAK3sB,GAAIs/B,YAAc3S,EAAK3sB,GAAIy+C,kBAClCz+C,EAAKq+C,IAKd,GAAItT,EAAa,CACf,MAAM2T,EAAQF,EAAoBzT,GAClC,GAAI2T,EACF,OAAOA,EAIX,GAAIzb,EAAW,CACb,MAAMyb,EAAQF,EAAoBvb,GAClC,GAAIyb,EACF,OAAOA,GAYN,SAASC,GAAyBz2C,GACvC,MAAM,gBAAE02C,GAAoB12C,EAC5B,OAAO5I,QAAQs/C,EAAgBC,cAG1B,SAASC,GAAsB52C,EAAqB1R,GACzD,MAAMuoD,EAAkBnmD,OAAOsvB,OAAOhgB,EAAO2kB,MAAMF,MAAMwS,MAAMh9B,IAC7Di0B,EAAAA,EAAAA,IAAgBj0B,IAASA,EAAK60B,aAAe70B,EAAK60B,YAAYh3B,KAAOxJ,IAEvE,GAAIuoD,EACF,OAAOA,EAAgB/+C,GAGzB,MAAM,SAAEqpC,GAAanhC,EAAO86B,SAC5B,OAAOpqC,OAAOkoB,KAAKuoB,GAAUlK,MAAM/+B,IACjC,MAAM+B,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAChC,OAAO+B,IAAQi0B,EAAAA,EAAAA,IAAgBj0B,IAASknC,EAASlnC,EAAKnC,IAAI2sB,KAAKn2B,MAI5D,SAASwoD,GAAqB92C,GACnC,MAAM,iBAAEwlC,GAAqBxlC,EAE7B,OAAO5I,QAAQouC,GAGV,SAASuR,GAAwB/2C,EAAqB1R,GAC3D,MAAM,WAAEwtC,GAAe97B,EAAOwlC,kBAAoB,GAClD,QAAK1J,GAIEA,EAAWtiC,SAASlL,GAGtB,SAAS0oD,GAAmCh3C,EAAqB9H,EAAgBk+B,GACtF,MAAM2b,EAAelQ,EAAmB7hC,EAAQ9H,GAChD,GAAK65C,EAIL,OAAOrhD,OAAOsvB,OAAO+xB,GAClBt3C,QAAQnK,GAAYA,EAAQ8lC,YAAcA,GAAa9lC,EAAQknC,cAC/Dj9B,KAAI,EAAGi9B,YAAAA,KAAkBA,EAAaiM,gBAGpC,SAASsC,GAA0B/lC,EAAqB9H,EAAgBk+B,GAC7E,MAAM2b,EAAelQ,EAAmB7hC,EAAQ9H,GAChD,GAAK65C,EAIL,OAAOrhD,OAAOkoB,KAAKm5B,GAChBx3C,IAAImmB,QACJjmB,QAAQ3C,GAAOi6C,EAAaj6C,GAAIs+B,YAAcA,IAG5C,SAAS6gB,GAA8Bj3C,EAAqB9H,EAAgBk+B,GACjF,MAAQ0F,WAAYob,GAAgBl3C,EAAOwlC,kBAAoB,GAC/D,IAAK0R,EACH,OAAO,EAGT,MAAMC,EAAWpR,GAA0B/lC,EAAQ9H,EAAQk+B,GAC3D,OAAO+gB,GAAYA,EAASrV,OAAOhqC,GAAOo/C,EAAY19C,SAAS1B,KAG1D,SAASs/C,GAA4Bp3C,GAC1C,MAAM,WAAE87B,GAAe97B,EAAOwlC,kBAAoB,GAElD,OAAO1J,EAAaA,EAAW1pC,OAAS,EAGnC,SAASilD,GACdr3C,EAAqB9H,GAErB,MAAM+B,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAChC,IAAK+B,EACH,OAGF,KAAKu0C,EAAAA,EAAAA,IAAoBxuC,EAAQ/F,GAC/B,OAGF,MAAM83C,EAAelQ,EAAmB7hC,EAAQ9H,GAC1C6qC,EAAcC,EAAkBhjC,EAAQ9H,EAAQ/G,EAAAA,IACtD,IAAK4gD,IAAiBhP,EACpB,OAGF,MAAMz0C,GAAYgpD,EAAAA,EAAAA,IAASvU,GAAcjrC,IAC/Bi6C,EAAaj6C,GAAIs/B,YAAchgC,QAAQ26C,EAAaj6C,GAAIy/C,mBAG5DC,GAAqBF,EAAAA,EAAAA,IAASvU,GAAcjrC,GACzCV,QAAQ26C,EAAaj6C,GAAI2/C,6BAGlC,OAAInpD,GAAakpD,GAAsBA,EAAqBlpD,OAA5D,EAIOA,EAAYyjD,EAAazjD,QAAaiL,EAGxC,SAASm+C,GAAuB13C,EAAqB1P,GAC1D,MAAM2J,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ1P,EAAQ4H,QACxC,IAAK+B,EACH,OAGF,MAAMrC,EAASi7C,EAAa7yC,EAAQ1P,GAE9BqnD,EAAUvgD,SAAQohC,EAAAA,EAAAA,IAAgBloC,KAAYipC,EAAAA,EAAAA,IAAuBjpC,IACrEsnD,EAAUxgD,SAAQqhC,EAAAA,EAAAA,IAAgBnoC,KAAYkpC,EAAAA,EAAAA,IAAuBlpC,IACrEunD,EAASzgD,SAAQ2hC,EAAAA,EAAAA,IAAgBzoC,KAAY0oC,EAAAA,EAAAA,IAAgB1oC,KAAYooC,EAAAA,EAAAA,IAAmBpoC,KAE5F,6BACJwnD,EADI,+BAEJC,EAFI,yBAGJC,EAHI,2BAIJC,EAJI,6BAKJC,EALI,+BAMJC,EANI,yBAOJC,EAPI,2BAQJC,EARI,4BASJC,EATI,8BAUJC,EAVI,wBAWJC,EAXI,0BAYJC,GACEz4C,EAAO6lB,SAAS+B,MAEpB,OAAI+vB,EACKe,GAAiB,CACtB14C,OAAAA,EACA/F,KAAAA,EACArC,OAAAA,EACA+gD,6BAA8Bb,EAC9Bc,+BAAgCb,EAChCc,yBAA0Bb,EAC1Bc,2BAA4Bb,IAI5BL,EACKc,GAAiB,CACtB14C,OAAAA,EACA/F,KAAAA,EACArC,OAAAA,EACA+gD,6BAA8BT,EAC9BU,+BAAgCT,EAChCU,yBAA0BT,EAC1BU,2BAA4BT,KAI5BR,GACKa,GAAiB,CACtB14C,OAAAA,EACA/F,KAAAA,EACArC,OAAAA,EACA+gD,6BAA8BL,EAC9BM,+BAAgCL,EAChCM,yBAA0BL,EAC1BM,2BAA4BL,IAOlC,SAASC,IAAiB,OACxB14C,EADwB,KAExB/F,EAFwB,OAGxBrC,EAHwB,6BAIxB+gD,EAJwB,+BAKxBC,EALwB,yBAMxBC,EANwB,2BAOxBC,IAUA,MAAMC,EAAqB3hD,QAAQQ,IACjCA,EAAOE,KAAOkI,EAAOsjB,gBAAiB01B,EAAAA,EAAAA,IAA0Bh5C,EAAQpI,KAG1E,OAAOR,QACJ2hD,GAAsBJ,IAClBI,GAAsBH,IAAkC7+C,EAAAA,EAAAA,IAASE,EAAKnC,KACvE+gD,IAA4B/qB,EAAAA,EAAAA,IAAY7zB,IACxC6+C,IAA8B7qB,EAAAA,EAAAA,IAAch0B,IAI7C,SAASg/C,GAAuBj5C,EAAqB1P,GAC1D,MAAMsK,GAAQ69B,EAAAA,EAAAA,IAAgBnoC,KAAYkpC,EAAAA,EAAAA,IAAuBlpC,GACjE,IAAKsK,EACH,OAGF,MAAM,kBACJs+C,EADI,gBAEJC,GACEn5C,EAAO6lB,SAAS+B,MAEdwxB,EAAQx+C,EAAMK,OAASL,EAAMg8B,QAEnC,OAAQsiB,IAAsBE,GAAWD,GAAmBC,EAGvD,SAASC,GAAyBr5C,GACvC,OAAOA,EAAO6lB,SAAS+B,MAAM0xB,mBAGxB,SAASC,GAA8Bv5C,GAC5C,MAAM,qBAAEo2C,GAAyBp2C,EAC3Bw5C,EAAQ5nD,KAAK+oB,OAAOy7B,EAAqB77C,KAAI,EAAGzC,GAAAA,KAASA,KAE/D,OAAOs+C,EAAqBnf,MAAK,EAAGn/B,GAAAA,KAASA,IAAO0hD,IAG/C,SAASC,GAAyBz5C,EAAqB1P,GAAsB,MAClF,QAAOA,IAAUA,EAAQopD,cAAR,WAAuBrL,EAAAA,EAAAA,IAAWruC,EAAQ1P,EAAQ4H,eAAlD,aAAuB,EAAoCwhD,cAGvE,SAASC,GAAuB35C,EAAqB9H,GAC1D,MAAM+B,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAC1B5H,EAAU2J,IAAQg0B,EAAAA,EAAAA,IAAch0B,GAAQ+F,EAAO86B,SAASsK,kBAAkBltC,QAAUqB,EAE1F,OAAOjJ,GAAWA,EAAQspD,WAAahoD,KAAKiP,MAAMrR,KAAKC,MAAQ,KAAQa,OAAUiJ,EC91B5E,SAASsgD,GAAwB75C,GACtC,MAAM,OAAE9H,EAAF,SAAUo3B,GAAa+T,EAAyBrjC,IAAW,GACjE,IAAK9H,IAAWo3B,EACd,OAGF,MAAMkc,GAAgBrP,EAAAA,EAAAA,IAAmBjkC,EAAQo3B,GAC3CwqB,EAAgB95C,EAAO0rC,gBAAgBC,gBAAgBH,GAC7D,OAAKsO,GAAkBA,EAAc7pC,SAI9B6pC,OAJP,EAOK,SAASC,GAA+B/5C,GAC7C,MAAM,SAAEmhC,GAAanhC,EAAOisC,kBACtB,OAAE/zC,GAAWmrC,EAAyBrjC,IAAW,GACjDg6C,EAAuBh6C,EAAOwkB,MAAM+kB,WAE1C,OAAOyQ,GAAwB7Y,EAAS6Y,GAAwBA,EAAuB9hD,EAGlF,SAAS+hD,GAAyBj6C,GACvC,MAAMk6C,EAASH,GAA+B/5C,GAC9C,GAAKk6C,EAIL,OAAOl6C,EAAOisC,iBAAiB9K,SAAS+Y,GC3BnC,SAASC,GAAiBn6C,EAAqB9H,GACpD,OAAO8H,EAAOusC,WAAWpL,SAASjpC,GAiB7B,SAASkiD,GAA4Bp6C,GAC1C,MAAM,OAAE9H,EAAF,SAAUo3B,GAAa+T,EAAyBrjC,IAAW,GACjE,IAAK9H,IAAWo3B,EACd,OAGF,IAAIv1B,EAAAA,EAAAA,IAAS7B,GACX,MAAO,OAGT,MAAM+B,GAAOo0C,EAAAA,EAAAA,IAAWruC,EAAQ9H,GAChC,OAAK+B,GAID6zB,EAAAA,EAAAA,IAAY7zB,GACP,QAGF,eARP,ECzBK,SAASogD,GAAwBr6C,GACtC,MAAM,YAAEs6C,GAAgBt6C,EACxB,OAAO5I,QAAQkjD,EAAYhsD,WAAagsD,EAAYC,eAG/C,SAASC,GAA4Bx6C,GAC1C,MAAM,MACJwkB,EADI,gBAEJi2B,EAFI,uBAGJC,GACE16C,EAEE26C,EAA2BD,IAA2BE,EAAAA,GAAAA,OACtDC,EH0lBD,SAAiC76C,GACtC,MAAM,YAAE86C,GAAgB96C,EACxB,OAAO5I,QAAQ0jD,EAAYxsD,WG5lBLysD,CAAwB/6C,GACxCg7C,EAAW5jD,SAAS6jD,EAAAA,IAA2BpB,GAAwB75C,IACvEk7C,EDfD,SAAiCl7C,GACtC,MAAM,OAAE9H,EAAF,SAAUo3B,GAAa+T,EAAyBrjC,IAAW,GACjE,IAAK9H,IAAWo3B,EACd,OAGF,MAAM6rB,EAAoBn7C,EAAOusC,WAAWpL,SAASjpC,GACrD,OAAKijD,GAAsBA,EAAkBlrC,SAItCkrC,OAJP,ECQqBC,CAAwBp7C,GAEvCq7C,OAA0C9hD,IAD1B22C,EAA2BlwC,GACXm1B,MAEhCmmB,OAAkC/hD,IADtB42C,EAAuBnwC,GACXm1B,OACtBj9B,OAAQqjD,GAAkBlY,EAAyBrjC,IAAW,GAChEg6C,EAAuBx1B,EAAM+kB,WAC7BiS,GAAuBtM,EAAAA,EAAAA,IAA2BlvC,GAClDy7C,EAAarkD,QAAQ4iD,GAAwBwB,GAE7CE,EADctkD,QAAQmkD,GAAiBC,IACXf,EAElC,OAAOI,EACLc,EAAAA,GAAAA,YACEX,EACFW,EAAAA,GAAAA,OACET,EACFS,EAAAA,GAAAA,WACEN,EACFM,EAAAA,GAAAA,cACEL,EACFK,EAAAA,GAAAA,UACEhB,EACFgB,EAAAA,GAAAA,cACEF,EACFE,EAAAA,GAAAA,SACED,EACFC,EAAAA,GAAAA,cACEpiD,EAGC,SAASqiD,GAAyB57C,GACvC,YAA+CzG,IAAxCihD,GAA4Bx6C,GAG9B,SAASusB,GAAYvsB,GAC1B,MAAM,MAAE+sB,EAAF,qBAAS8uB,GAAyB77C,EAAO6lB,SAAS+B,MAExD,OAAOi0B,GAAuBC,EAAAA,EAAAA,MAAmB/uB,EC7D5C,SAASgvB,GAA+B/7C,GAC7C,OAAOA,EAAOwqC,aAAarV,MCDtB,SAAS6mB,GAAoBh8C,GAClC,OAAOA,EAAOktC,QAAQh1C,OAGjB,SAAS+jD,GAAuBj8C,GACrC,OAAOA,EAAOktC,QAAQ5+C,UAGjB,SAAS4tD,GAAoBl8C,GAClC,OAAOA,EAAOktC,QAAQiP,OAGjB,SAASC,GAAuBp8C,GACrC,OAAOA,EAAOktC,QAAQE,UAGjB,SAASiP,GAA6Br8C,GAC3C,OAAOA,EAAOktC,QAAQoP,aAAet8C,EAAOktC,QAAQoP,aAAaC,oBAAiBhjD,EAG7E,SAASijD,GAAwBx8C,GACtC,OAAOA,EAAOktC,QAAQU,kB,+BCrBjB,SAASjkB,EAAqB3pB,GACnC,OAAOA,EAAO6lB,SAAS+B,MAGlB,SAASkoB,EAAuB9vC,GACrC,OAAOA,EAAO6lB,SAASqL,iB,yCCJlB,SAAS/wB,EAAWH,EAAqBC,GAC9C,OAAOD,EAAOwkB,MAAMC,KAAKxkB,GAGpB,SAASw8C,EAAiBz8C,EAAqBC,GACpD,OAAOD,EAAOwkB,MAAM2lB,aAAalqC,GAG5B,SAASy8C,EAAoB18C,EAAqBC,GAAgB,MACvE,MAAMzF,EAAO2F,EAAWH,EAAQC,GAEhC,OAAOzF,MAAAA,GAAP,UAAOA,EAAMmrB,gBAAb,aAAO,EAAgBskB,UAWlB,SAAS+O,EAA0Bh5C,EAAqBE,GAC7D,OAAOF,EAAOgpC,aAAehpC,EAAOgpC,YAAY5K,QAAQ5kC,SAAS0G,EAAWpI,I,6DCrBvE,IAAK6kD,EAMAC,EA6IAC,EAyDAC,EAYAC,EASApB,EAWAqB,EAYAC,EAMAC,EAOA13B,EAOA23B,EAOAvC,EAWAwC,EAMAC,E,kKApSAV,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,SA6IAC,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,uB,CAAAA,IAAAA,EAAAA,K,SAyDAC,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,SASApB,GAAAA,EAAAA,EAAAA,SAAAA,GAAAA,WAAAA,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,SAWAqB,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,SAOA13B,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,SAOA23B,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,SAOAvC,GAAAA,EAAAA,EAAAA,OAAAA,GAAAA,SAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,QAAAA,GAAAA,U,CAAAA,IAAAA,EAAAA,K,SAWAwC,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,MAAMn3B,EAA2B,2BAEjC,IAAKo3B,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,aAAAA,IAAAA,e,CAAAA,IAAAA,EAAAA,M,0EC5SZ,IAAIC,EAEG,SAASC,EAAcC,EAAgBC,GACvCA,IACCH,IAAoBA,EAAgBI,cACtCJ,EAAgBI,aAAc,GAIhCJ,EADAG,EAAW,CAAEC,aAAa,KAI5Bx+B,EAAAA,EAAAA,KAAQ,MACDu+B,EAAUC,aAAeF,KAC5BD,EAAcC,EAAMC,MAKnB,SAASE,EAAQH,IACtBt+B,EAAAA,EAAAA,KAAQ,KACFs+B,KACFG,EAAQH,MAgBP,MAAMI,EAAkB,CAC7BC,OAAS/qD,GAAcA,EACvBgrD,OAAShrD,GAAcA,GAAK,MAC5BirD,QAAUjrD,GAAc,GAAK,EAAIA,GAAK,OACtCkrD,UAAYlrD,GAAc,IAAOnB,KAAKssD,KAAKnrD,EAAI,IAAOnB,KAAKusD,IAAM,GACjEC,WAAarrD,GAAcA,EAAIA,EAC/BsrD,YAActrD,GAAcA,GAAK,EAAIA,GACrCurD,cAAgBvrD,GAAeA,EAAI,GAAM,EAAIA,EAAIA,GAAU,EAAI,EAAIA,GAAKA,EAAlB,EACtDwrD,YAAcxrD,GAAcA,EAAIA,EAAIA,EACpCyrD,aAAezrD,KAAiBA,EAAKA,EAAIA,EAAI,EAC7C0rD,eAAiB1rD,GAAeA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,GAAKA,EAAI,IAAM,EAAIA,EAAI,IAAM,EAAIA,EAAI,GAAK,EAChG2rD,YAAc3rD,GAAcA,EAAIA,EAAIA,EAAIA,EACxC4rD,aAAe5rD,GAAc,KAAOA,EAAKA,EAAIA,EAAIA,EACjD6rD,eAAiB7rD,GAAeA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,IAAOA,EAAKA,EAAIA,EAAIA,EACtF8rD,YAAc9rD,GAAcA,EAAIA,EAAIA,EAAIA,EAAIA,EAC5C+rD,aAAe/rD,GAAc,IAAOA,EAAKA,EAAIA,EAAIA,EAAIA,EACrDgsD,eAAiBhsD,GAAeA,EAAI,GAAM,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,EAAI,KAAQA,EAAKA,EAAIA,EAAIA,EAAIA,GAG3F,SAASisD,GAAc,OAC5BC,EAASpB,EAAgBC,OADG,SAE5BrwD,EAF4B,SAG5BqhB,EAH4B,MAI5BC,EAJ4B,KAK5BnL,EAL4B,GAM5B0iC,IAEA,MAAM4Y,EAAK1vD,KAAKC,MAChB,IAAI0vD,GAAW,EAkBf,OAhBAvB,GAAQ,KACN,GAAIuB,EAAU,OAAO,EAErB,IAAIpsD,GADOvD,KAAKC,MACFyvD,GAAMpwC,EAChB/b,EAAI,IAAGA,EAAI,GACf,MAAMwyB,EAAW05B,EAAOlsD,GACxB,GAAoB,iBAAT6Q,GAAmC,iBAAP0iC,EACrC74C,EAASmW,GAAS0iC,EAAK1iC,GAAQ2hB,QAC1B,GAAI1pB,MAAMC,QAAQ8H,IAAS/H,MAAMC,QAAQwqC,GAAK,CACnD,MAAM5pC,EAASkH,EAAKrJ,KAAI,CAAC6kD,EAAG7sD,IAAM6sD,GAAM9Y,EAAG/zC,GAAK6sD,GAAK75B,IACrD93B,EAASiP,GAGX,OADU,IAAN3J,GAAWgc,GAAOA,IACfhc,EAAI,KAGN,KACLosD,GAAW,EACPpwC,GAAOA,O,8CC1FR,SAAS+U,EAAe0O,GACe,mBAAjCzjC,OAAOuzB,UAAU+8B,aAI5BtwD,OAAOuzB,UAAU+8B,YAAY7sB,GAAa1hC,OAAOvB,IAC3C5B,EAAAA,IAEFC,QAAQW,MAAMgB,Q,cCVL,SAASqwB,EAAqB0/B,EAA0BC,GACrE,GAAID,IAAiBC,EACnB,OAAO,EAGT,MAAM5mC,EAAcjoB,OAAOkoB,KAAK0mC,GAC1BE,EAAoB7mC,EAAYvmB,OAGtC,GAAIotD,IAFkB9uD,OAAOkoB,KAAK2mC,GAAUntD,OAG1C,OAAO,EAGT,GAA0B,IAAtBotD,EACF,OAAO,EAGT,IAAK,IAAIjtD,EAAI,EAAGA,EAAIitD,EAAmBjtD,IAAK,CAC1C,MAAMktD,EAAO9mC,EAAYpmB,GACzB,GAAI+sD,EAAaG,KAAUF,EAASE,GAClC,OAAO,EAIX,OAAO,EAGF,SAAShgC,EAAgB6/B,EAA0BC,GACxD,MAAM5mC,EAAcjoB,OAAOkoB,KAAK0mC,GAIhC,OAH0B3mC,EAAYvmB,SAChB1B,OAAOkoB,KAAK2mC,GAAUntD,OAGnC,CAAC,YAGHumB,EAAYrc,QAAO,CAAC2iB,EAAKwgC,KAC1BH,EAAaG,KAAUF,EAASE,IAClCxgC,EAAI7rB,KAAM,GAAEqsD,MAASH,EAAaG,SAAYF,EAASE,MAGlDxgC,IACN,I,0DCxCL,YAAmB9gB,IACVA,EAAM1D,OAAOrD,SAASzD,KAAK,M,sECFpC,MAAMgwB,EAAW+7B,KAAKC,OAEf,IAAKC,EAML5wD,eAAe6wD,EACpBC,EAAmBhnC,EAAa5qB,EAAY6xD,GAAgB,GAE5D,GAAKp8B,EAIL,IAEE,MAAMq8B,EAAU,IAAIC,QAAQnnC,EAAIzkB,QAAQ,KAAM,MACxC6rD,QAAcv8B,EAASw8B,KAAKL,GAC5BpxD,QAAiBwxD,EAAM/rD,MAAM6rD,GACnC,IAAKtxD,EACH,OAGF,MAAMqtC,EAAcrtC,EAAS0xD,QAAQ/xD,IAAI,gBAEzC,OAAQH,GACN,KAAK0xD,EAAK5jC,KACR,aAAattB,EAASkG,OACxB,KAAKgrD,EAAKS,KAAM,CAEd,GAAIvnC,EAAIlb,WAAW,WAAam+B,GAAeA,EAAYn+B,WAAW,QACpE,OAGF,MAAM0iD,QAAa5xD,EAAS4xD,OAG5B,GAAIxnC,EAAIlb,WAAW,WACjB,OAAO,IAAIyiD,KAAK,CAACC,GAAO,CAAEpyD,KAAM,eAGlC,MAAMqyD,GAAkBD,EAAKpyD,OAAU6xD,GAAiBO,EAAKpyD,KAAKsL,SAAS,QAE3E,IAAIgnD,EAAeF,EAAKpyD,MAAQ6tC,EAEhC,OAAMwkB,GAAkBC,GAKnBT,IACHS,EAAeA,EAAansD,QAAQ,SAAU,KAGzC,IAAIgsD,KAAK,CAACC,GAAO,CAAEpyD,KAAMsyD,KARvBF,EAUX,KAAKV,EAAKa,KACR,aAAa/xD,EAASgyD,OACxB,QACE,QAEJ,MAAOnxD,GAGP,YADA3B,QAAQqC,KAAKV,IAKVP,eAAe2xD,EAAKb,EAAmBhnC,EAAa7qB,GACzD,GAAK01B,EAIL,IACE,MAAMi9B,EAA4B,iBAAT3yD,GAAqBA,aAAgBoyD,KAAOpyD,EAAOu9B,KAAKG,UAAU19B,GAErF+xD,EAAU,IAAIC,QAAQnnC,EAAIzkB,QAAQ,KAAM,MACxC3F,EAAW,IAAImyD,SAASD,GACxBV,QAAcv8B,EAASw8B,KAAKL,GAClC,aAAaI,EAAMY,IAAId,EAAStxD,GAChC,MAAOa,GAGP,YADA3B,QAAQqC,KAAKV,IAKVP,eAAe+xD,EAAMjB,GAC1B,IACE,IAAKn8B,EACH,OAGF,aAAaA,EAAS3yB,OAAO8uD,GAC7B,MAAOvwD,GAGP,YADA3B,QAAQqC,KAAKV,K,SA/FLqwD,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,KAAAA,GAAAA,O,CAAAA,IAAAA,EAAAA,M,6CCCG,SAASv6C,EAAsB0P,GAC5C,OAAOisC,EAAAA,EAAAA,GAAwB,CAAEC,MAAOlsC,M,+BCA1C,MAAMmsC,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,EAAyBzpD,GAiB/C,OAhBK0pD,KACH3rD,SAAS5I,iBAAiB,UAAW0X,GAAe,GAGrDhV,OAAOkoB,KAAK/f,GAAgCkD,SAASymD,IACpD,MAAMztC,EAAUlc,EAAQ2pD,GACxB,IAAKztC,EACH,OAGF,MAAM0tC,EAAuBZ,EAASW,GAClCC,GACFA,EAAqBrvD,KAAK2hB,MAIvB,MAyBT,SAAiClc,GAC9BnI,OAAOkoB,KAAK/f,GAAgCkD,SAASymD,IACpD,MAAMztC,EAAUlc,EAAQ2pD,GAClBC,EAAuBZ,EAASW,GACtC,GAAIC,EAAsB,CACxB,MAAMzmD,EAAQymD,EAAqBnxC,WAAWxD,GAAOA,IAAOiH,KAC7C,IAAX/Y,GACFymD,EAAqBnvD,OAAO0I,EAAO,OAKpCumD,KACH3rD,SAASgY,oBAAoB,UAAWlJ,GAAe,GArCvDg9C,CAAwB7pD,IAI5B,SAAS0pD,IACP,OAAO7xD,OAAOsvB,OAAO6hC,GAAUpuC,MAAMkvC,GAAgBvrD,QAAQurD,EAAYvwD,UAG3E,SAASsT,EAAcnQ,GACrB,MAAMitD,EAActB,EAAiB3rD,EAAEujB,KACvC,IAAK0pC,EACH,OAGF,MAAM,OAAEpwD,GAAWyvD,EAASW,GACvBpwD,IAGLmD,EAAE0Q,mBAGF8O,EADgB8sC,EAASW,GAAapwD,EAAS,IACtCmD,M,8JCnEX,MAAMqtD,EAAgB,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YACnFC,EAAc,CAClB,UAAW,WAAY,QAAS,QAAS,MAAO,OAChD,OAAQ,SAAU,YAAa,UAAW,WAAY,YAGlDC,EAAwBD,EAAYtoD,KAAKwoD,GAAUA,EAAM5lD,gBAMxD,SAAS6lD,EAAYC,GAC1B,MAAMpyB,EAAO,IAAIrhC,KAAKyzD,GAEtB,OADApyB,EAAK6M,SAAS,EAAG,EAAG,EAAG,GAChB7M,EAGF,SAASqyB,EAAcD,GAC5B,OAAOD,EAAYC,GAAU3lB,UAGxB,SAAS6lB,EAAYC,GAC1B,MAAMvyB,EAAO,IAAIrhC,KAAiB,IAAZ4zD,GACtB,MAAQ,GAAEvyB,EAAKwyB,iBAAiBxyB,EAAKyyB,aAGvC,SAASC,EAAY1yB,GACnB,MAAQ,GAAEA,EAAKwyB,iBAAiBxyB,EAAKyyB,WAAa,KAAKzyB,EAAKgN,YAIvD,SAAStN,EAAW0yB,EAAyBzqD,GAClD,MAAMq4B,EAA2B,iBAAboyB,EAAwB,IAAIzzD,KAAKyzD,GAAYA,EAC3D35B,EAAa9wB,EAAK8wB,YAAc,MAEtC,IAAIk6B,EAAQ3yB,EAAK4yB,WACbC,EAAS,GAMb,MALmB,QAAfp6B,IACFo6B,EAASF,GAAS,GAAK,MAAQ,MAC/BA,EAAQA,EAAQ,GAAKA,EAAQ,GAAKA,GAG5B,GAAEjwD,OAAOiwD,GAAOG,SAAS,EAAG,QAAQpwD,OAAOs9B,EAAK+yB,cAAcD,SAAS,EAAG,OAAOD,IAGpF,SAASG,EAAoBrrD,EAAcyqD,GAChD,MAAMpyB,EAA2B,iBAAboyB,EAAwB,IAAIzzD,KAAKyzD,GAAYA,EAE3DxlB,EAAQulB,EAAY,IAAIxzD,MAC9B,GAAIqhC,GAAQ4M,EACV,OAAOlN,EAAWM,EAAMr4B,GAG1B,MAAMsrD,EAAU,IAAIt0D,KAAKiuC,GAEzB,GADAqmB,EAAQlmB,QAAQH,EAAMI,UAAY,GAC9BhN,GAAQizB,EACV,OAAOtrD,EAAM,gBAAeoqD,EAAc/xB,EAAKkzB,aAGjD,MAAMC,EAAWnzB,EAAKwyB,gBAAkB5lB,EAAM4lB,cACxCY,EACJzrD,EAAKwrD,EAAW,yBAA2B,wBACvCA,EAAW,aAAe,SAGhC,OAAOE,EAAW1rD,EAAMq4B,EAAMozB,GAGzB,SAASnmB,EAAetlC,EAAcyqD,GAC3C,MAAMpyB,EAA2B,iBAAboyB,EAAwB,IAAIzzD,KAAKyzD,GAAYA,EAC3DgB,EAASzrD,EAAK,qBAAuB,aAE3C,OAAO0rD,EAAW1rD,EAAMq4B,EAAMozB,GAGzB,SAASE,EAAmB3rD,EAAcq4B,EAAYuzB,GAAU,GACrE,MAAMH,EAASzrD,EAAK4rD,EAAU,sBAAwB,uBAAyB,WAE/E,OAAOF,EAAW1rD,EAAMq4B,EAAMozB,GAGzB,SAASI,EACd7rD,EACAyqD,EACAmB,GAAU,EACVE,GAAa,EACbC,GAEA,MAAM1zB,EAA2B,iBAAboyB,EAAwB,IAAIzzD,KAAKyzD,GAAYA,EAE3DxlB,EAAQulB,EAAY,IAAIxzD,MAE9B,IAAK80D,EAAY,CACf,GAAIf,EAAY1yB,KAAU0yB,EAAY9lB,GACpC,OAAQ8mB,IAAiBH,EAAUI,EAAaC,GAAYjsD,EAAK,kBAGnE,MAAMmlC,EAAY,IAAInuC,KAAKiuC,GAE3B,GADAE,EAAUC,QAAQH,EAAMI,UAAY,GAChC0lB,EAAY1yB,KAAU0yB,EAAY5lB,GACpC,OAAQ4mB,IAAiBH,EAAUI,EAAaC,GAAYjsD,EAAK,sBAGnE,MAAMsrD,EAAU,IAAIt0D,KAAKiuC,GACnBinB,EAAY,IAAIl1D,KAAKiuC,GAG3B,GAFAqmB,EAAQlmB,QAAQH,EAAMI,UAAY,GAClC6mB,EAAU9mB,QAAQH,EAAMI,UAAY,GAChChN,GAAQizB,GAAWjzB,GAAQ6zB,EAAW,CACxC,MAAMC,EAAU/B,EAAc/xB,EAAKkzB,UAGnC,OAAQQ,IAAiBH,EAAUI,EAAaC,GAFhBjsD,EAAV4rD,EAAgB,gBAAeO,IAAmB,WAAUA,OAMtF,MAAMX,EAAWnzB,EAAKwyB,gBAAkB5lB,EAAM4lB,cAIxCY,EAASzrD,EAHG4rD,EACbJ,EAAW,yBAA2B,qBACtCA,EAAW,eAAiB,aACC,cAElC,OAAQO,IAAiBH,EAAUI,EAAaC,GAAYP,EAAW1rD,EAAMq4B,EAAMozB,IAGrF,SAASC,EAAW1rD,EAAcq4B,EAAYozB,GAC5C,MAAMW,EAAM/zB,EAAKgN,UACXgnB,EAAah0B,EAAKyyB,WAExB,OAAOW,EACJ5vD,QAAQ,OAAQmE,EAAKqqD,EAAYgC,KACjCxwD,QAAQ,OAAQmE,EAAM,YAAWqqD,EAAYgC,OAC7CxwD,QAAQ,MAAOmE,EAAM,cAAaqqD,EAAYgC,OAC9CxwD,QAAQ,KAAMd,OAAOsxD,EAAa,GAAGlB,SAAS,EAAG,MACjDtvD,QAAQ,KAAMd,OAAOqxD,GAAKjB,SAAS,EAAG,MACtCtvD,QAAQ,IAAKd,OAAOqxD,IACpBvwD,QAAQ,OAAQd,OAAOs9B,EAAKwyB,gBAG1B,SAASyB,EACdtsD,EACAyqD,EACAsB,GAEA,MAAM1zB,EAA2B,iBAAboyB,EAAwB,IAAIzzD,KAAKyzD,GAAYA,EAEjE,MAAQ,GAAEoB,EAAgB7rD,EAAMq4B,GAAM,OAAMt3B,EAAWgrD,OAAkBh0B,EAAWM,EAAMr4B,KAGrF,SAASusD,EAAoBj2C,EAAkBk2C,GACpD,MAAMxB,EAAQ5xD,KAAKC,MAAMid,EAAW,MAC9Bm2C,EAAUrzD,KAAKC,MAAOid,EAAW,KAAQ,IACzCo2C,EAAUtzD,KAAKC,MAAMid,EAAW,KAAO,IAEvCq2C,EAAWH,EAAWpzD,KAAKC,MAAMmzD,EAAW,MAAQ,EACpDI,EAAaJ,EAAWpzD,KAAKC,MAAOmzD,EAAW,KAAQ,IAAM,EACnE,IAAIK,EAAS,GAWb,OAVI7B,EAAQ,GAAK2B,EAAW,GAC1BE,GAAW,GAAE9xD,OAAOiwD,GAAOG,SAAS,EAAG,QACvC0B,GAAW,GAAE9xD,OAAO0xD,GAAStB,SAAS,EAAG,SAEzC0B,GADSD,GAAc,GACZ,GAAE7xD,OAAO0xD,GAAStB,SAAS,EAAG,QAE9B,GAAEpwD,OAAO0xD,MAEtBI,GAAU9xD,OAAO2xD,GAASvB,SAAS,EAAG,KAE/B0B,EAGF,SAASC,EAA0BC,GACxC,MAAMpnD,EAAQ,GAEd,IAAIqnD,EAAeD,EAAe,IAClCA,GAAgBC,EAChBA,EAAe5zD,KAAKC,MAAM2zD,EAAe,IAGzC,MAAMN,GADNK,EAAe3zD,KAAKC,MAAM0zD,EAAe,MACV,GAC/BA,GAAgBL,EAGhB,MAAMD,GADNM,EAAe3zD,KAAKC,MAAM0zD,EAAe,KACV,GAC/BA,GAAgBN,EAGhB,MAAMzB,GADN+B,EAAe3zD,KAAKC,MAAM0zD,EAAe,KACZ,GAQ7B,OANI/B,EAAQ,GACVrlD,EAAM/K,KAAKG,OAAOiwD,GAAOG,SAAS,EAAG,MAEvCxlD,EAAM/K,KAAKG,OAAO0xD,GAAStB,SAASH,EAAQ,EAAI,EAAI,EAAG,MACvDrlD,EAAM/K,KAAKG,OAAO2xD,GAASvB,SAAS,EAAG,MAE/B,GAAExlD,EAAMxK,KAAK,QAAQJ,OAAOiyD,GAAc7B,SAAS,EAAG,OAGzD,SAASrzB,EAAmB2yB,EAAyBwC,EAAS,SAEnE,OADiC,iBAAbxC,EAAwB,IAAIzzD,KAAKyzD,GAAYA,GACrDyC,eACVD,EACA,CACEE,KAAM,UACN5C,MAAO,QACP6B,IAAK,YAKJ,SAASgB,EAAuB3C,EAAyBwC,EAAS,SAEvE,OADiC,iBAAbxC,EAAwB,IAAIzzD,KAAKyzD,GAAYA,GACrDyC,eACVD,EACA,CACEE,KAAM,UACN5C,MAAO,QACP6B,IAAK,UACLiB,KAAM,UACNC,OAAQ,UACRC,OAAQ,YAKd,SAASC,EAAYpB,EAAa7B,EAAe4C,EAAO,MACtD,GAAI5C,EAASkD,IAA0BrB,EAzNhB,GA0NrB,OAAO,EAET,MAAM/zB,EAAO,IAAIrhC,KAAKm2D,EAAM5C,EAAO6B,GACnC,OAAQlkC,OAAOC,MAAMkQ,EAAKyM,YAAczM,EAAKgN,YAAc+mB,EAGtD,SAASsB,EAAgB/wB,EAAQ,IACtC,MAAMgxB,EAAkBhxB,EAAMhhC,MAAM,yBAC9BiyD,EAAwBjxB,EAAMhhC,MAAM,yBACpCkyD,EAAkBlxB,EAAMhhC,MAAM,sCACpC,IAAKgyD,IAAoBE,IAAoBD,EAC3C,OAGF,GAAIC,EAAiB,CACnB,MAAOx1B,EAAMkyB,EAAO4C,GAAQxwB,EAAM5gC,MAAM,SAASgG,IAAImmB,QACrD,OAASilC,GAAQA,EA3OG,OA2OwBK,EAAYn1B,EAAMkyB,EAAQ,EAAG4C,QAAQpsD,QAE7EA,EADC,GAAEosD,EAAQ,GAAEA,KAAU,KAAKpyD,OAAOwvD,GAAOY,SAAS,EAAG,QAAQpwD,OAAOs9B,GAAM8yB,SAAS,EAAG,OAI7F,MAAM2C,EAAYnxB,EAAM5gC,MAAM,KACxBs8B,EAAOs1B,EAAkBG,EAAU,GAAKA,EAAU,GAClDvD,GAASoD,EAAkBG,EAAU,GAAKA,EAAU,IAAInpD,cACxD0nD,EAAa/B,EAAsBxxC,WAAWsB,GAASA,EAAKhV,WAAWmlD,KAE7E,OAAuB,IAAhB8B,GAAqBmB,EAAYtlC,OAAOmQ,GAAOg0B,GACjD,GAAEtxD,OAAOsxD,EAAa,GAAGlB,SAAS,EAAG,QAAQpwD,OAAOs9B,GAAM8yB,SAAS,EAAG,YACvEpqD,EAGC,SAASgtD,EAAiBnD,GAC/B,OAAOA,EAAYoD,MAGrB,SAAS/B,EAAWgC,GAClB,MAAQ,GAAEA,EAAI,GAAGtpD,gBAAgBspD,EAAIhyD,MAAM,KAG7C,SAAS+vD,EAAWiC,GAClB,MAAQ,GAAEA,EAAI,GAAGhzD,gBAAgBgzD,EAAIhyD,MAAM,O,0ECxQ7C,MAAMiyD,EAAiB,CAAC,cAAe,YAAa,kBAa9CC,EAAgD,CACpD,CAAC,6BAA8B,UAC/B,CAAC,gCAAiC,UAClC,CAAC,0BAA2B,UAG9B,SAASC,EAAgBC,GACvB,MACMC,EADWD,EAAQtyD,MAAM,KACHgG,KAAKhI,GAAMw0D,SAASx0D,EAAG,MAEnD,OAAOgB,OAAOyzD,iBAAiBF,GAG1B,SAAS1oD,EAAoBxJ,GAElC,IAAKA,EAAKT,MAAM2I,EAAAA,GAAc,OAAOlI,EAErC,IAAK,MAAOqyD,EAAOC,KAAgBP,EACjC/xD,EAAOA,EAAKP,QAAQ4yD,EAAOC,GAG7B,OAAOtyD,EAGF,SAAS4J,EAAgBD,GAC9B,IAAI5E,EAEJ,GAAqB,IAAjB4E,EAAMnM,OACRuH,EAAO4E,EAAMrL,WAAW,GAAG+5B,SAAS,IAAI02B,SAAS,EAAG,SAC/C,CACL,MAAMwD,EAAQ,GACd,IAAK,IAAI50D,EAAI,EAAGA,EAAIgM,EAAMnM,OAAQG,IAC5BgM,EAAMrL,WAAWX,IAAM,OAAUgM,EAAMrL,WAAWX,IAAM,MACtDgM,EAAMrL,WAAWX,EAAI,IAAM,OAAUgM,EAAMrL,WAAWX,EAAI,IAAM,OAClE40D,EAAM/zD,KAC6B,MAAhCmL,EAAMrL,WAAWX,GAAK,QAClBgM,EAAMrL,WAAWX,EAAI,GAAK,OAAU,QAGpCgM,EAAMrL,WAAWX,GAAK,OAAUgM,EAAMrL,WAAWX,GAAK,QAC/D40D,EAAM/zD,KAAKmL,EAAMrL,WAAWX,IAIhCoH,EAAOwtD,EAAM5sD,KAAKuM,GAAMA,EAAEmmB,SAAS,IAAI02B,SAAS,EAAG,OAAMhwD,KAAK,KAGhE,OAAOgG,EAGF,SAASytD,EAAgBn5D,GAC9B,MAAMo5D,EAAuB,CAAEC,WAAY,GAAIjpD,OAAQ,IAEvD,IAAK,IAAI9L,EAAI,EAAGA,EAAItE,EAAKmE,OAAQG,GAAK,EAAG,CACvC,MAAMy0C,EAAW,CACflvC,GAAI7J,EAAKsE,GAAG,GACZvC,KAAM/B,EAAKsE,GAAG,GACd8L,OAAQ,IAGV,IAAK,IAAI3L,EAAI,EAAGA,EAAIzE,EAAKsE,EAAI,GAAGH,OAAQM,IAAK,CAC3C,MAAM60D,EAAWt5D,EAAKsE,EAAI,GAAGG,GACxBg0D,EAAeltD,SAAS+tD,EAAS,GAAG,MACvCvgB,EAAS3oC,OAAOjL,KAAKm0D,EAAS,GAAG,IACjCF,EAAUhpD,OAAOkpD,EAAS,GAAG,IAAM,CACjCzvD,GAAIyvD,EAAS,GAAG,GAChBC,MAAOD,EAAS,GAChBE,OAAQb,EAAgBW,EAAS,IACjCG,MAAQH,EAAS,GAAcpqD,gBAKrCkqD,EAAUC,WAAWl0D,KAAK4zC,GAG5B,OAAOqgB,EAGF,SAASM,EAAWC,GACzB,MAAMjuD,EAAOiuD,EAAIn0D,cAEjB,IAAK,aAAao0D,KAAKluD,GAAO,OAAOiuD,EACrC,MAAMd,EAAa,IAAIntD,GAAMY,KAAKutD,GAAMA,EAAEC,YAAY,GA9F/B,SA+FvB,OAAOx0D,OAAOyzD,iBAAiBF,K,eCrG1B,SAAS9yD,EAAeF,GAC7B,GAAKA,EAML,OAAOA,EAAI0F,SAAS,OAAS1F,EAAO,UAASA,I,yRCP/C,IAAIk0D,EAEG,SAAS5vB,IACd,OAAOhhC,QAAQ4wD,G,QAIR,IAAI/4D,SAASR,IAClB,MAAMw5D,EAAO,IAAIC,MAEjBD,EAAKvpD,IAAM,kHACX,MAAMypD,EAAoB,KACxB15D,EAAwB,IAAhBw5D,EAAKzsB,SAEfysB,EAAKG,OAASD,EACdF,EAAKI,QAAUF,KAIR94D,MAAMi5D,IACfN,EAAuBM,KClBzB,IAAIC,EAA6B,QAAC,GAChC,EAAAx5D,QAAO49B,kBADwB,OAC/B,SAAoB,gCAAgC67B,QAClD,OAAS,QAEN,SAAS1M,IACd,OAAOyM,EAGT,SAASr8B,EAAwB32B,GAC/BgzD,EAAmBhzD,EAAEizD,QAAU,OAAS,QAG1C,MAAM97B,EAAM39B,OAAO49B,WAAW,gCACM,mBAAzBD,EAAI1+B,iBACb0+B,EAAI1+B,iBAAiB,SAAUk+B,GACK,mBAApBQ,EAAIE,aACpBF,EAAIE,YAAYV,GCkBX,MAAM3J,EAtBN,WACL,MAAM,UAAEF,EAAF,SAAavzB,GAAaC,OAAOuzB,UAIvC,IAAImmC,EAcJ,OAZ0C,IALnB,CAAC,YAAa,WAAY,SAAU,UAKxCzxD,QAAQlI,GACzB25D,EAAK,SACwC,IAL1B,CAAC,SAAU,OAAQ,QAKhBzxD,QAAQlI,GAC9B25D,EAAK,OAC4C,IAR1B,CAAC,QAAS,QAAS,UAAW,SAQ3BzxD,QAAQlI,GAClC25D,EAAK,UACI,UAAUZ,KAAKxlC,GACxBomC,EAAK,UACI,QAAQZ,KAAK/4D,KACtB25D,EAAK,SAGAA,EAGmBC,GACfr7B,EAA6B,UAAjB9K,EACZ7iB,EAA0B,QAAjB6iB,EACT6K,EAA8B,YAAjB7K,EACb+K,EAAY,iCAAiCu6B,KAAKvlC,UAAUD,WAC5DsmC,EACX55D,OAAO49B,WAAW,8BAA8B67B,SAC5Cz5D,OAAOuzB,UAAkBsmC,YAC1BhyD,SAASiyD,SAASrvD,SAAS,kBAGnB0zB,EAAen+B,OAAO49B,WAAW,qBAAqB67B,QAEtDvN,EAA0BlsD,OAAOojB,YAAc5H,EAAAA,IAC1Dxb,OAAOojB,YAAc3H,EAAAA,IAAqCzb,OAAO0Z,aAAegC,EAAAA,GAGrEq+C,GAA2B7N,GACtClsD,OAAOojB,YAAc7H,EAAAA,GAEVy+C,EAA+B3xD,QAC1CkrB,UAAU0mC,cAAgB,iBAAkB1mC,UAAU0mC,eACpDj6D,OAAOk6D,cAAiBl6D,OAAem6D,qBAI9BhrD,GADiDtH,SAASw1B,gBAAgBnqB,MACrDsgB,IAAiB8K,GAAa3tB,IACnDypD,EAA8B,kBAAmB7mC,UAEjDgY,EAA2B6uB,EAE3B7wB,GAD0CvpC,OACtBqI,SAAS,IAAIgyD,OAASC,YAAY,4BACtDC,GACV7hD,EAAAA,IAAW,WAAa7Q,SAAS6F,cAAc,UAAU8sD,WAAW,OAAS,IAEnEC,EAAkC,sBAAuB5yD,SAAS6F,cAAc,OAChFgtD,GAAuBnnC,UAAUD,UAAU7oB,SAAS,WACpDkwD,EAAwBt8B,EAAa,aAAe1tB,EAAS,eAAiB,aAErFiqD,EAAa/yD,SAAS6F,cAAc,SAC7BmmB,EAAmBxrB,QAC9BuyD,EAAWN,YAAYl9C,EAAAA,IAAgB9X,QAAQ,KAAM,KAClDqL,GAGDkjB,GAAkBvW,EAAAA,GAAAA,IAAkCF,EAAAA,IAEjD,MAAMy9C,EAAM76D,OAAO86D,kBAAoB,EAEjCC,GAAsB,EAEtBC,GAA0B18B,IAAc3tB,IAAW0tB,EAGnD48B,EAA8BD,EAAyB,IAAM,K,+OCpEnE,SAASE,EAAcrwB,GAC5B,MAAMswB,EAAMtwB,EAAQrlC,MAAM,KACpB41D,EAAOD,EAAI,GAAG/1D,MAAM,WAAY,GAChCi2D,EAAOC,KAAKH,EAAI,IACtB,IAAI73D,EAAI+3D,EAAKh4D,OACb,MAAMk4D,EAAQ,IAAIC,WAAWl4D,GAE7B,KAAOA,KACLi4D,EAAMj4D,GAAK+3D,EAAKl3D,WAAWb,GAG7B,OAAO,IAAIguD,KAAK,CAACiK,GAAQ,CAAEp8D,KAAMi8D,IAG5B,SAASK,EAAclK,GAC5B,OAAO,IAAIrxD,SAAQ,CAACR,EAASD,KAC3B,MAAMi8D,EAAS,IAAIC,WAEnBD,EAAOrC,OAAU7yD,IACf,MAAM,OAAEmH,GAAWnH,EAAEW,QAAU,GACT,iBAAXwG,GACTjO,EAAQiO,GAGVlO,EAAO,IAAIc,MAAM,yBAGnBm7D,EAAOpC,QAAU75D,EACjBi8D,EAAOE,cAAcrK,MAIlB,SAASsK,EAAWtK,EAAYzpD,GACrC,OAAO,IAAIg0D,KAAK,CAACvK,GAAOzpD,EAAU,CAChCi0D,aAAct7D,KAAKC,MACnBvB,KAAMoyD,EAAKpyD,OAIR,SAAS68D,EAAaj3D,GAC3B,OAAO,IAAI7E,SAAQ,CAACR,EAASD,KAC3B,MAAMw8D,EAAM,IAAI9C,MAChB8C,EAAI5C,OAAS,IAAM35D,EAAQu8D,GAC3BA,EAAI3C,QAAU75D,EACdw8D,EAAItsD,IAAM5K,KAIP,SAASm3D,EAAan3D,GAC3B,OAAO,IAAI7E,SAAQ,CAACR,EAASD,KAC3B,MAAMoM,EAAQhE,SAAS6F,cAAc,SACrC7B,EAAMswD,OAAS,EACftwD,EAAMuwD,iBAAmB,IAAM18D,EAAQmM,GACvCA,EAAMytD,QAAU75D,EAChBoM,EAAM8D,IAAM5K,KAIT9E,eAAeo8D,EAAqBt3D,GACzC,MAAM8G,QAAcqwD,EAAan3D,GAEjC,OAAO7E,QAAQC,KAAK,EAClBE,EAAAA,EAAAA,IAAM,KACN,IAAIH,SAA4B,CAACR,EAASD,KACxCoM,EAAMywD,SAAW,KACVzwD,EAAM0wD,YAAe1wD,EAAM2wD,aAC9B98D,OAAQ8K,GAGV,MAAMiyD,EAAS50D,SAAS6F,cAAc,UACtC+uD,EAAOjwB,MAAQ3gC,EAAM0wD,WACrBE,EAAOhwB,OAAS5gC,EAAM2wD,YACVC,EAAOjC,WAAW,MAC1BkC,UAAU7wD,EAAO,EAAG,GACxBnM,EAAQ+8D,EAAOE,UAAU,gBAE3B9wD,EAAMytD,QAAU75D,EAChBoM,EAAM+wD,YAAc/5D,KAAKy0C,IAAIzrC,EAAMkU,SAAU,QAK5C9f,eAAe48D,EAAUhxB,GAE9B,aADuBilB,MAAMjlB,IACb0lB,OAGXtxD,eAAe68D,EAAUjxB,EAAiB/jC,GAE/C,OAAO+zD,QADYgB,EAAUhxB,GACL/jC,GAGnB,SAASi1D,EAAYd,GAC1B,MAAMQ,EAAS50D,SAAS6F,cAAc,UAOtC,OANA+uD,EAAOjwB,MAAQyvB,EAAIzvB,MACnBiwB,EAAOhwB,OAASwvB,EAAIxvB,OAERgwB,EAAOjC,WAAW,MAC1BkC,UAAUT,EAAK,EAAG,GAEfQ,EAvHW,oBAATX,OAETnL,KAAKmL,KAAO,cAAcxK,KAGxB0L,YAAYC,EAAsBn1D,EAAkBgC,GAClD,GAAIA,EAAS,CACX,MAAM,KAAE3K,KAAS+9D,GAASpzD,EAC1BqzD,MAAMF,EAAU,CAAE99D,KAAAA,IAFP,sBAGXwC,OAAOC,OAAOw7D,KAAMF,QAEpBC,MAAMF,GADD,sBAIPG,KAAKn8D,KAAO6G,M,eCfX,SAAS6C,EAAe0yD,EAAoBnzD,EAAmBwsD,EAAmB,MACvF,OAAO,IAAI4G,KAAKC,aAAa7G,EAAQ,CACnCxjD,MAAO,WACPhJ,SAAAA,IACCgrD,OAAoB,QAAbhrD,EAAqBmzD,EAAaA,EAAa,K,kDCN3D,QAAgBG,IACd,IAAIz0D,EAEJ,GACEA,EAAKvE,OAAO3B,KAAK46D,UAAUn4D,QAAQ,KAAM,YAClCk4D,EAAME,eAAe30D,IAE9B,OAAOA,I,0CCLT,MAAM40D,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,sBAGlBC,wBAAyB,kFAEzBC,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,oEAGnBC,EAAiD,CAC5D5B,6BAA8B,CAC5B9xB,MAAO,cACPhsC,QAAS,4BAEX+9D,6BAA8B,CAC5B/xB,MAAO,cACPhsC,QAAS,4BAEXg+D,qBAAsB,CACpBhyB,MAAO,OACPhsC,QAAS,kBAEXi+D,wBAAyB,CACvBjyB,MAAO,cACPhsC,QAAS,qBAEXk+D,yBAA0B,CACxBlyB,MAAO,WACPhsC,QAAS,uBAEXm+D,sBAAuB,CACrBnyB,MAAO,QACPhsC,QAAS,mBAEXo+D,sBAAuB,CACrBpyB,MAAO,WACPhsC,QAAS,kBAEXq+D,uBAAwB,CACtBryB,MAAO,QACPhsC,QAAS,mBAEXs+D,uBAAwB,CACtBtyB,MAAO,QACPhsC,QAAS,oBAIE,SAAS2/D,EAAqB1hE,GAC3C,MAAM,QAAE+B,EAAF,WAAW4/D,EAAX,WAAuBC,GAAe5hE,EAE5C,GAAI2hE,EAAY,CACd,MAAME,EAAiB9/D,EAAQ0G,QAAQ,eACvC,OAAOo5D,EAAiB,EAAI9/D,EAAQsL,UAAU,EAAGw0D,GAAkB9/D,EAErE,IAAI+/D,EAAe3D,EAAwBp8D,GAM3C,OALI+/D,GAAgBF,IAClBE,EAAe3/D,OAAOkoB,KAAKu3C,GAAY7zD,QAAO,CAACod,EAAKlW,IAC3CkW,EAAIrlB,QAAQmP,EAAS2sD,EAAW3sD,KACtC6sD,IAEEA,EAGF,SAAStkC,EAAiBx9B,GAC/B,OAAOyhE,EAAgBzhE,EAAM+B,W,sDClH/B,SAASggE,EAAiB/6D,GACxBA,EAAEO,iBAEF2nB,EAAYloB,aAAag7D,WAAah7D,EAAEhH,MAAQgH,EAAEi7D,QAK7C,SAAS/yC,EAAYluB,GAE1B3B,QAAQW,MAAMgB,GAhBhBR,OAAOf,iBAAiB,QAASsiE,GACjCvhE,OAAOf,iBAAiB,qBAAsBsiE,IAWvBG,EAAAA,EAAAA,IAAS1hE,OAAO2hE,MAAO,M,cCLvC,SAASnqC,EAA2CoqC,EAAiB73C,GAC1E,OAAO63C,EAAWr0D,QAAO,CAACsrB,EAA2BgpC,KACnDhpC,EAAMgpC,EAAO93C,IAAQ83C,EAEdhpC,IACN,IAGE,SAASipC,EACdjpC,EACAj5B,GAEA,OAAO+B,OAAOkoB,KAAKgP,GAAOtrB,QAAO,CAACw0D,EAA8Bh4C,EAAK9c,KACnE80D,EAASh4C,GAAOnqB,EAASi5B,EAAM9O,GAAMA,EAAK9c,EAAO4rB,GAC1CkpC,IACN,IAGE,SAASzmB,EAA2B0mB,EAAWn4C,GACpD,OAAOA,EAAKtc,QAAO,CAACI,EAAQoc,KAC1Bpc,EAAOoc,GAAOi4C,EAAOj4C,GACdpc,IACN,IAGE,SAAS8lC,EAAiCuuB,EAAWn4C,GAC1D,OAAOA,EAAKtc,QAAO,CAACI,EAAQoc,KACtBi4C,EAAOj4C,KACTpc,EAAOoc,GAAOi4C,EAAOj4C,IAGhBpc,IACN,IAGE,SAASmjC,EAA2BkxB,EAAWn4C,GACpD,MAAMo4C,EAAa,IAAI9lD,IAAI0N,EAAKre,IAAIhH,SAIpC,OAAO82C,EAAK0mB,EAHMrgE,OAAOkoB,KAAKm4C,GAC3Bt2D,QAAQqe,IAASk4C,EAAWn7C,IAAIiD,MAK9B,SAASiH,EACd4wC,EACAM,EACAC,EAA0D,OAE1D,SAASC,EAAchtB,EAAMC,EAAMgtB,EAAgDC,GACjF,MAAMC,GAAsC,mBAArBF,EAAkCA,EAAiBjtB,GAAKA,EAAEitB,KAAsB,EACjGG,GAAsC,mBAArBH,EAAkCA,EAAiBhtB,GAAKA,EAAEgtB,KAAsB,EAEvG,OAAOC,EAAQC,EAASC,EAASA,EAASD,EAG5C,GAAIz1D,MAAMC,QAAQm1D,GAAY,CAC5B,MAAOO,EAAOC,GAAS51D,MAAMC,QAAQo1D,GAAQA,EAAO,CAACA,EAAMA,IACpDQ,EAAYC,GAAcV,EAC3BW,EAAmB,QAAVJ,EACTK,EAAmB,QAAVJ,EAEf,OAAOd,EAAWzsB,MAAK,CAACC,EAAGC,IAClB+sB,EAAchtB,EAAGC,EAAGstB,EAAYE,IAAWT,EAAchtB,EAAGC,EAAGutB,EAAYE,KAItF,MAAMR,EAAiB,QAATH,EACd,OAAOP,EAAWzsB,MAAK,CAACC,EAAGC,IAClB+sB,EAAchtB,EAAGC,EAAG6sB,EAAWI,KAInC,SAASj1C,EAAQ01C,GACtB,OAAOA,EAAMx1D,QAAO,CAACI,EAAQk0D,IACvB/0D,MAAMC,QAAQ80D,GACTl0D,EAAO4d,OAAOs2C,IAErBl0D,EAAOtJ,KAAKw9D,GACLl0D,IAER,IAGE,SAAS6pC,EAAsBurB,GACpC,OAAOj2D,MAAM+H,KAAK,IAAIsH,IAAI4mD,IAGrB,SAASC,EAAQD,GACtB,OAAOA,EAAMr3D,OAAOrD,SAGf,SAAS2a,EAAqBigD,EAAeC,GAClD,OAAID,EAAO5/D,SAAW6/D,EAAO7/D,QAItB4/D,EAAOlwB,OAAM,CAAClvB,EAAMrgB,IAAMqgB,IAASq/C,EAAO1/D,KAG5C,SAAS2/D,EAA4BF,EAAeC,GACzD,OAAOD,EAAO,IAAMC,EAAOA,EAAO7/D,OAAS,IAAM4/D,EAAOA,EAAO5/D,OAAS,IAAM6/D,EAAO,GAGhF,SAASE,EAA2BL,EAAYjhE,GACrD,OAAOihE,EAAMr3D,QAAQ0pC,GAAMtzC,EAAIglB,IAAIsuB,KAG9B,SAAS5vC,EAAMu9D,EAAcM,GAClC,MAAM11D,EAAS,GACf,IAAK,IAAInK,EAAI,EAAGA,EAAIu/D,EAAM1/D,OAAQG,GAAK6/D,EACrC11D,EAAOtJ,KAAK0+D,EAAMr9D,MAAMlC,EAAGA,EAAI6/D,IAGjC,OAAO11D,EAGF,SAAS21D,EAAa3+D,GAC3B,MAAqB,iBAAVA,EACFA,EAGLmI,MAAMC,QAAQpI,GACTA,EAAM6G,IAAI83D,GAGZ3hE,OAAOkoB,KAAKllB,GAAO4I,QAAO,CAACod,EAAKZ,KACrCY,EAAIZ,GAAkBu5C,EAAU3+D,EAAMolB,IAC/BY,IACN,IAGE,SAAS49B,EAAYwa,EAAiBQ,GAC3C,IAAI/1C,EAASu1C,EAAM1/D,OAEnB,KAAOmqB,KACL,GAAI+1C,EAAUR,EAAMv1C,GAASA,EAAQu1C,GACnC,OAAOA,EAAMv1C,G,2QC7HnB,MAAMg2C,EAAqB,iBACrBC,EAAiB,CAAC,QAAS,YAAa,WAAY,WAAY,WAAY,YAAa,cACzFC,EAAe,CAEnBC,GAAKrgE,GAAqB,IAANA,EAAU,EAAI,EAClCsgE,GAAKtgE,GAAqB,IAANA,EAAU,EAAU,IAANA,EAAU,EAAU,IAANA,EAAU,EAAIA,EAAI,KAAO,GAAKA,EAAI,KAAO,GAAK,EAAIA,EAAI,KAAO,GAAK,EAAI,EACtHugE,GAAKvgE,GAAqB,IAANA,EAAU,EAAI,EAClCwgE,GAAKxgE,GAAqB,IAANA,EAAU,EAAI,EAClCygE,GAAKzgE,GAAqB,IAANA,EAAU,EAAI,EAClC0gE,GAAK1gE,GAAeA,EAAI,EAAI,EAAI,EAChC2gE,GAAK3gE,GAAeA,EAAI,EAAI,EAAI,EAChCyF,GAAI,IAAM,EACVm7D,GAAK5gE,GAAqB,IAANA,EAAU,EAAI,EAClC6gE,GAAI,IAAM,EACVC,GAAI,IAAM,EACVC,GAAK/gE,GAAqB,IAANA,EAAU,EAAI,EAClCghE,GAAKhhE,GAAqB,IAANA,EAAU,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EACtGihE,MAAQjhE,GAAeA,EAAI,EAAI,EAAI,EACnCkhE,GAAKlhE,GAAeA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAK,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EAC7HmhE,GAAKnhE,GAAeA,EAAI,EAAI,EAAI,EAChCohE,GAAKphE,GAAeA,EAAI,IAAO,GAAKA,EAAI,KAAQ,GAAK,EAAIA,EAAI,IAAM,GAAKA,EAAI,IAAM,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAAO,IAAM,EAAI,EAC7HqhE,GAAKrhE,GAAeA,EAAI,EAAI,EAAI,GAI5B6tD,EAAQ,IAAI5yD,IAElB,IAAIqmE,EACAC,EAEJ,MAAM,YACJhyC,EADI,eAEJC,EAFI,aAGJV,GCtDK,WACL,MAAMf,EAAiC,GAUvC,SAASyB,EAAe/T,GACtB,MAAM9R,EAAQokB,EAAUppB,QAAQ8W,IACjB,IAAX9R,GACFokB,EAAU9sB,OAAO0I,EAAO,GAU5B,MAAO,CACLmlB,aAPF,YAAyBtxB,GACvBuwB,EAAUrkB,SAASpN,IACjBA,KAAYkB,OAMd+xB,YAvBF,SAAqB9T,GAGnB,OAFAsS,EAAUhtB,KAAK0a,GAER,KACL+T,EAAe/T,KAoBjB+T,eAAAA,GD4BAgyC,GAIJ,IAAIC,EACAC,EAEG,MAAMC,EAAyB,CAACl7C,EAAaplB,EAAauwD,KAAiB,QAChF,QAAc1qD,IAAV7F,EAAqB,CACvB,MAAMugE,EAAap4D,MAAMC,QAAQpI,GAAS83B,KAAKG,UAAUj4B,GAASA,EAC5DwgE,EAAShU,EAAM7xD,IAAK,GAAEyqB,KAAOm7C,KAAchQ,KACjD,GAAIiQ,EACF,OAAOA,EAIX,IAAKP,IAAaC,EAChB,OAAO96C,EAGT,MAAMq7C,GAAa,UAACR,SAAD,aAAC,EAAW76C,MAAZ,UAAsB86C,SAAtB,aAAsB,EAAmB96C,IAC5D,OAAKq7C,EAQEC,EAAmBD,EAAYr7C,EAAKplB,EAAOuwD,IAP3C2P,GACES,IAGAv7C,IAMJ9pB,eAAeslE,EAA4BnrC,EAAkBrQ,GAClE,IAAIy7C,QAAmD5wC,EAASk8B,MAC9Dv3C,EAAAA,GACC,GAAE0E,EAAAA,MAAqBmc,KAAYrQ,IACpC6K,EAASi8B,KAAKa,MAOhB,OAJK8T,IACHA,QA4EJvlE,eACEwlE,EAA2CrrC,EAAkBrQ,GAE7D,MAAM27C,QAAe3kE,EAAAA,EAAAA,IAAQ,mBAAoB,CAC/C6jE,SAAUa,EACVrrC,SAAAA,EACAvQ,KAAM,CAACE,KAGT,GAAI27C,MAAAA,GAAAA,EAAQriE,OAGV,aAFMuxB,EAASg9B,KAAKr4C,EAAAA,GAAkB,GAAEksD,KAAkBrrC,KAAYrQ,IAAO27C,EAAO,IAE7EA,EAAO,GAxFUC,CAAkB1nD,EAAAA,GAAmBmc,EAAUrQ,IAGlEs7C,EAAmBG,EAAiBz7C,GAGtC9pB,eAAe46B,EAAYT,EAAoBx6B,EAA+BgmE,GAAe,GAClG,GAAIhB,GAAYxqC,IAAa2qC,EAK3B,YAJInlE,GACFA,KAMJ,IAAIimE,QAAoBjxC,EAASk8B,MAAMv3C,EAAAA,GAAiB6gB,EAAUxF,EAASi8B,KAAKa,MAChF,IAAKmU,IACCD,SACIN,IAGRO,QA6CJ5lE,eAA2Bm6B,GACzB,MAAMsrC,QAAe3kE,EAAAA,EAAAA,IAAQ,gBAAiB,CAAE+kE,gBAAiB5nD,EAAAA,GAAYkc,SAAAA,IAC7E,GAAIsrC,EAEF,aADM9wC,EAASg9B,KAAKr4C,EAAAA,GAAiB6gB,EAAUsrC,EAAOd,UAC/Cc,EAAOd,SAjDMmB,CAAY3rC,IAC3ByrC,GACH,OAIJ1U,EAAMa,QAEN+S,EAAkB3qC,EAClBwqC,EAAWiB,EACXh+D,SAASw1B,gBAAgB5zB,KAAO2wB,EAEhC,MAAM,UAAEpB,EAAF,WAAauB,IAAe9H,EAAAA,EAAAA,MAAYqE,SAAS+B,MACjDmtC,EAAWhtC,MAAAA,OAAH,EAAGA,EAAWkP,MAAM1lB,GAAMA,EAAE4X,WAAaA,IACvD6qC,EAAej/D,MAAQqC,QAAQ29D,MAAAA,OAAD,EAACA,EAAUC,KACzChB,EAAer6D,KAAOwvB,EACtB6qC,EAAe1qC,WAAaA,EAExB36B,GACFA,IAGFwyB,IAGK,SAASqI,EAAcF,GACxBA,GAAcA,IAAeyqC,IAIjCA,EAAoBzqC,EACpB0qC,EAAe1qC,WAAaA,EAE5BnI,KAGFnyB,eAAeqlE,IACTT,IAIJA,SAA0B,+BAA8BqB,QACxD9zC,KAkDF,SAASizC,EAAmBD,EAAuCr7C,EAAaplB,EAAauwD,GAC3F,MAAMiR,EAAWf,EAAaA,EAA4B,iBAAVzgE,EApBlD,SAAyBsF,GACvB,MAAMmwB,EAAW2qC,GAAmB/mD,EAAAA,GAC9BooD,EAAc1C,EAAatpC,GAC7BspC,EAAatpC,GAAuCnwB,GACpD,EAEJ,OAAOw5D,EAAe2C,GAc+CC,CAAgB1hE,GAAS,cAAW6F,EACzG,IAAK27D,IAAaA,EAAS55D,OAAQ,CACjC,MAAM6C,EAAQ2a,EAAIvkB,MAAM,KAExB,OAAO4J,EAAMA,EAAM/L,OAAS,GAG9B,QAAcmH,IAAV7F,EAAqB,CACvB,MACMgJ,EApBV,SAAyBw4D,EAAkBxhE,GACzCA,EAAQmI,MAAMC,QAAQpI,GAASA,EAAQ,CAACA,GACxC,MAAM2hE,EAAoBH,EAAS3gE,MAAMg+D,GACnC+C,EAAeD,EAAkB33D,QAEvC,OAAO23D,EAAkB/4D,QAAO,CAACI,EAAQ+pD,EAAKzqD,IACpC,GAAEU,IAASnJ,OAAOG,EAAMsI,IAAU,MAAMyqD,KAC/C6O,GAAgB,IAaFC,CAAgBL,EADG,MAAXjR,GAAiBuR,EAAAA,EAAAA,IAAc9hE,GAASA,GAEzDugE,EAAap4D,MAAMC,QAAQpI,GAAS83B,KAAKG,UAAUj4B,GAASA,EAElE,OADAwsD,EAAMrvD,IAAK,GAAEioB,KAAOm7C,KAAchQ,IAAUvnD,GACrCA,EAGT,OAAOw4D,I,2HEhOT,MAAMO,EAAc,KAGbzmE,eAAe0mE,EAASC,GAC7B,MAAMC,QAAoB,IAAI/U,SAAS8U,GAAUC,cAEjD,OAAO,IAAI3mE,SAASR,IAClB,MAAMonE,EAAa,IAAItL,WAAWqL,GAElC,IAAIE,EAAoC,IAAIhoE,OAC1C,IAAIC,IAAI,mBAENgoE,EAAgC,IAAIjoE,OAAO,IAAIC,IAAI,mBAEvD+nE,EAAcE,UAAazgE,IAEV,OAAXA,EAAEtH,KAEJ8nE,EAAW1lE,YAAY,CAAE4lE,QAAS,SAGlCF,EAAW1lE,YACT,CACE4lE,QAAS,SACTC,QAAS3gE,EAAEtH,MAEbsH,EAAEtH,KAAKsM,KAAI,EAAG47D,OAAAA,KAA2BA,MAK/CJ,EAAUC,UAAazgE,IACE,SAAnBA,EAAEtH,KAAKqC,UACT7B,EAAQ,IAAI4xD,KAAK,CAAC9qD,EAAEtH,KAAKmoE,MAAO,CAAEloE,KAAM,eAExC4nE,EAAeO,YACfP,OAAgBv8D,EAChBw8D,EAAWM,YACXN,OAAYx8D,IAIhBw8D,EAAU1lE,YAAY,CACpB4lE,QAAS,OACTK,YA3CY,GA4CZC,cAAed,IAGjBK,EAAczlE,YAAY,CACxB4lE,QAAS,OACTO,kBAAmBf,EACnBgB,uBAAwBhB,IAG1BK,EAAczlE,YAAY,CACxB4lE,QAAS,SACTS,MAAOb,GACN,CAACA,EAAWM,Y,aCvCnB,MAAMQ,EAAiB,CACrB,CAAC1lE,EAAAA,GAAAA,SAAyB0yB,EAASi8B,KAAKS,KACxC,CAACpvD,EAAAA,GAAAA,QAAwB0yB,EAASi8B,KAAKa,KACvC,CAACxvD,EAAAA,GAAAA,kBAA6BsI,EAC9B,CAACtI,EAAAA,GAAAA,aAAwBsI,GAKrBq9D,EAAc,IAAItpE,IAClBupE,EAAgB,IAAIvpE,IACpBwpE,EAAoB,IAAIxpE,IACxBypE,EAAuB,IAAIzpE,IAE1B,SAASuyD,EACd/rD,EACAkjE,EACAjX,GAAgB,EAChBkX,EACAC,GAEA,GAAIF,IAAgB/lE,EAAAA,GAAAA,YAClB,OACEqpC,EAAAA,GA8DN,SAAwBxmC,GACtB,MAAMqjE,EAAkB,iBAA2BrjE,IAInD,OAFA8iE,EAAY/lE,IAAIiD,EAAKqjE,GAEdloE,QAAQR,QAAQ0oE,GAlEfC,CAAetjE,GACf+rD,EAAM/rD,EAAK7C,EAAAA,GAAAA,QAAwB8uD,EAAekX,EAAYC,GAItE,IAAKL,EAAchhD,IAAI/hB,GAAM,CAC3B,MAAMrD,EA+DVzB,eACE8E,EAAakjE,EAA6BjX,GAE1C,IAAK93C,EAAAA,GAAsB,CACzB,MAAM63C,EAAYhsD,EAAI8J,WAAW,UAAYuK,EAAAA,GAA2BD,EAAAA,GAClEgsD,QAAevwC,EAASk8B,MAAMC,EAAWhsD,EAAK6iE,EAAeK,GAAejX,GAElF,GAAImU,EAAQ,CACV,IAAIx6B,EAAQw6B,EAMZ,GAJoB,cAAhBA,EAAOhmE,MAAyBoqC,EAAAA,KAClCoB,QAAcg8B,EAASh8B,IAGL,eAAhBw6B,EAAOhmE,QAA0BkqC,EAAAA,EAAAA,OAAqBsB,EAAO,CAC/D,MAAM29B,QAAiBC,EAAAA,EAAAA,IAAUxjE,EAAK4lC,GAClC29B,IACF39B,EAAQ29B,GAIZ,MAAME,EAAWC,EAAa99B,GAI9B,OAFAk9B,EAAY/lE,IAAIiD,EAAKyjE,GAEdA,GAIX,GAAIP,IAAgB/lE,EAAAA,GAAAA,OAAuB,CACzC,MAAMwmE,EAAc,IAAIC,YAClBC,EAAY5pE,IAAIi4B,gBAAgByxC,GACtC,IAAIr0D,GAAS,EAiBb,OAfAq0D,EAAYzpE,iBAAiB,cAAc,KACzC,GAAIoV,EACF,OAEFA,GAAS,EAET,MAAMw0D,EAAeH,EAAYI,gBAAgB,cAE3CZ,EAAaa,EAAehkE,EAAK2jE,EAAaG,GACpDb,EAAqBlmE,IAAIiD,EAAKmjE,IAEzBnnE,EAAAA,EAAAA,IAAQ,gBAAiB,CAAEgE,IAAAA,EAAKkjE,YAAAA,GAAeC,MAGtDL,EAAY/lE,IAAIiD,EAAK6jE,GACdA,EAGT,MAAMV,EAAaa,EAAehkE,GAClCijE,EAAqBlmE,IAAIiD,EAAKmjE,GAE9B,MAAMxC,QAAe3kE,EAAAA,EAAAA,IAAQ,gBAAiB,CAAEgE,IAAAA,EAAKkjE,YAAAA,EAAajX,cAAAA,GAAiBkX,GACnF,IAAKxC,EACH,MAAM,IAAInlE,MAAO,yBAAwBwE,KAG3C,IAAI,SAAEyjE,EAAF,SAAYzgE,GAAa29D,EAE7B,GAAiB,cAAb39D,IAA6BwhC,EAAAA,GAAmB,CAClD,MAAMgoB,QAAasL,EAAAA,EAAAA,IAAU2L,GAC7BxpE,IAAIgqE,gBAAgBR,GACpB,MAAM79B,QAAcg8B,EAASpV,GAC7BiX,EAAWC,EAAa99B,GACxB5iC,EAAW4iC,EAAMxrC,KAGnB,GAAiB,eAAb4I,KAA8BshC,EAAAA,EAAAA,MAAmB,CACnD,MAAMkoB,QAAasL,EAAAA,EAAAA,IAAU2L,GAC7BxpE,IAAIgqE,gBAAgBR,GACpB,MAAM79B,QAAc49B,EAAAA,EAAAA,IAAUxjE,EAAKwsD,GAC/B5mB,IACF69B,EAAWC,EAAa99B,IAM5B,OAFAk9B,EAAY/lE,IAAIiD,EAAKyjE,GAEdA,EAhJWS,CAAuBlkE,EAAKkjE,EAAajX,GACtDjvD,OAAOvB,IACF5B,EAAAA,IAEFC,QAAQqC,KAAKV,MAKhBwB,SAAQ,KACP8lE,EAAc7lE,OAAO8C,GACrBgjE,EAAkB9lE,OAAO8C,GACzBijE,EAAqB/lE,OAAO8C,MAGhC+iE,EAAchmE,IAAIiD,EAAKrD,GAGzB,GAAIwmE,GAAcC,EAAkB,CAClC,IAAIe,EAAkBnB,EAAkBzoE,IAAIyF,GACvCmkE,IACHA,EAAkB,IAAI3qE,IACtBwpE,EAAkBjmE,IAAIiD,EAAKmkE,IAE7BA,EAAgBpnE,IAAIqmE,EAAkBD,GAGxC,OAAOJ,EAAcxoE,IAAIyF,GAGpB,SAASokE,EAAwCpkE,GACtD,OAAO8iE,EAAYvoE,IAAIyF,GAGlB,SAASqkE,EAAehoE,GAC7B2mE,EAAkB/6D,SAAQ,CAACxB,EAAKzG,KAC9ByG,EAAIwB,SAASpN,IACX,GAAIA,IAAawB,EAAkB,CACjC,MAAMioE,EAAiBrB,EAAqB1oE,IAAIyF,GAChD,IAAKskE,EAAgB,QAErBloE,EAAAA,EAAAA,IAAkBkoE,GAClBrB,EAAqB/lE,OAAO8C,GAC5BgjE,EAAkB9lE,OAAO8C,UAM1B,SAAS+tB,EAAe/tB,EAAaojE,GAC1C,MAAM92C,EAAY02C,EAAkBzoE,IAAIyF,GACnCssB,GACLA,EAAUpvB,OAAOkmE,GA+FnB,SAASY,EAAehkE,EAAa2jE,EAA2BG,GAC9D,MAAMX,EAA4B,CAAC1xC,EAAkBqwC,KAA6B,MAChF,UAAAkB,EAAkBzoE,IAAIyF,UAAtB,SAA4BiI,SAASpN,IACnCA,EAAS42B,GACL52B,EAASyB,aAAY6mE,EAAW7mE,YAAa,MAGlC,IAAbm1B,IACFkyC,MAAAA,GAAAA,EAAaY,eAGVzC,IAILgC,MAAAA,GAAAA,EAAcU,aAAa1C,KAG7B,OAAOqB,EAGT,SAASO,EAAae,GACpB,OAAIA,aAAqBlY,KAChBtyD,IAAIi4B,gBAAgBuyC,GAGtBA,EAGLj+B,EAAAA,IACFhY,UAAUk2C,cAAcxqE,iBAAiB,WAAWgB,MAAAA,IAClD,MAAM,KAAEd,EAAF,UAAQI,EAAR,OAAmB+N,GAAW9G,EAAEtH,KAMtC,GAAa,gBAATC,EACF,OAGF,MAAMwO,QAAe5M,EAAAA,EAAAA,IAAQ,gBAAiB,CAAEknE,YAAa/lE,EAAAA,GAAAA,eAA+BoL,IAC5F,IAAKK,EACH,OAGF,MAAM,YAAEk5D,EAAF,SAAe9+D,EAAf,SAAyB2hE,GAAa/7D,EAE5C4lB,UAAUk2C,cAAcE,WAAYroE,YAAY,CAC9CnC,KAAM,eACNI,UAAAA,EACAoO,OAAQ,CACNk5D,YAAAA,EACA9+D,SAAAA,EACA2hE,SAAAA,IAED,CAAC7C,Q,+BC3PD,MAAMnsB,EAAmB,I,0ECEzB,IAAKkvB,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,GAExC7pE,eAAewkB,EAA0DP,EAAeC,GAC7F,IAAK0lD,EAAc3lD,GAAa,CAC9B,OAAQA,GACN,KAAK0lD,EAAQG,KACXF,EAAcD,EAAQG,MAAQ,8BAC9B,MACF,KAAKH,EAAQI,KACPprE,EAAAA,IAEFC,QAAQC,IAAI,8BAGd+qE,EAAcD,EAAQI,MAAQ,uEAC9B,MACF,KAAKJ,EAAQK,MACXJ,EAAcD,EAAQK,OAAS,+DAC/B,MACF,KAAKL,EAAQM,MACXL,EAAcD,EAAQM,OAAS,+DAIlCL,EAAc3lD,GAA4C5jB,KAAK6pE,GAGlE,MAAMC,QAAgBP,EAAc3lD,GAMpC,OAJK4lD,EAAa5lD,KAChB4lD,EAAa5lD,GAAckmD,GAGtB7lD,EAAoBL,EAAYC,GAGlC,SAASI,EAAmEL,EAAeC,GAChG,MAAMimD,EAASN,EAAa5lD,GAE5B,GAAKkmD,EAIL,OAAOA,EAAOjmD,GAGhB,MAAMkmD,EAAkC,GAEjC,SAAS7lD,EAAgB8lD,GACzBD,EAAU5/D,SAAS6/D,IACtBD,EAAUhmE,KAAKimE,GAInB,SAASH,IACPE,EAAUr9D,SAASs9D,IACjBA,S,gNCpDJ,SAASC,EAAeC,GACtB,MAAMtrE,EAAOsrE,EAAaC,SAC1B,OAAOhuC,KAAKG,UAAU,CACpB8tC,SAAUxrE,EAAKwrE,SACf7gD,KAAM3qB,EAAK2qB,OAIf,SAAS8gD,IACP,QAAKvQ,EAAAA,KACC,qBAAsBwQ,0BAA0Bl0B,UAWtB,WAA5Bm0B,aAAaC,YACXlsE,EAAAA,IAEFC,QAAQqC,KAAK,oDAER,GAIH,gBAAiBlB,SACjBpB,EAAAA,IAEFC,QAAQqC,KAAK,2CAER,IAxBHtC,EAAAA,IAEFC,QAAQqC,KAAK,gDAER,IA6CX,MAGM6pE,EAAiB,IAAI5uD,IAEpBlc,eAAe+qE,EAAgBjiE,EAAaozD,GACjD,QAAW3xD,IAAPzB,GAAoBgiE,EAAejkD,IAAI/d,GAAK,OAChD,MAAM,wBAAEkiE,IAA4BrwC,EAAAA,EAAAA,KAAqBnI,EAAAA,EAAAA,OACnDy4C,EAAgB/O,EAASA,EAAS,GAAK8O,EAA0B,GACvE,GAAsB,IAAlBC,EAAqB,OAEzB,MAAMnkC,EAAQ,IAAIszB,MAAM,sBACxBtzB,EAAMo1B,OAAS+O,EACfnkC,EAAM3c,aAAa,kBAAmB,qBAC3B5f,IAAPzB,IACFg+B,EAAM9nC,iBAAiB,SAAS,KAC9B8rE,EAAetkD,IAAI1d,KAClB,CAAEoiE,MAAM,IAEXn4D,YAAW,KACT+3D,EAAe9oE,OAAO8G,KAlBH,MAsBvB,UACQg+B,EAAMqkC,OACZ,MAAO5rE,GACHZ,EAAAA,IAEFC,QAAQqC,KAAK,6CAKZ,MAAMmqE,GAA2B7zD,EAAAA,EAAAA,IAASwzD,EAAiB,KAAM,GAAM,GAS9E/qE,eAAeqrE,IACP,iBAAkBtrE,SACnB,CAAC,UAAW,UAAUyK,SAASogE,aAAaC,mBACzCD,aAAaS,qBAIvBrrE,eAAesrE,EAAoBf,GACjC,MAAMv5D,GAASwhB,EAAAA,EAAAA,MACT+4C,GAAWrlE,EAAAA,EAAAA,MACjB,GAAIqkE,EACF,IACE,MAAMr1C,EAAco1C,EAAeC,GAInC,aAHMzpE,EAAAA,EAAAA,IAAQ,mBAAoBo0B,SAC5Bq1C,EAAa/1C,mBACnB+2C,EAASC,oBAET,MAAOjsE,GACHZ,EAAAA,IAEFC,QAAQC,IAAI,0CAA2CU,GAIzDyR,EAAO5M,aACHtD,EAAAA,EAAAA,IAAQ,mBAAoBkQ,EAAO5M,KAAK8wB,aAC9Cq2C,EAASC,qBAINxrE,eAAew0B,IACpB,IAAKk2C,IAAwB,OAC7B,MAAMe,QAAkCn4C,UAAUk2C,cAAckC,MAC1DnB,QAAqBkB,EAA0BE,YAAYC,wBAC3DN,EAAoBf,GAI5B,IAAIsB,GAAoB,EAwBjB7rE,eAAe64B,IACpB,IAAK6xC,IAIH,kBADMW,IAGR,MAAMI,QAAkCn4C,UAAUk2C,cAAckC,MAChE,IAAInB,QAAqBkB,EAA0BE,YAAYC,kBAC/D,GA9EF,SAAkCrB,GAChC,MAAMv5D,GAASwhB,EAAAA,EAAAA,MACf,OAAKxhB,EAAO5M,OAASmmE,GACjBD,EAAeC,KAAkBv5D,EAAO5M,KAAK8wB,aAC1C10B,KAAKC,MAAQuQ,EAAO5M,KAAK+wB,aAxCX,MAkHhB22C,CAAyBvB,GAA9B,OACMe,EAAoBf,GAC1B,IACEA,QAAqBkB,EAA0BE,YAAY9yC,UAAU,CACnEkzC,iBAAiB,IAEnB,MAAM72C,EAAco1C,EAAeC,GAC/B5rE,EAAAA,IAEFC,QAAQC,IAAI,sCAAuCq2B,SAE/Cp0B,EAAAA,EAAAA,IAAQ,iBAAkBo0B,IAChChvB,EAAAA,EAAAA,MACG8lE,eAAe92C,GAClB,MAAO31B,GACyB,WAA5BqrE,aAAaC,WAKXlsE,EAAAA,IAEFC,QAAQqC,KAAK,mDAENtC,EAAAA,KAKTC,QAAQC,IAAI,sCAAuCU,GAI/CA,EAAMoL,OAASshE,aAAaC,iBACxBb,OAmFPrrE,eAAemsE,GAAsB,KAC1ClhE,EAD0C,QAE1C3J,IAEA,MAAM,oBAAEq3B,SAvJV34B,iBACE,GAAI6rE,EAAmB,OAAOlxC,EAAAA,EAAAA,KAAqBnI,EAAAA,EAAAA,OACnD,MAAO45C,EAAgBC,SAA0BpsE,QAAQo5B,IAAI,EAC3Dv4B,EAAAA,EAAAA,IAAQ,4BAA6B,CACnCq3B,kBAAkB3F,EAAAA,EAAAA,MAAY2F,oBAEhCr3B,EAAAA,EAAAA,IAAQ,8BAA+B,CACrCq3B,kBAAkB3F,EAAAA,EAAAA,MAAY2F,qBAGlC,IAAKi0C,EAAgB,OAAOzxC,EAAAA,EAAAA,KAAqBnI,EAAAA,EAAAA,OAEjD,IAAIxhB,GAASqnB,EAAAA,EAAAA,KAAgB7F,EAAAA,EAAAA,MAAa45C,GAM1C,OALIC,IACFr7D,GAASonB,EAAAA,EAAAA,IAAoBpnB,EAAQq7D,KAEvCh6C,EAAAA,EAAAA,IAAUrhB,GACV66D,GAAoB,GACblxC,EAAAA,EAAAA,IAAqB3pB,GAqIUs7D,GACtC,IAlFF,SAA6BrhE,GAC3B,IAAK4gE,EAAmB,OAAO,EAC/B,MAAM76D,GAASwhB,EAAAA,EAAAA,MAEf,SADgBwP,EAAAA,EAAAA,IAAkB/2B,GAAM0vB,EAAAA,EAAAA,IAAqB3pB,IAAS8vC,EAAAA,EAAAA,IAAuB9vC,KAC9E/F,EAAKw1B,cAAgBx1B,EAAKm4B,UAIjCx7B,SAAS2kE,YA0EZC,CAAoBvhE,GAAO,OAChC,MAAMwhE,EA/PA,iBAAkB1sE,OAQQ,WAA5B6qE,aAAaC,aACXlsE,EAAAA,IAEFC,QAAQqC,KAAK,oDAER,IAZHtC,EAAAA,IAEFC,QAAQqC,KAAK,8DAER,GA2PT,IAAK03B,IAAwB8zC,EAG3B,YADArB,EAAyB7mE,OAAOjD,EAAQwH,KAAOmC,EAAKnC,IAGtD,IAAK2jE,EAA2B,OAChC,IAAKnrE,EAAQwH,GAAI,OAEjB,MAAM,MACJ7B,EADI,KAEJqgB,GAnFJ,SAAgCrc,EAAe3J,GAC7C,MAAM0P,GAASwhB,EAAAA,EAAAA,OACT,SACJoW,EADI,iBAEJN,GACEhnC,EAEEorE,EAAgB9jC,GAAWz3B,EAAAA,EAAAA,IAAWH,EAAQ43B,QAAYr+B,EAC1DoiE,GAAgB7iC,EAAAA,EAAAA,IAAiBxoC,GACjCsrE,EAAsBD,GAAiBrkC,GACzCqM,EAAAA,EAAAA,IAAkB3jC,EAAQ/F,EAAKnC,GAAIw/B,QACnC/9B,GAEFsiE,cAAeC,EACfljE,aAAcmjE,GACZJ,GAAiB,GAEfK,EAAoBF,EACtBA,EAAoBvhE,KAAK0F,IAAWE,EAAAA,EAAAA,IAAWH,EAAQC,KACtDxF,OAAgBrD,cACjBmC,EACE0iE,GAAoB5tC,EAAAA,EAAAA,IAAqBp0B,GACzCiiE,EAAkBD,GAAoB97D,EAAAA,EAAAA,IAAWH,EAAQi8D,QAAqB1iE,EAEpF,IAAI+c,EACJ,IAAIib,EAAAA,EAAAA,IAA+Bt3B,GAAM0vB,EAAAA,EAAAA,IAAqB3pB,IAAS8vC,EAAAA,EAAAA,IAAuB9vC,IAC5F,IAAIy3B,EAAAA,EAAAA,IAAgBnnC,GAAU,CAC5B,MAAMmI,EAAewB,KAASg0B,EAAAA,EAAAA,IAAch0B,IAAS3J,EAAQsnC,WAAatnC,EAAQ4H,QAC9E+B,EACAyhE,EACJplD,GAAO/d,EAAAA,EAAAA,GACLy7D,EAAAA,GACA1jE,EACAmI,EACAujE,EACAJ,EACAG,EACA,CAAEjiE,SAAS,QAER,CACL,MAAMqiE,GAAaznC,EAAAA,EAAAA,IAAqBs/B,EAAAA,GAAgB/5D,EAAKnC,GAAI4jE,GAC3DnlC,GAAU77B,EAAAA,EAAAA,IAAsBs5D,EAAAA,GAAgB1jE,GAEtDgmB,EAAO6lD,EAAc,GAAEA,MAAe5lC,IAAYA,OAGpDjgB,EAAO,cAGT,MAAO,CACLrgB,OAAOkE,EAAAA,EAAAA,GAAa65D,EAAAA,GAAgB/5D,EAAMiiE,GAC1C5lD,KAAAA,GAiCE8lD,CAAuBniE,EAAM3J,GAE3ByV,QA/BR/W,eAAyBiL,GACvB,MAAMoiE,GAAY3tC,EAAAA,EAAAA,IAAkBz0B,GACpC,IAAKoiE,EAAW,OAChB,IAAI9D,EAAY+D,EAAAA,GAAkDD,GAKlE,OAJK9D,UACG+D,EAAAA,GAAkBD,EAAWprE,EAAAA,GAAAA,SACnCsnE,EAAY+D,EAAAA,GAAkDD,IAEzD9D,EAuBYgE,CAAUtiE,GAE7B,GAAIy/D,IAAwB,OAC1B,UAAIp3C,UAAUk2C,qBAAd,OAAI,EAAyBE,YAE3Bp2C,UAAUk2C,cAAcE,WAAWroE,YAAY,CAC7CnC,KAAM,yBACNsC,QAAS,CACPyF,MAAAA,EACAqgB,KAAAA,EACAvQ,KAAAA,EACA7N,OAAQ+B,EAAKnC,GACbxJ,UAAWgC,EAAQwH,UAIpB,CACL,MAAMyiE,GAAWrlE,EAAAA,EAAAA,MACX2D,EAA+B,CACnCyd,KAAAA,EACAvQ,KAAAA,EACAy2D,MAAOz2D,EACPoV,IAAK5nB,OAAOjD,EAAQwH,KAGlB,YAAawqB,YACfzpB,EAAQ4jE,QAAU,CAAC,IAAK,IAAK,MAG/B,MAAMpmB,EAAe,IAAIujB,aAAa3jE,EAAO4C,GAE7Cw9C,EAAaqmB,QAAU,KACrBrmB,EAAasmB,QACbpC,EAASviE,aAAa,CACpBE,OAAQ+B,EAAKnC,GACbxJ,UAAWgC,EAAQwH,KAEjB/I,OAAO8U,OACT9U,OAAO8U,SAKXwyC,EAAaumB,OAAS,KACpBxC,EAAyB7mE,OAAOjD,EAAQwH,KAAOmC,EAAKnC,MAKnD,SAAS+kE,EAA0BrsE,GAA8D,OAClGiX,EAAAA,IAAW,UAAC6a,UAAUk2C,qBAAX,OAAC,EAAyBE,YACzCp2C,UAAUk2C,cAAcE,WAAWroE,YAAY,CAC7CnC,KAAM,4BACNsC,QAAAA,IAKG,SAASssE,IAAoB,MAC9B,UAACx6C,UAAUk2C,qBAAX,OAAC,EAAyBE,YAC9Bp2C,UAAUk2C,cAAcE,WAAWroE,YAAY,CAC7CnC,KAAM,kB,yEC5YV,MAAM6uE,EAAsB,IACtBC,EAAkB,kBAEjB,SAASC,EAAqBC,EAAiCtV,GACpE,OAAOsV,EAAcziE,QAAQ0iE,GAAYA,EAAQC,OAASxV,IAGrD,SAASyV,EAA0BH,EAAiCnrE,EAAQ,IAAI,MACrF,IAAI8wB,EAAc9wB,EAAMsC,QAAQ,WAAY,IACxCwuB,EAAYjlB,WAAW,OACzBilB,EAAcA,EAAYsT,OAAO,IAGnC,MAAMmnC,EAAoBJ,EACvBziE,QAAQ0iE,GAAYt6C,EAAYjlB,WAAWu/D,EAAQI,eAShDC,GAR+DphD,EAAAA,EAAAA,IAAQkhD,EAC1E/iE,KAAK4iE,IAAaA,EAAQM,UAAY,CAAC,KAAKljE,KAAKmjE,IACzC,CACL/jE,KAAO,GAAEwjE,EAAQI,cAAcG,IAC/BP,QAAAA,SAKH1iE,QAAO,EAAGd,KAAAA,KAAWkpB,EAAYjlB,WAAWjE,KAC5CuqC,MAAK,CAACC,EAAGC,IAAMD,EAAExqC,KAAKvH,OAASgyC,EAAEzqC,KAAKvH,SAEzC,iBAAOorE,EAAYA,EAAYprE,OAAS,UAAxC,aAAO,EAAqC+qE,QAGvC,SAASQ,EAAkB5rE,EAAeorE,GAC/C,IAAIt6C,EAAc9wB,EAAMsC,QAAQ,UAAW,IAC3C,GAAI8oE,EACFt6C,EAAcA,EAAYsT,OAAOgnC,EAAQI,YAAYnrE,aAChD,GAAIL,EAAM6L,WAAW,KAC1B,OAAO7L,EAET,MAAM6rE,EAqBR,SAAwBC,EAA2BC,GACjD,IAAKA,GAAgC,IAApBA,EAAS1rE,OAAc,OAAO4qE,EAC/C,GAAwB,IAApBc,EAAS1rE,OAAc,OAAO0rE,EAAS,GAE3C,MAAMC,EAAiBD,EAAS7mC,MAAM2mC,GAAYA,EAAQhgE,WAAWm/D,MAAyBC,EAExFQ,EAAcM,EAASrjE,QAAQmjE,IACnC,MAAMI,EAAWJ,EAAQvpE,QAAQ,WAAY,IAC7C,GAAI2pE,EAASpgE,WAAWm/D,GAAsB,OAAO,EACrD,IAAK,IAAIxqE,EAAI,EAAGA,EAAIsrE,EAAkBzrE,OAAQG,IAC5C,GAAIA,EAAIyrE,EAAS5rE,OAAS,GAAM4rE,EAASzrE,KAAOwqE,GAAuBiB,EAASzrE,KAAOsrE,EAAkBtrE,GACvG,OAAO,EAGX,OAAO,KAIT,OAA8B,IAAvBirE,EAAYprE,OAAeorE,EAAY,GAAKO,EAvCnCE,CAAep7C,EAAas6C,MAAAA,OAAd,EAAcA,EAASW,UAE/CphE,EAAmB,GACzB,IAAIhK,EAAI,EACR,IAAK,IAAIH,EAAI,EAAGA,EAAIswB,EAAYzwB,OAAQG,IAAK,CAC3C,KAAOqrE,EAAQlrE,KAAOqqE,GAAuBrqE,EAAIkrE,EAAQxrE,SACvDsK,EAAOtJ,KAAKwqE,EAAQlrE,IAChBkrE,EAAQlrE,KAAOmwB,EAAYtwB,KAC7BA,IACIA,IAAMswB,EAAYzwB,UAExBM,IAGFgK,EAAOtJ,KAAKyvB,EAAYtwB,IACxBG,IAGF,OAAOgK,EAAO/I,KAAK,IAwBd,SAASuqE,EAA0BhB,EAAiCr6C,GACzE,MAAMs7C,EAAiBt7C,EAAYjlB,WAAW,KAAOilB,EAAe,IAAGA,IACjEs6C,EAAUE,EAA0BH,EAAeiB,GACzD,OAAKhB,EAGG,IAAGA,EAAQI,eAAeI,EAAkBQ,EAAgBhB,KAF3DgB,I,sDCnFJ,MAAMC,EAAqBC,GAChCA,EAAYnmE,OAAO+0B,YACK,WAArBoxC,EAAYnwE,KAAqB,IAAGmwE,EAAYnwE,QACpB,IAA1BmwE,EAAY/uC,SAAmB,IAAG+uC,EAAY/uC,WAAa,IAGrDgvC,EAAqB5qE,IAChC,IAAKA,EAAO,OAEZ,MAAOwE,EAAQqmE,GAAkB7qE,EAAMW,QAAQ,KAAM,IAAIE,MAAM,KAE/D,IAAK2D,EAAQ,OAEb,MAAMsmE,EAAS,CAAC,SAAU,SAAU,aAAahlE,SAAS+kE,GAE1D,MAAO,CACLrmE,OAAAA,EACAhK,KAAQqwE,GAAkBC,EAAUD,EAAqC,SACzEjvC,SAAYivC,IAAmBC,EAAS99C,OAAO69C,GAAkBptE,EAAAA,M,eChB9D,SAASoV,EACdk4D,EACAtL,EACAuL,GAAiB,EACjBC,GAAgB,GAEhB,IAAIC,EAEJ,MAAO,IAAI/uE,KACL+uE,GACF5vD,aAAa4vD,GACbA,OAAiBrlE,GACRmlE,GACTD,KAAM5uE,GAIR+uE,EAAiBlf,KAAK39C,YAAW,KAC3B48D,GACFF,KAAM5uE,GAGR+uE,OAAiBrlE,IAChB45D,IAIA,SAAS1C,EACdgO,EACAtL,EACAuL,GAAiB,GAEjB,IAAIG,EACAC,EACAjvE,EAEJ,MAAO,IAAIkvE,KACTD,GAAY,EACZjvE,EAAOkvE,EAEFF,IACCH,IACFI,GAAY,EACZL,KAAM5uE,IAIRgvE,EAAWnf,KAAKsf,aAAY,KAC1B,IAAKF,EAIH,OAFApf,KAAKuf,cAAcJ,QACnBA,OAAWtlE,GAIbulE,GAAY,EACZL,KAAM5uE,KACLsjE,KAKF,SAAS70C,EAA6CmgD,GAC3D,OAAOS,EAAa//C,EAASs/C,GAGxB,SAASpgD,EAAoDogD,GAClE,OAAOS,EAAa9/C,EAAgBq/C,GAG/B,SAASv9C,EAAiDu9C,GAC/D,OAAOS,EAAa5/C,EAAWm/C,GAO1B,SAASS,EAA0CvgD,EAAwB8/C,GAChF,IACI5uE,EADAsvE,GAAU,EAGd,MAAO,IAAIJ,KACTlvE,EAAOkvE,EAEFI,IACHA,GAAU,EAEVxgD,GAAY,KACVwgD,GAAU,EACVV,KAAM5uE,QAMP,SAASuvE,EAAOtxD,EAAwBU,GAEzCkxC,KAAK2f,oBAEP3f,KAAK2f,oBAAoBvxD,EAAI,CAAEU,QAAAA,IAE/B8Q,EAAUxR,G,8HAQP,MAAM1e,EAAS+jE,GAAe,IAAIlkE,SAAeR,IACtDsT,YAAW,IAAMtT,KAAW0kE,MAGvB,SAASmM,IACd,OAAO,IAAIrwE,SAAeR,IACxB0wB,EAAQ1wB,MAIZ,IAAI8wE,EACAC,EA2BAC,EACAC,EA0BAC,EAnDG,SAASxgD,EAAQxwB,EAA8BixE,GAAY,GAC3DL,EAYMK,EACTJ,EAAyBpsE,KAAKzE,GAE9B4wE,EAAiBnsE,KAAKzE,IAdtB4wE,EAAmBK,EAAY,GAAK,CAACjxE,GACrC6wE,EAA0BI,EAAY,CAACjxE,GAAY,GAEnDuY,uBAAsB,KACpB,MAAM24D,EAAmBN,EACnBO,EAA0BN,EAChCD,OAAmBhmE,EACnBimE,OAA0BjmE,EAC1BumE,EAAwB/jE,SAAS+R,GAAOA,MACxC+xD,EAAiB9jE,SAAS+R,GAAOA,UAShC,SAASsR,EAAezwB,GAC7BwwB,EAAQxwB,GAAU,GAMb,SAAS2wB,EAAU3wB,EAA8BixE,GAAY,GAC7DH,EAYMG,EACTF,EAA2BtsE,KAAKzE,GAEhC8wE,EAAmBrsE,KAAKzE,IAdxB8wE,EAAqBG,EAAY,GAAK,CAACjxE,GACvC+wE,EAA4BE,EAAY,CAACjxE,GAAY,GAErDM,QAAQR,UAAUY,MAAK,KACrB,MAAMwwE,EAAmBJ,EACnBK,EAA0BJ,EAChCD,OAAqBlmE,EACrBmmE,OAA4BnmE,EAC5BumE,EAAwB/jE,SAAS+R,GAAOA,MACxC+xD,EAAiB9jE,SAAS+R,GAAOA,UAShC,SAASyR,EAAiB5wB,GAC/B2wB,EAAU3wB,GAAU,GAKf,SAASoxE,EAAepxE,EAA8BqxE,GAAS,GAepE,OAdKL,IACHA,EAAwB,GAExBjgB,KAAK1xD,iBAAiB,gBAAgB,KACpC2xE,EAAuB5jE,SAAS+R,GAAOA,UAIvCkyD,EACFL,EAAsBvsE,KAAKzE,GAE3BgxE,EAAsBM,QAAQtxE,GAGzB,KACLgxE,EAAwBA,EAAuBllE,QAAQqT,GAAOA,IAAOnf,O,eCtMzE,IAAIuxE,E,yBAEJ,IACEA,EAAgB,IAAI1oE,OAAO,mBAAoB,MAC/C,MAAOjC,GAEP2qE,EAAgB,IAAI1oE,OAAO,cAAe,KAG7B,SAAS49B,EAAY+qC,EAAkBC,GACpD,IAAKD,IAAaC,EAChB,OAAO,EAGT,MAAMC,EAAgC,iBAAXD,EAAsBA,EAAOjjE,cAAc5I,MAAM2rE,GAAiBE,EACvFE,EAAgBH,EAAShjE,cAG/B,GAA2B,IAAvBkjE,EAAYjuE,SAAiBkuE,EAAc9mE,SAAS6mE,EAAY,IAClE,OAAO,EAGT,IAAIE,EAEJ,OAAOF,EAAYv+B,OAAO0+B,KACnBF,EAAc9mE,SAASgnE,KAIvBD,IACHA,EAAgBD,EAAc/rE,MAAM2rE,IAG/BK,EAAc9sD,MAAMgtD,GAAiBA,EAAa7iE,WAAW4iE,QAIjE,SAASnrC,EAA4B+qC,GAC1C,MAAMC,EAAcD,EAAOjjE,cAAc5I,MAAM2rE,GAE/C,OAAQC,GAAqB/qC,EAAY+qC,EAAUE,K,gCCxC9C,MAAM/hC,EAAiBnX,GACrBv1B,KAAKC,MAAMrC,KAAKC,MAAQ,KAAQ03B,G,8ECCzC,SAASu5C,EAAiB1gB,GACtB,OAAO,IAAI/wD,SAAQ,CAACR,EAASD,KAEzBwxD,EAAQ2gB,WAAa3gB,EAAQ4gB,UAAY,IAAMnyE,EAAQuxD,EAAQtjD,QAE/DsjD,EAAQ6gB,QAAU7gB,EAAQqI,QAAU,IAAM75D,EAAOwxD,EAAQzxD,UAWjE,IAAIuyE,EACJ,SAASC,IAIL,OAHKD,IACDA,EAXR,SAAqBE,EAAQC,GACzB,MAAMC,ECLV,WAKI,GAJkB5+C,UAAU6+C,gBACxB,WAAWtZ,KAAKvlC,UAAUD,YACzB,iBAAiBwlC,KAAKvlC,UAAUD,aAEnB++C,UAAUC,UACxB,OAAOpyE,QAAQR,UACnB,IAAI6yE,EACJ,OAAO,IAAIryE,SAASR,IAChB,MAAM8yE,EAAS,IAAMH,UAAUC,YAAYtwE,QAAQtC,GACnD6yE,EAAatC,YAAYuC,EAAQ,KACjCA,OACDxwE,SAAQ,IAAMkuE,cAAcqC,KDPnB,GAAYjyE,MAAK,KACzB,MAAM2wD,EAAUohB,UAAUjhB,KASQ,gBAPlC,OADAH,EAAQwhB,gBAAkB,IAAMxhB,EAAQtjD,OAAO+kE,kBAAkBR,GAC1DP,EAAiB1gB,MAE5B,MAAO,CAAC0hB,EAAQ/yE,IAAauyE,EAAI7xE,MAAMsyE,GAAOhzE,EAASgzE,EAAGC,YAAYX,EAAWS,GAAQG,YAAYZ,MAK3Ea,CAAY,EAAgB,WAE/ChB,E,wBEhBX,MAAMiB,EAAS,CAAC,EAAG,EAAG,EAAG,EAAG,GAErB,SAASC,EAAiBC,GAAa,GAC5C,GAAIA,GAAc52C,aAAaC,QAAQ1jB,EAAAA,IACrC,OAAO,EAGT,MAAMs6D,EAAe72C,aAAaC,QAAQ3jB,EAAAA,IAC1C,IAAKu6D,EAAc,OAAO,EAE1B,IACE,MAAM32C,EAAWC,KAAKC,MAAMy2C,GAC5B,OAAO9qE,QAAQm0B,GAAYA,EAASzzB,IAAMyzB,EAAS42C,MACnD,MAAO5yE,GAEP,OAAO,GAIJ,SAAS8zB,EAAab,EAA6Bc,GACxD,MAAM,SAAE0H,EAAF,KAAYpS,EAAZ,OAAkBtI,GAAWkS,EAEnC6I,aAAaK,QAAQ/jB,EAAAA,GAAkB6jB,KAAKG,UAAU,CAAEw2C,KAAMn3C,EAAUlzB,GAAIwrB,KAC5E+H,aAAaK,QAAQ,KAAMn4B,OAAOy3B,IAClCt6B,OAAOkoB,KAAKA,GAAMre,IAAImmB,QAAQ3kB,SAASqmE,IACrC/2C,aAAaK,QAAS,KAAI02C,aAAiB52C,KAAKG,UAAU/S,EAAKwpD,QAG7D9xD,GACF5f,OAAOkoB,KAAKtI,GAAQ/V,IAAImmB,QAAQ3kB,SAASqmE,IACvC/2C,aAAaK,QAAS,KAAI02C,SAAa52C,KAAKG,UAAUrb,EAAO8xD,QAK5D,SAAS7+C,IACd,CACE5b,EAAAA,GACA,QACGo6D,EAAOxnE,KAAK6nE,GAAU,KAAIA,kBAC1BL,EAAOxnE,KAAK6nE,GAAU,KAAIA,YAC7BrmE,SAAS+c,IACTuS,aAAag3C,WAAWvpD,MAIrB,SAAS2J,IACd,IAAKu/C,IACH,OAGF,MAAMz2C,EAAWC,KAAKC,MAAMJ,aAAaC,QAAQ3jB,EAAAA,KAC3CqjB,EAAWtK,OAAO6K,EAAS42C,MAC3BvpD,EAA+B,GAC/BtI,EAAiC,GAsBvC,OApBAyxD,EAAOhmE,SAASqmE,IACd,IACE,MAAMtpD,EAAMuS,aAAaC,QAAS,KAAI82C,cAClCtpD,IACFF,EAAKwpD,GAAQ52C,KAAKC,MAAM3S,IAG1B,MAAM1J,EAAOic,aAAaC,QAAS,KAAI82C,UACnChzD,IACFkB,EAAO8xD,GAAQ52C,KAAKC,MAAMrc,IAE5B,MAAO7f,GACH5B,EAAAA,IAEFC,QAAQqC,KAAK,gCAAiCV,OAM/CmB,OAAOkoB,KAAKA,GAAMxmB,OAEhB,CACL44B,SAAAA,EACApS,KAAAA,EACAtI,OAAAA,QALF,EASKthB,eAAekzB,IACpB,MAAMogD,EAAYj3C,aAAaC,QAAQ1jB,EAAAA,IACvC,IAAK06D,EAAW,OAEhB,MAAMC,QFjER,SAAazpD,EAAK0pD,EAAczB,KAC5B,OAAOyB,EAAY,YAAajW,GAAUmU,EAAiBnU,EAAMl+D,IAAIyqB,MEgE7C2pD,CAAS,UAASH,KAC5C,IAEEj/C,EADoBmI,KAAKC,MAAM82C,IAE/B,MAAOhzE,GACH5B,EAAAA,IAEFC,QAAQqC,KAAK,gCAAiCV,IAO7CP,eAAemzB,IACpBkJ,aAAag3C,WAAWz6D,EAAAA,IAExB,MAAM86D,QFqBR,SAAcF,EAAczB,KACxB,MAAM4B,EAAQ,GACd,OApBJ,SAAoBH,EAAa7zE,GAC7B,OAAO6zE,EAAY,YAAajW,IAG5BA,EAAMqW,aAAahC,UAAY,WACtBzU,KAAKzvD,SAEV/N,EAASw9D,KAAKzvD,QACdyvD,KAAKzvD,OAAOmmE,aAETnC,EAAiBnU,EAAMqV,gBAU3BkB,CAAWN,GAAcjmD,GAAWomD,EAAMvvE,KAAKmpB,EAAOzD,OAAMzpB,MAAK,IAAMszE,IEvB1DF,SAEhBxzE,QAAQo5B,IAAkB,CAC9B1E,EAASo9B,MAAM,aACZ2hB,EACAjoE,QAAQ9I,GAAmB,iBAANA,GAAkBA,EAAEiM,WAAW,4BACpDrD,KAAK5I,GFpBZ,SAAamnB,EAAK0pD,EAAczB,KAC5B,OAAOyB,EAAY,aAAcjW,IAC7BA,EAAMv7D,OAAO8nB,GACN4nD,EAAiBnU,EAAMqV,gBEiBpBa,CAAQ9wE,S,o4DC1G1B,IAAIoxE,GAAgB,EAEpB,MAAMC,EAAkB,yDAGlBC,EAAgB,IAAI/3D,IAAI,CAC5B,wBACA,2BAGIg4D,EAAO,CAACC,EAAeC,EAAaC,KAChC,EAAIA,GAAsBF,EAAQE,EAAqBD,EAG3DE,EAAU5yE,OAAOkoB,KAAK2qD,GAAiDhpE,KAAKipE,IAAD,CAC/EA,SAAAA,EACAF,OAAQ,CAACG,EAASF,EAAYC,GAAU,IAAKC,EAASF,EAAYC,GAAU,SAG9E,GAAgBz2C,EAA2B22C,KACzC,MAAMC,EAAwB,SAAV52C,EACd62C,EAAgBb,GAAiBW,EACjCG,EAAaF,EAAc,EAAI,EAC/BG,EAAWH,EAAc,EAAI,EAC7BI,EAAUv0E,KAAKC,MACfu0E,EAAgBptE,SAASqtE,cAAc,4BAE7CrtE,SAASw1B,gBAAgB3X,UAAU+Y,OAAQ,UAAQm2C,EAAc,QAAU,SACvEZ,GACFnsE,SAASw1B,gBAAgB3X,UAAUe,IAAI,iBAEzC5e,SAASw1B,gBAAgB3X,UAAUe,IAAK,SAAQuX,KAC5Ci3C,GACFA,EAAc7qD,aAAa,UAAWwqD,EAAc,UAAY,QAGlE5hE,YAAW,KACTnL,SAASw1B,gBAAgB3X,UAAU+Y,OAAO,mBAjCZ,KAoChCu1C,GAAgB,EAEZa,GACFpmB,EAAAA,EAAAA,KAAc,KACZ,MAAMzqD,EAAInB,KAAKy0C,KAAK72C,KAAKC,MAAQs0E,GAzCnB,IAyC2C,GAIzD,OAFAG,EAAwBL,EAAYC,EAS1C,SAAoB/wE,GAClB,OAAO,GAAM,EAAIA,IAAM,IAV2BoxE,CAAWpxE,IAElDA,EAAI,KAGbmxE,EAAwBL,EAAYC,IAQxC,SAASL,EAASW,GAChB,MAAM1nE,EAASsmE,EAAgBlkD,KAAKslD,GAEpC,MAAO,CACLC,EAAGtd,SAASrqD,EAAO,GAAI,IACvB4nE,EAAGvd,SAASrqD,EAAO,GAAI,IACvB0nC,EAAG2iB,SAASrqD,EAAO,GAAI,IACvBynC,OAAiB5qC,IAAdmD,EAAO,GAAmBqqD,SAASrqD,EAAO,GAAI,SAAMnD,GAI3D,SAAS2qE,EAAwBL,EAAoBC,EAAkBT,EAA6B,GAClGC,EAAOvnE,SAAQ,EAAGynE,SAAAA,EAAUF,OAAQiB,MAClC,MAAMF,EAAIzyE,KAAKiP,MAAMqiE,EAAKqB,EAAeV,GAAYQ,EAAGE,EAAeT,GAAUO,EAAGhB,IAC9EiB,EAAI1yE,KAAKiP,MAAMqiE,EAAKqB,EAAeV,GAAYS,EAAGC,EAAeT,GAAUQ,EAAGjB,IAC9Ej/B,EAAIxyC,KAAKiP,MAAMqiE,EAAKqB,EAAeV,GAAYz/B,EAAGmgC,EAAeT,GAAU1/B,EAAGi/B,IAC9El/B,OAAqC5qC,IAAjCgrE,EAAeV,GAAY1/B,EACjCvyC,KAAKiP,MAAMqiE,EAAKqB,EAAeV,GAAY1/B,EAAIogC,EAAeT,GAAU3/B,EAAIk/B,SAC5E9pE,EAEJ3C,SAASw1B,gBAAgBnqB,MAAM+qB,YAAYw2C,OAAgBjqE,IAAN4qC,EAChD,QAAOkgC,KAAKC,KAAKlgC,KAAKD,EAAI,OAC1B,OAAMkgC,KAAKC,KAAKlgC,MAEjB6+B,EAAcptD,IAAI2tD,IACpB5sE,SAASw1B,gBAAgBnqB,MAAM+qB,YAAa,GAAEw2C,QAAiB,GAAEa,KAAKC,KAAKlgC,U,2EC9F1E,SAASoxB,EAAc9hE,GAC5B,OAAOH,OAAOG,GAAOW,QAAQ,mBAAoB,OAGnD,SAASmwE,EAAkBhoC,GAEzB,MAAyB,OADXjpC,OAAOipC,EAAO/lC,QAAQ,IAC1B0/B,QAAQ,GACTvkC,KAAKiP,MAAM27B,GAGbA,EAAO/lC,QAAQ,GAAGpC,QAAQ,IAAK,KAGjC,SAASowE,EAAqBC,GACnC,OAAIA,EAAQ,IACHA,EAGLA,EAAQ,IACF,GAAEF,EAAkBE,EAAQ,QAG9B,GAAEF,EAAkBE,EAAQ,QAG/B,SAASC,EAAgBC,EAAgBC,EAAQ,GACtD,OAAOD,EACJvwE,QAAQ,yCAA0C,IAClDiH,OACA/G,MAAM,OACNE,MAAM,EAAGowE,GACTtqE,KAAKuqE,IACJ,IAAKA,EAAK1yE,OAAQ,MAAO,GAEzB,MAAMiM,GADNymE,GAAO1mE,EAAAA,EAAAA,IAAoB0mE,IACP3wE,MAAM2I,EAAAA,GAC1B,OAAIuB,GAAUymE,EAAKlnE,WAAWS,EAAO,IAC5BA,EAAO,GAETymE,EAAK3wE,MAAM,MAAO,GAAGV,iBAE7BE,KAAK,M,eCzCK,SAASuG,EAAStF,EAA0BxC,EAF3B,IAG9B,OAAKwC,GAAQA,EAAKxC,QAAUA,EACnBwC,EAGD,GAAEA,EAAKuhC,OAAO,EAAG/jC,Q,sGCD3B,IAAIo5D,EACAp+D,EAEG,MAAM23E,EAAuB,qHAG7B/1E,eAAesoE,EAAUxjE,EAAawsD,GAG3C,IAFA0kB,KAEQ53E,EAAO63E,iBACP71E,EAAAA,EAAAA,IAZ4B,KAepC,MAAM,OAAEsN,EAAF,MAAU6+B,EAAV,OAAiBC,SAuEzB,SAA0B1nC,EAAawsD,GACrC,OAAO,IAAIrxD,SAASR,IACbrB,EAAO83E,WACV93E,EAAO83E,SAAW,IAAI53E,KAGxBF,EAAO83E,SAASr0E,IAAIiD,EAAKrF,GACzBrB,EAAOiD,YAAY,CAAEyH,GAAIhE,EAAKwsD,KAAAA,OA9EQ6kB,CAAiBrxE,EAAKwsD,GAC9D,GAAK/kB,GAAUC,EAIf,OA2BF,UAAmB,OAAE9+B,EAAF,MAAU6+B,EAAV,OAAiBC,IAKlC,OAJKgwB,IACHA,EAAS50D,SAAS6F,cAAc,WAG3B,IAAIxN,SAASR,IAClB,MAAMu8D,EAAM,IAAIoa,UAAU1oE,EAAQ6+B,EAAOC,GAEzCgwB,EAAOjwB,MAAQA,EACfiwB,EAAOhwB,OAASA,EACJgwB,EAAOjC,WAAW,MAC1B8b,aAAara,EAAK,EAAG,GAEzBQ,EAAO8Z,QAAQhlB,IACb7xD,EAAQ6xD,MAAAA,EAAAA,OAAQ/mD,KACf,YAAa,MA1CXgsE,CAAU,CAAE7oE,OAAAA,EAAQ6+B,MAAAA,EAAOC,OAAAA,IAG7BxsC,eAAew2E,EAAgB1sD,EAAa8gB,GACjD,IAAIxB,EAAAA,EAAAA,OAA+C,oBAA1BwB,EAAQzD,OAAO,EAAG,IACzC,OAAOyD,EAGTorC,IAEA,MAAMS,QAAgBnO,EAAUx+C,GAAKmxC,EAAAA,EAAAA,IAAcrwB,IAEnD,IAAK6rC,EACH,MAAM,IAAIn2E,MAAO,mCAAkCsqC,KAGrD,OAAO4wB,EAAAA,EAAAA,IAAcib,GAGvB,SAAST,IACF53E,IACHA,EAAS,IAAIU,OAAO,IAAIC,IAAI,mBAC5BX,EAAO63E,WAAY,EACnB73E,EAAO4oE,UAAY0P,GAuBvB,SAASA,EAAqBnwE,GAC5B,MAAM,GAAEuC,GAAOvC,EAAEtH,KACjB,OAAQsH,EAAEtH,KAAKC,MACb,IAAK,cACHd,EAAO63E,WAAY,EACnB,MAGF,IAAK,SACH,GAAI73E,EAAO83E,SAASrvD,IAAI/d,GAAK,CAC3B,MAAMrJ,EAAUrB,EAAO83E,SAAS72E,IAAIyJ,GAEpC1K,EAAO83E,SAASl0E,OAAO8G,GACvBrJ,EAAQ8G,EAAEtH,U,0EC/ElB,MAAM03E,EAAe,CACnB,OACA,eACAprE,KAAKnG,GAAY,KAAIA,iBACjBwxE,EAAmB,GAAEr+D,EAAAA,OACrBs+D,EAAc,YAGdC,EAAQ,IACLl0E,KAAKC,MAAM6uB,OAAO,IAAIlxB,MAAU,KAWzC,IAAIu2E,EAEG,MAAMtiD,EAAgBuiD,IAC3B,MAAMC,EAAYH,KAEZ,YAAEI,EAAF,GAAeC,GAAO36C,KAAKC,MAAMJ,aAAaC,QAAQu6C,IAAgB,MAE5E,OAAIK,IAAgBF,GAAUG,EArBR,OAqBgCF,EAC7Ch3E,QAAQo5B,IAAIs9C,EAAaprE,KAAKzG,GAC5B,IAAI7E,SAAc,CAACR,EAASD,KACjC,MAAM43E,EAASxvE,SAAS6F,cAAc,UAEhC4pE,EAAgB,MAAQzvE,SAAS0f,KAAK8B,YAAYguD,GAExDA,EAAO1nE,IAAM5K,EAAM,IAAIwyE,gBAAgB,CACrCN,OAAQtlD,OAAOslD,GAAQ/4C,WACvBs5C,QAASX,IAGXhvE,SAAS0f,KAAK6B,YAAYiuD,GAE1BA,EAAOhe,OAAS,KA7BN4d,CAAAA,IAChB,MAAMG,EAAKL,IACXz6C,aAAaK,QAAQm6C,EAAar6C,KAAKG,UAAU,CAC/Cu6C,YAAaF,EACbG,GAAAA,MA0BMK,CAASR,GACTK,IACIN,IACF/2D,aAAa+2D,GACbA,OAAcxsE,GAEhB4zB,IACA1+B,KAGF23E,EAAO/d,QAAU,KACfge,IACA73E,WAKCS,QAAQR,WAIZ,SAAS0+B,IACd,GAAIx/B,EAAAA,GACF,OAGF,QAAoB4L,IAAhBwsE,EAA2B,OAC/B,MAAME,EAAYH,KAEZ,GAAEK,GAAO36C,KAAKC,MAAMJ,aAAaC,QAAQu6C,IAAgB,MAEzDr3D,EAnEgB,OAmEay3D,EAAYE,GAE/CJ,EAAchkE,YAAW,KACvB,MAAM,UAAEgoB,IAAcvI,EAAAA,EAAAA,MAEhBwkD,EAAuB,4BAAdj8C,IAA2Ci4C,EAAAA,EAAAA,KAAiB,GAC3Ev+C,EAAauiD,KACZp0E,KAAK+oB,IAAI,EAAa,IAAVnM,M,0ECvEjB,MAAMi4D,EAAexrB,EAAAA,IAA2ByrB,IAE1CC,EAAgB53E,OAAO0Z,YAC7B,IAAIm+D,EAAaC,IACbC,GAAoB,EAUxB,MAAMC,GAAetW,EAAAA,EAAAA,KAAS,KAC5BmW,EAAaC,KAERC,KAiCEF,EAAWrrC,OAAShxB,EAAAA,IACzBq8D,EAAWrrC,OAAS/wB,EAAAA,IAAqCo8D,EAAWprC,QAAU/wB,EAAAA,MAjCzDwwC,EAAAA,IACjBA,EAAAA,IAA2BwrB,IAAiBC,MAEhD33E,OAAOY,SAASC,WAEjB,KAAK,GASD,SAASi3E,IACd,IAAIrrC,EAEFA,EADE97B,EAAAA,GACO3Q,OAAOi4E,eAAexrC,OAASzsC,OAAOi4E,eAAeC,QAErDl4E,OAAO0Z,YAElB,MAAMy+D,EAAc,IAAT1rC,EAIX,OAFA5kC,SAASw1B,gBAAgBnqB,MAAM+qB,YAAY,OAAS,GAAEk6C,OAE/C,CACL3rC,MAAOxsC,OAAOojB,WACdqpB,OAAQzsC,OAAO0Z,aAUnB,SAASi+D,IACP,OAAIhnE,EAAAA,GACK3Q,OAAO49B,WAAW,4BAA4B67B,QAOhDz5D,OAAO49B,WAAW,0EAA0E67B,QAvCrGz5D,OAAOf,iBAAiB,oBAAqB+4E,GACzCrnE,EAAAA,GACF3Q,OAAOi4E,eAAeh5E,iBAAiB,SAAU+4E,GAEjDh4E,OAAOf,iBAAiB,SAAU+4E,GAsCpC,SACE14E,IAAK,IAAMu4E,EACXO,qBAAsB,IAAMR,EAAgBC,EAAWprC,OACvD4rC,eAhEF,WACEN,GAAoB,GAgEpBO,cA7DF,WACEP,GAAoB,K,iNCvBlBQ,EAA2B,GAG/B,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBjuE,IAAjBkuE,EACH,OAAOA,EAAaC,QAGrB,IAAIr0D,EAASi0D,EAAyBE,GAAY,CAGjDE,QAAS,IAOV,OAHAC,EAAoBH,GAAUtuE,KAAKma,EAAOq0D,QAASr0D,EAAQA,EAAOq0D,QAASH,GAGpEl0D,EAAOq0D,QAIfH,EAAoBK,EAAID,ECxBxBJ,EAAoBl1E,EAAKghB,IACxB,IAAIw0D,EAASx0D,GAAUA,EAAOy0D,WAC7B,IAAOz0D,EAAiB,QACxB,IAAM,EAEP,OADAk0D,EAAoB7zD,EAAEm0D,EAAQ,CAAE1jC,EAAG0jC,IAC5BA,GvHNJ96E,EAAW2D,OAAOq3E,eAAkBC,GAASt3E,OAAOq3E,eAAeC,GAASA,GAASA,EAAa,UAQtGT,EAAoBx0E,EAAI,SAASW,EAAOw9D,GAEvC,GADU,EAAPA,IAAUx9D,EAAQy4D,KAAKz4D,IAChB,EAAPw9D,EAAU,OAAOx9D,EACpB,GAAoB,iBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAPw9D,GAAax9D,EAAMo0E,WAAY,OAAOp0E,EAC1C,GAAW,GAAPw9D,GAAoC,mBAAfx9D,EAAMrE,KAAqB,OAAOqE,EAE5D,IAAIu0E,EAAKv3E,OAAOw3E,OAAO,MACvBX,EAAoBlD,EAAE4D,GACtB,IAAIE,EAAM,GACVr7E,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,IAAKA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAIyW,EAAiB,EAAP0tD,GAAYx9D,EAAyB,iBAAX8P,KAAyB1W,EAAekK,QAAQwM,GAAUA,EAAUzW,EAASyW,GACxH9S,OAAO03E,oBAAoB5kE,GAASzH,SAAS+c,GAASqvD,EAAIrvD,GAAO,IAAOplB,EAAMolB,KAI/E,OAFAqvD,EAAa,QAAI,IAAM,EACvBZ,EAAoB7zD,EAAEu0D,EAAIE,GACnBF,GwHvBRV,EAAoB7zD,EAAI,CAACg0D,EAASW,KACjC,IAAI,IAAIvvD,KAAOuvD,EACXd,EAAoBe,EAAED,EAAYvvD,KAASyuD,EAAoBe,EAAEZ,EAAS5uD,IAC5EpoB,OAAO63E,eAAeb,EAAS5uD,EAAK,CAAE0vD,YAAY,EAAMn6E,IAAKg6E,EAAWvvD,MCJ3EyuD,EAAoBnoB,EAAI,GAGxBmoB,EAAoBhyE,EAAKkzE,GACjBx5E,QAAQo5B,IAAI33B,OAAOkoB,KAAK2uD,EAAoBnoB,GAAG9iD,QAAO,CAACosE,EAAU5vD,KACvEyuD,EAAoBnoB,EAAEtmC,GAAK2vD,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,EAAoBjD,EAAI,WACvB,GAA0B,iBAAfuE,WAAyB,OAAOA,WAC3C,IACC,OAAO1c,MAAQ,IAAI2c,SAAS,cAAb,GACd,MAAOvzE,GACR,GAAsB,iBAAXxG,OAAqB,OAAOA,QALjB,GCAxBw4E,EAAoBe,EAAI,CAACN,EAAKvoB,IAAU/uD,OAAO+0C,UAAUgnB,eAAevzD,KAAK8uE,EAAKvoB,G5HA9EzyD,EAAa,GACbC,EAAoB,cAExBs6E,EAAoBh2D,EAAI,CAACzd,EAAKi1E,EAAMjwD,EAAK2vD,KACxC,GAAGz7E,EAAW8G,GAAQ9G,EAAW8G,GAAKV,KAAK21E,OAA3C,CACA,IAAI3C,EAAQ4C,EACZ,QAAWzvE,IAARuf,EAEF,IADA,IAAImwD,EAAUryE,SAASsyE,qBAAqB,UACpC32E,EAAI,EAAGA,EAAI02E,EAAQ72E,OAAQG,IAAK,CACvC,IAAIiC,EAAIy0E,EAAQ12E,GAChB,GAAGiC,EAAEinB,aAAa,QAAU3nB,GAAOU,EAAEinB,aAAa,iBAAmBxuB,EAAoB6rB,EAAK,CAAEstD,EAAS5xE,EAAG,OAG1G4xE,IACH4C,GAAa,GACb5C,EAASxvE,SAAS6F,cAAc,WAEzB0sE,QAAU,QACjB/C,EAAO53D,QAAU,IACb+4D,EAAoB6B,IACvBhD,EAAOjtD,aAAa,QAASouD,EAAoB6B,IAElDhD,EAAOjtD,aAAa,eAAgBlsB,EAAoB6rB,GACxDstD,EAAO1nE,IAAM5K,GAEd9G,EAAW8G,GAAO,CAACi1E,GACnB,IAAIM,EAAmB,CAACt4D,EAAMrO,KAE7B0jE,EAAO/d,QAAU+d,EAAOhe,OAAS,KACjCp5C,aAAaR,GACb,IAAI86D,EAAUt8E,EAAW8G,GAIzB,UAHO9G,EAAW8G,GAClBsyE,EAAO7vD,YAAc6vD,EAAO7vD,WAAW6B,YAAYguD,GACnDkD,GAAWA,EAAQvtE,SAAS0iE,GAAQA,EAAG/7D,KACpCqO,EAAM,OAAOA,EAAKrO,IAGlB8L,EAAUzM,WAAWsnE,EAAiBE,KAAK,UAAMhwE,EAAW,CAAErL,KAAM,UAAWgI,OAAQkwE,IAAW,MACtGA,EAAO/d,QAAUghB,EAAiBE,KAAK,KAAMnD,EAAO/d,SACpD+d,EAAOhe,OAASihB,EAAiBE,KAAK,KAAMnD,EAAOhe,QACnD4gB,GAAcpyE,SAAS4yE,KAAKrxD,YAAYiuD,K6HvCzCmB,EAAoBlD,EAAKqD,IACH,oBAAX7rD,QAA0BA,OAAO4tD,aAC1C/4E,OAAO63E,eAAeb,EAAS7rD,OAAO4tD,YAAa,CAAE/1E,MAAO,WAE7DhD,OAAO63E,eAAeb,EAAS,aAAc,CAAEh0E,OAAO,K,MCLvD,IAAIg2E,EACAnC,EAAoBjD,EAAEqF,gBAAeD,EAAYnC,EAAoBjD,EAAE30E,SAAW,IACtF,IAAIiH,EAAW2wE,EAAoBjD,EAAE1tE,SACrC,IAAK8yE,GAAa9yE,IACbA,EAASgzE,gBACZF,EAAY9yE,EAASgzE,cAAclrE,MAC/BgrE,GAAW,CACf,IAAIT,EAAUryE,EAASsyE,qBAAqB,UACzCD,EAAQ72E,SAAQs3E,EAAYT,EAAQA,EAAQ72E,OAAS,GAAGsM,KAK7D,IAAKgrE,EAAW,MAAM,IAAIp6E,MAAM,yDAChCo6E,EAAYA,EAAUr1E,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpFkzE,EAAoBnxD,EAAIszD,G,G7H0BpBx8E,EAAkBu7E,GACd,IAAIx5E,SAAQ,CAACR,EAASD,KAC5B,IAAIuF,EAAOwzE,EAAoBqB,SAASH,GACpCoB,EAAWtC,EAAoBnxD,EAAIriB,EACvC,GAlBmB,EAACA,EAAM81E,KAE3B,IADA,IAAIC,EAAmBlzE,SAASsyE,qBAAqB,QAC7C32E,EAAI,EAAGA,EAAIu3E,EAAiB13E,OAAQG,IAAK,CAChD,IACIw3E,GADA5uD,EAAM2uD,EAAiBv3E,IACRkpB,aAAa,cAAgBN,EAAIM,aAAa,QACjE,GAAe,eAAZN,EAAIhlB,MAAyB4zE,IAAah2E,GAAQg2E,IAAaF,GAAW,OAAO1uD,EAErF,IAAI6uD,EAAoBpzE,SAASsyE,qBAAqB,SACtD,IAAQ32E,EAAI,EAAGA,EAAIy3E,EAAkB53E,OAAQG,IAAK,CACjD,IAAI4oB,EAEJ,IADI4uD,GADA5uD,EAAM6uD,EAAkBz3E,IACTkpB,aAAa,gBAChB1nB,GAAQg2E,IAAaF,EAAU,OAAO1uD,IAOnD8uD,CAAel2E,EAAM81E,GAAW,OAAOp7E,IA7CrB,EAACg6E,EAASoB,EAAUp7E,EAASD,KACnD,IAAI07E,EAAUtzE,SAAS6F,cAAc,QAErCytE,EAAQ/zE,IAAM,aACd+zE,EAAQh8E,KAAO,WAiBfg8E,EAAQ7hB,QAAU6hB,EAAQ9hB,OAhBJ1lD,IAGrB,GADAwnE,EAAQ7hB,QAAU6hB,EAAQ9hB,OAAS,KAChB,SAAf1lD,EAAMxU,KACTO,QACM,CACN,IAAI07E,EAAYznE,IAAyB,SAAfA,EAAMxU,KAAkB,UAAYwU,EAAMxU,MAChEk8E,EAAW1nE,GAASA,EAAMxM,QAAUwM,EAAMxM,OAAOnC,MAAQ81E,EACzDt6E,EAAM,IAAID,MAAM,qBAAuBm5E,EAAU,cAAgB2B,EAAW,KAChF76E,EAAIoK,KAAO,wBACXpK,EAAIrB,KAAOi8E,EACX56E,EAAIywD,QAAUoqB,EACdF,EAAQ3zD,WAAW6B,YAAY8xD,GAC/B17E,EAAOe,KAIT26E,EAAQn2E,KAAO81E,EAEfjzE,SAAS4yE,KAAKrxD,YAAY+xD,IAsBzBG,CAAiB5B,EAASoB,EAAUp7E,EAASD,MAI3CrB,EAAqB,CACxB,IAAK,GAGNo6E,EAAoBnoB,EAAEkrB,QAAU,CAAC7B,EAASC,KAEtCv7E,EAAmBs7E,GAAUC,EAASt1E,KAAKjG,EAAmBs7E,IACzB,IAAhCt7E,EAAmBs7E,IAFX,CAAC,GAAK,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,GAEPA,IACtDC,EAASt1E,KAAKjG,EAAmBs7E,GAAWv7E,EAAeu7E,GAASp5E,MAAK,KACxElC,EAAmBs7E,GAAW,KAC3BlzE,IAEH,aADOpI,EAAmBs7E,GACpBlzE,O,M8H9DTgyE,EAAoBnjC,EAAIxtC,SAAS2zE,SAAW7qB,KAAK/vD,SAASoE,KAK1D,IAAIy2E,EAAkB,CACrB,IAAK,GAGNjD,EAAoBnoB,EAAE1sD,EAAI,CAAC+1E,EAASC,KAElC,IAAI+B,EAAqBlD,EAAoBe,EAAEkC,EAAiB/B,GAAW+B,EAAgB/B,QAAWlvE,EACtG,GAA0B,IAAvBkxE,EAGF,GAAGA,EACF/B,EAASt1E,KAAKq3E,EAAmB,QAC3B,CAGL,IAAIh6E,EAAU,IAAIxB,SAAQ,CAACR,EAASD,IAAYi8E,EAAqBD,EAAgB/B,GAAW,CAACh6E,EAASD,KAC1Gk6E,EAASt1E,KAAKq3E,EAAmB,GAAKh6E,GAGtC,IAAIqD,EAAMyzE,EAAoBnxD,EAAImxD,EAAoBoB,EAAEF,GAEpDl6E,EAAQ,IAAIe,MAgBhBi4E,EAAoBh2D,EAAEzd,GAfF4O,IACnB,GAAG6kE,EAAoBe,EAAEkC,EAAiB/B,KAEf,KAD1BgC,EAAqBD,EAAgB/B,MACR+B,EAAgB/B,QAAWlvE,GACrDkxE,GAAoB,CACtB,IAAIN,EAAYznE,IAAyB,SAAfA,EAAMxU,KAAkB,UAAYwU,EAAMxU,MAChEw8E,EAAUhoE,GAASA,EAAMxM,QAAUwM,EAAMxM,OAAOwI,IACpDnQ,EAAM+B,QAAU,iBAAmBm4E,EAAU,cAAgB0B,EAAY,KAAOO,EAAU,IAC1Fn8E,EAAMyB,KAAO,iBACbzB,EAAML,KAAOi8E,EACb57E,EAAMyxD,QAAU0qB,EAChBD,EAAmB,GAAGl8E,MAIgB,SAAWk6E,EAASA,KAiBlE,IAAIkC,EAAuB,CAACC,EAA4B38E,KACvD,IAGIu5E,EAAUiB,GAHToC,EAAUC,EAAaC,GAAW98E,EAGhBsE,EAAI,EAC3B,GAAGs4E,EAASp3D,MAAM3b,GAAgC,IAAxB0yE,EAAgB1yE,KAAa,CACtD,IAAI0vE,KAAYsD,EACZvD,EAAoBe,EAAEwC,EAAatD,KACrCD,EAAoBK,EAAEJ,GAAYsD,EAAYtD,IAG7CuD,GAAsBA,EAAQxD,GAGlC,IADGqD,GAA4BA,EAA2B38E,GACrDsE,EAAIs4E,EAASz4E,OAAQG,IACzBk2E,EAAUoC,EAASt4E,GAChBg1E,EAAoBe,EAAEkC,EAAiB/B,IAAY+B,EAAgB/B,IACrE+B,EAAgB/B,GAAS,KAE1B+B,EAAgBK,EAASt4E,IAAM,GAK7By4E,EAAqBtrB,KAA6B,uBAAIA,KAA6B,wBAAK,GAC5FsrB,EAAmBjvE,QAAQ4uE,EAAqBpB,KAAK,KAAM,IAC3DyB,EAAmB53E,KAAOu3E,EAAqBpB,KAAK,KAAMyB,EAAmB53E,KAAKm2E,KAAKyB,K,6DC3EvF,SAASC,EAAoB11E,GAC3B,MAAMuD,EAAuBvD,EAAEtH,KAK/B,GAJIuZ,EAAAA,IAEF5Z,QAAQC,IAAI,2BAA4BiL,IAErCA,EAAO5K,KAAM,OAClB,MAAMqsE,GAAWrlE,EAAAA,EAAAA,MACjB,OAAQ4D,EAAO5K,MACb,IAAK,eACCqsE,EAASviE,cACXuiE,EAASviE,aAAac,EAAOtI,SAE/B,MACF,IAAK,yBACH4pE,EAAAA,EAAAA,IAAyBthE,EAAOtI,QAAQsH,KAK9C,SAASjJ,IACPyzB,UAAUk2C,cAAc5pD,oBAAoB,UAAWq8D,GACvD3oD,UAAUk2C,cAAcxqE,iBAAiB,UAAWi9E,IAEpDnO,EAAAA,EAAAA,MAGE3T,EAAAA,KACFp6D,OAAOf,iBAAiB,QAAQgB,UAC9B,UACQszB,UAAUk2C,cAAc0S,SAAS,IAAIn9E,IAAI,mBAE3CJ,EAAAA,IAEFC,QAAQC,IAAI,uCAGRy0B,UAAUk2C,cAAckC,MAE1Bp4C,UAAUk2C,cAAcE,YACtB/qE,EAAAA,IAEFC,QAAQC,IAAI,4BAEdgB,MAEIlB,EAAAA,IAEFC,QAAQW,MAAM,oCAGXmR,EAAAA,IAAW0tB,EAAAA,KACdl4B,EAAAA,EAAAA,MAAc+2B,WAAW,CAAEh+B,KAAM,CAAEqC,QAAS,0BAA2B66E,aAAa,MAGxF,MAAO57E,GACH5B,EAAAA,IAEFC,QAAQW,MAAM,2CAA4CgB,OAIhER,OAAOf,iBAAiB,SAASgB,gBACzBszB,UAAUk2C,cAAckC,MAC9B7rE,Q,cC/DG,MAAMu8E,EAA6B,CACxCC,mBAAmB,EACnB5wB,iBAAiB,EACjBC,uB,QAAwBE,GAAAA,OACxBrtB,aAAc,EACdpG,iBAAkB,EAElB2D,gBAAgB,EAChBzB,YAAa,CACXiiD,WAAY,GACZC,QAAS,IAGX9kD,QAAS,CACPC,IAAK,GACLE,WAAY,GAGdpC,MAAO,CACLC,KAAM,GACN0lB,aAAc,IAGhBxlB,MAAO,CACLyO,QAAS,GACToN,cAAe,GACfnN,iBAAkB,GAClBzM,WAAY,GACZnC,KAAM,IAGRqW,SAAU,CACRqG,SAAU,GACVJ,aAAc,GACdqE,kBAAmB,IAGrBomC,WAAY,CACV/mD,KAAM,IAGRogB,kBAAmB,CACjB1D,SAAU,IAGZoO,YAAa,CACX9qB,KAAM,GACNgnD,iBAAkB,GAGpB71B,YAAa,CACXC,iBAAkB,IAGpB61B,aAAc,CAAC,WAAY,gBAAiB,iBAAkB,QAAS,UAEvErkC,SAAU,CACRC,SAAU,GACVqkC,MAAO,GACPC,OAAQ,CACNvkC,SAAU,IAEZoN,SAAU,CACRpN,SAAU,IAEZwkC,SAAU,CACRxkC,SAAU,IAEZykC,SAAU,CACRvkC,OAAQ,IAEVh4B,OAAQ,GACRm5B,SAAU,IAGZqjC,cAAe,GAEf/jC,KAAM,CACJgkC,MAAO,GACPz8D,OAAQ,IAGV08D,WAAY,CACVhrE,WAAW,EACXirE,WAAY,IAGd1hC,aAAc,GAEdZ,WAAY,GAEZ8B,gBAAiB,CACfC,gBAAiB,IAGnBM,iBAAkB,CAChB9K,SAAU,IAGZoL,WAAY,CACVpL,SAAU,IAGZgrC,SAAU,GAEVC,cAAe,GAEf9xB,YAAa,GAEb+xB,YAAa,CACXnhB,OAAQ1hD,EAAAA,GACR8iE,aAAc7iE,EAAAA,GACd0nB,SAAS,GAGXulB,gBAAiB,GAEjBoE,YAAa,GAEb5N,QAAS,GAETq/B,cAAe,GAEfC,QAAS,GAETxlD,eAAgB,GAEhBnB,SAAU,CACR+B,MAAO,CACLmF,MAAO,QACP8uB,sBAAsB,EACtB/uB,gBAAiBptB,EAAAA,GACboK,EAAAA,GACCujB,EAAAA,GAAYtjB,EAAAA,GAAqCF,EAAAA,GACtD2iB,eAAgB5iB,EAAAA,GAChB6iE,oBAAqB,QACrB30B,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,EAC3Bi0B,sBAAuB,GACvB/kD,qBAAqB,EACrBD,sBAAsB,EACtBsyC,wBAAyB,EACzB7gB,iBAAiB,EACjBD,mBAAmB,EACnByzB,uBAAuB,EACvBrzB,oBAAoB,EACpBlwB,SAAU,KACVE,WAAY,MACZG,0BAA0B,GAE5BijB,OAAQ,CACNkgC,MAAO,CACLC,WAAW,EACXC,aAAct/D,EAAAA,GAEhBu/D,KAAM,CACJF,WAAW,EACXC,aAAcv/D,EAAAA,KAGlB+a,QAAS,GACT4I,iBAAkB,IAGpB6b,cAAe,GAEfigC,2BAA2B,EAE3Bv3B,gBAAiB,CACftU,SAAU,IAGZiV,qBAAsB,I,6FCrKxB,MAEM62B,GAAuBxc,EAAAA,EAAAA,KAAS,KAAM2O,EAAAA,EAAAA,IAAO8N,IAF3B,KAE0D,GAElF,IACIC,EADAC,GAAY,EA2ChB,SAASC,IACPD,GAAY,EACZD,GAA8BpN,EAAAA,EAAAA,IAAemN,GAAa,GAC1Dn+E,OAAOf,iBAAiB,OAAQk/E,IAChCtrD,EAAAA,EAAAA,IAAYqrD,GAGd,SAASK,IACPF,GAAY,GACZvrD,EAAAA,EAAAA,IAAeorD,GACfl+E,OAAO6f,oBAAoB,OAAQs+D,GAC/BC,GACFA,IAmHJ,SAASD,IACP,IAAKE,IAAav+D,EAAAA,EAAAA,MAChB,OAGF,MAAM7O,GAASwhB,EAAAA,EAAAA,MAEf,GAAIxhB,EAAOiqB,aACT,OAGF,MAAMsjD,EAA6B,IAC9BnC,MACA/gC,EAAAA,EAAAA,IAAKrqC,EAAQ,CACd,YACA,kBACA,iBACA,qBACA,gBACA,cACA,WACA,gBACA,eACA,OACA,4BACA,kBACA,yBAEFqsE,YAAa,CACXnhB,OAAQlrD,EAAOqsE,YAAYnhB,OAC3BohB,aAActsE,EAAOqsE,YAAYC,aACjCn7C,QAASnxB,EAAOqsE,YAAYl7C,SAE9BspB,gBAAiB+yB,EAAmBxtE,GACpCwkB,MAAOipD,EAAYztE,GACnB2kB,MAAO+oD,EAAY1tE,GACnB86B,SAAU6yC,EAAe3tE,GACzBwqC,aAAc,CACZojC,qBAAsB5tE,EAAOwqC,aAAaojC,sBAE5C/nD,SAAUgoD,EAAe7tE,GACzBuvC,YAAau+B,EAAkB9tE,GAC/BwrE,WAAYuC,EAAiB/tE,IAGzB0gD,EAAOl1B,KAAKG,UAAU4hD,GAC5BliD,aAAaK,QAAQ5jB,EAAAA,GAAwB44C,GAG/C,SAAS8sB,EAAmBxtE,GAC1B,OAAOjR,OAAOojB,WAAa9H,EAAAA,IACvBrK,EAAOy6C,gBAIb,SAASgzB,EAAYztE,GACnB,MAAQwkB,OAAO,KAAEC,EAAF,aAAQ0lB,EAAR,WAAsBZ,IAAiBvpC,EAChD60B,GAAW70B,EAAO2kB,MAAMyO,QAAQlB,QAAU,IAAIz9B,MAAM,EAAGsT,EAAAA,IAAoCtN,OAAOV,EAAAA,IAClGqkC,EAAU1tC,OAAOkoB,KAAK6L,GACtBupD,EAAYn5C,EAAQva,OAAO8jB,GAAS3pC,MAAM,EAAGuT,EAAAA,IAEnD,MAAO,CACLyc,MAAM4lB,EAAAA,EAAAA,IAAK5lB,EAAMupD,GACjB7jC,cAAcE,EAAAA,EAAAA,IAAKF,EAAc6jC,GACjCzkC,WAAYx6C,OAAOojB,WAAa9H,EAAAA,GAA2Ck/B,OAAahwC,GAI5F,SAASm0E,EAAY1tE,GACnB,MAAMiuE,GAAcjuE,EAAO2kB,MAAMyO,QAAQlB,QAAU,IAAIz9B,MAAM,EAAGsT,EAAAA,KACxD7P,OAAQqjD,IAAkBlY,EAAAA,EAAAA,IAAyBrjC,IAAW,GAChEguE,EAAYC,EAAW3zD,OAAOihC,EAAgB,CAACA,GAAiB,IAEtE,MAAO,IACFv7C,EAAO2kB,MACVF,MAAM4lB,EAAAA,EAAAA,IAAKrqC,EAAO2kB,MAAMF,KAAMupD,GAC9B56C,QAAS,CACPlB,OAAQ+7C,GAEVztC,cAAe,GACfnN,iBAAkB,CAChBnB,OAAQlyB,EAAO2kB,MAAM0O,iBAAiBnB,SAK5C,SAASy7C,EAAe3tE,GACtB,MAAMmhC,EAAgD,IAC9CjpC,OAAQqjD,IAAkBlY,EAAAA,EAAAA,IAAyBrjC,IAAW,GAwBtE,OAtBiBA,EAAO2kB,MAAMyO,QAAQlB,QAAU,IAAIz9B,MAAM,EAAGsT,EAAAA,IAC/BuS,OAAOihC,EAAgB,CAACA,GAAiB,IAEzDx/C,SAAS7D,IACrB,MAAMsL,EAAUxD,EAAO86B,SAASqG,SAASjpC,GACzC,IAAKsL,EACH,OAGF,MAAM0qE,EAAa1qE,EAAQ49B,YAAYjwC,EAAAA,IAClC+8E,GAAeA,EAAWnrC,cAI/B5B,EAASjpC,GAAU,CACjBusB,MAAM4lB,EAAAA,EAAAA,IAAK7mC,EAAQihB,KAAMypD,EAAWnrC,aACpC3B,YAAa,CACX,CAACjwC,EAAAA,IAAiB+8E,QAKjB,CACL/sC,SAAAA,EACAJ,aAAc,GACdqE,kBAAmB,IAIvB,SAASyoC,EAAe7tE,GACtB,MAAM,MAAE4nB,EAAF,OAAS8kB,GAAW1sC,EAAO6lB,SAEjC,MAAO,CACL+B,MAAAA,EACA8kB,OAAAA,EACApkB,QAAS,GACT4I,iBAAkB,IAItB,SAAS48C,EAAkB9tE,GACzB,MAAO,IACFA,EAAOuvC,YACVk8B,iBAAkB,GAItB,SAASsC,EAAiB/tE,GACxB,MAAO,IACFA,EAAOwrE,WACV/mD,KAAM,GACN0pD,uBAAmB50E,EACnB60E,4BAAwB70E,EACxB80E,2BAAuB90E,GArTrBsO,EAAAA,MAIJ4Z,EAAAA,EAAAA,IAAW,eAAe,KACpB2rD,GAIJC,QAGF5rD,EAAAA,EAAAA,IAAW,SAAS,KAClB4J,aAAag3C,WAAWv6D,EAAAA,IAEnBslE,GAILE,SC/CJ7rD,EAAAA,EAAAA,IAAW,QAAQ,KACjB,MAAMtT,GAAUkkD,EAAAA,EAAAA,IAAU+Y,GAC1B,ODiDK,SAAmBkD,GACxB,IAAIzmE,EAAAA,GAIJ,OAAIm6D,EAAAA,EAAAA,KAAiB,IACnBqL,IA0BJ,SAAmBiB,GACb3gF,EAAAA,IAEFC,QAAQ2gF,KAAK,2BAGf,MAAM7tB,EAAOr1B,aAAaC,QAAQxjB,EAAAA,IAC5BosD,EAASxT,EAAOl1B,KAAKC,MAAMi1B,QAAuBnnD,EAEpD5L,EAAAA,IAEFC,QAAQ4gF,QAAQ,2BAGdta,GAoBN,SAAsBA,EAAqBoa,GACzC,GAAI,wCAAyCpa,EAAOruC,SAAS+B,MAAO,CAClE,MAAM,oCACJ6mD,EADI,sCAEJC,EAFI,gCAGJC,EAHI,kCAIJC,EAJI,qBAKJC,EALI,mBAMJC,KACG7iB,GACDiI,EAAOruC,SAAS+B,MAEpBssC,EAAOruC,SAAS+B,MAAQ,IACnBqkC,EACHnU,6BAA8B22B,EAC9Bv2B,6BAA8Bu2B,EAC9B12B,+BAAgC22B,EAChCv2B,+BAAgCu2B,EAChC12B,yBAA0B22B,EAC1Bv2B,yBAA0Bu2B,EAC1B12B,2BAA4B22B,EAC5Bv2B,2BAA4Bu2B,EAC5B11B,kBAAmB21B,EACnB11B,gBAAiB21B,GAIrB5a,EAAOruC,SAAS+B,MAAQ,IACnB0mD,EAAazoD,SAAS+B,SACtBssC,EAAOruC,SAAS+B,OAGrBssC,EAAOruC,SAAS6mB,OAAS,IACpB4hC,EAAazoD,SAAS6mB,UACtBwnB,EAAOruC,SAAS6mB,QAGrBwnB,EAAO3kB,YAAc,IAChB++B,EAAa/+B,eACb2kB,EAAO3kB,aAGP2kB,EAAO7sB,SAASwkC,WACnB3X,EAAO7sB,SAASwkC,SAAWyC,EAAajnC,SAASwkC,UAG9C3X,EAAOze,kBACVye,EAAOze,gBAAkB,CACvBtU,SAAU,KAIT+yB,EAAO9d,uBACV8d,EAAO9d,qBAAuB,SAGE78C,IAA9B26D,EAAOmY,YAAYnhB,SACrBgJ,EAAOmY,YAAYnhB,OAAS1hD,EAAAA,SAGUjQ,IAApC26D,EAAOmY,YAAYC,eACrBpY,EAAOmY,YAAYC,aAAe7iE,EAAAA,IAG/ByqD,EAAOsX,aACVtX,EAAOsX,WAAa8C,EAAa9C,YAG9BtX,EAAO1vC,MAAM2lB,eAChB+pB,EAAO1vC,MAAM2lB,aAAe,IAGzB+pB,EAAOp5B,SAASsK,oBACnB8uB,EAAOp5B,SAASsK,kBAAoB,IA5FpC2pC,CAAa7a,EAAQoa,GAGvB,MAAMxkC,EAAW,IACZwkC,KACApa,GAGC8a,EAAqB/zB,EAAAA,QAA6D1hD,GAAnC+kE,EAAAA,EAAAA,GAAkBnvD,EAAAA,IAEvE,MAAO,IACF26B,EACHhP,SAAU,IACLgP,EAAShP,SACZiG,aAAciuC,EAAoB,CAACA,GAAqB,KArDnDC,CAAUX,SAEjBhB,IC3DK4B,CAAU/gE,IAAYA,K,wBCV/B,MAAMghE,EAAc,gBAGdC,EAAS77E,OAAO/D,KAAKC,MAAQmC,KAAK46D,UAIxC,IAAI79D,EAFJ08B,aAAaK,QAAQyjD,EAAaC,GAIlC,MAAMvQ,EAAW9vE,OAAOiwE,aAAY,KAC9BrwE,GAAY08B,aAAaC,QAAQ6jD,KAAiBC,IACpDzgF,IACAswE,cAAcJ,MAXD,K,qFCDjB,MAAMwQ,EAAa,CAAC,iBAAkB,kBAEvB,SAASC,IACtB,GAAI,UAAW14E,SACb,OAAO3H,QAAQo5B,IAAIgnD,EAAW90E,KAAKg1E,GAAS34E,SAAS44E,MAAMC,KAAKF,M,qDCsCpE,SAASG,IACP,MAAM,QAAEt8C,EAAF,KAAW3O,IAASjD,EAAAA,EAAAA,MAAYmD,MACtC,GAAKyO,EAAQlB,OAIb,OAAOjjC,QAAQo5B,IAAI+K,EAAQlB,OAAOz9B,MAAM,EARf,IAQsC8F,KAAKrC,IAClE,MAAM+B,EAAOwqB,EAAKvsB,GAClB,IAAK+B,EACH,OAGF,MAAM20B,GAAaF,EAAAA,EAAAA,IAAkBz0B,GACrC,OAAK20B,EAIE0tC,EAAAA,GAAkB1tC,EAAY39B,EAAAA,GAAAA,cAJrC,MAQJ,MAAM0+E,EAAe,CACnBC,KAAM,IAAM3gF,QAAQo5B,IAAI,EACtB7U,EAAAA,EAAAA,IAAWmlD,EAAAA,GAAAA,KAAc,QACtBtpE,KAAKigF,GACRI,MAEFjiD,gBAAiB,IAAMx+B,QAAQo5B,IAAI,CACjCinD,KACAvkB,EAAAA,EAAAA,IAAa8kB,KAEfC,SAAU,KAAM/kB,EAAAA,EAAAA,IAAaglB,GAC7BC,aAAc,KAAMjlB,EAAAA,EAAAA,IAAaglB,GACjCzlD,WAAYglD,GAoFd,GAAevvE,EAAAA,EAAAA,KACZC,IACC,MAAM+sB,GAAQR,EAAAA,EAAAA,IAAYvsB,IACpB,WAAEiwE,EAAF,gBAAcC,GAAoBlwE,EAAO6lB,SAAS6mB,OAAO3f,IAAU,GAEzE,MAAO,CACLW,4BAA6B1tB,EAAO0tB,4BACpCH,aAAcvtB,EAAOutB,aACrB4iD,oBAAqB/4E,QAAQ64E,GAC7BG,yBAA0Bh5E,QAAQ84E,GAClCG,oBAAoBz0B,EAAAA,EAAAA,IAAyB57C,GAC7CswE,gBAAiBtwE,EAAOswE,mBAX9B,EAjF4C,EAC1Cla,KAAAA,EACAthE,SAAAA,EACAq7E,oBAAAA,EACAC,yBAAAA,EACAC,mBAAAA,EACA3iD,4BAAAA,EACA4iD,gBAAAA,MAEA,MAAM,aAAEC,IAAiBr7E,EAAAA,EAAAA,OAElBs7E,EAASC,IAAaC,EAAAA,EAAAA,MAE3Bp8D,aAAcq8D,EADV,qBAC4BzrE,IAC9BC,EAAAA,EAAAA,IAAmBqrE,OAASj3E,GAAW,GAoC3C,OAlCA6L,EAAAA,EAAAA,KAAU,KACR,IAAIoJ,EAsBJ,OAZAvf,QAAQC,KAAK,EACXE,EAAAA,EAAAA,IApEoB,KA2DFJ,WAClB,UACQ2gF,EAAavZ,KACnB,MAAO7mE,MAOTqhF,KACCvhF,MAAK,KACNohF,IACAF,EAAa,CAAEhjD,aAAc,IAE7B/e,EAAUzf,OAAOgT,YAAW,KAC1BwuE,EAAa,CAAEhjD,aAAc,MA1EV,QA8EhB,KACD/e,IACFQ,aAAaR,GACbA,OAAUjV,GAGZg3E,EAAa,CAAEhjD,aAAc,OAG9B,IAGD,0BAAKz1B,GAAG,YACLhD,EACA67E,IAAqBjjD,GACpB,0BAAK74B,WAAWmB,EAAAA,EAAAA,GAAe,OAAQkP,IAC3B,SAATkxD,EACC,sCACE,0BACEvhE,UAAU,OAEVoN,MAAOquE,EAAmB,UAASA,WAAsB/2E,IAE3D,0BACE1E,WAAWmB,EAAAA,EAAAA,GACT,SACAm6E,GAAuB,kBACvBC,GAA4B,kBAC5BC,GAAsB,uBAGzBA,GAAsB,0BAAKx7E,UAAU,WAGxC,0BAAKA,UAAU,e,iCCpJ3B,UAAgBs0B,EAA8BrQ,KAC5C,MAAO+3D,EAAaC,IAAkBjvE,EAAAA,EAAAA,MAQtC,OANIsnB,GACFnW,EAAAA,GAC+BmW,EAAUrQ,GACtCzpB,KAAKyhF,GAGHD,GCVF,SAASE,KACd,IAAIC,EAAoB1uD,UAAU8G,SAMlC,OAJI4nD,GAA2C,UAAtBA,IACvBA,EAAoBA,EAAkB76C,OAAO,EAAG,IAG3C66C,E,4HCuBT,MAAMC,GAAuB,IAAMrmE,EAAAA,GA4InC,IAAejW,EAAAA,EAAAA,KAAKoL,EAAAA,EAAAA,KACjBC,IACC,MAAQqpB,aAAeiiD,WAAYpO,IAAoBl9D,EACvD,MAAO,CACLk9D,cAAAA,KAJcn9D,EAzIgC,EAClDjI,GAAAA,EACApE,MAAAA,EACAuN,UAAAA,EACAqB,SAAAA,EACA46D,cAAAA,MAEA,MAAM1kE,GAAOgK,EAAAA,EAAAA,KAEP0uE,GAAWxvE,EAAAA,EAAAA,IAAyB,OAEnCjH,EAAQ02E,IAAatvE,EAAAA,EAAAA,OACrBuvE,EAAcC,IAAmBxvE,EAAAA,EAAAA,IAA2B,IAE7DyvE,GAAeh8E,EAAAA,EAAAA,KAAai8E,IAChCJ,EAAUI,GACVF,EA6GJ,SAAyBhoD,EAA+B5uB,EAAS,IAC/D,IAAKA,EAAOrI,OACV,OAAOi3B,EAGT,MAAM+L,GAAcC,EAAAA,GAAAA,GAA4B56B,GAEhD,OAAO4uB,EAAY5uB,QAAQ0iE,GACzB/nC,EAAY+nC,EAAQqU,cAAiBrU,EAAQntE,MAAQolC,EAAY+nC,EAAQntE,QArHzDyhF,CAAgBvU,EAAeqU,MAC9C,CAACrU,KAEJnqD,EAAAA,GAAAA,IAAY,EAAE2+D,MACsB,KAA9BA,MAAAA,OAAA,EAAAA,EAAmBt/E,SAAgB8qE,EAAc9qE,OAAS,GAC5Dk/E,EAAa72E,KAEd,CAACyiE,EAAeoU,IAEnB,MAAM7uE,GAAenN,EAAAA,EAAAA,KAAa6nE,IAChC76D,EAAS66D,GAETp7D,YAAW,IAAMuvE,OAAa/3E,IAAY03E,MACzC,CAAC3uE,EAAUgvE,IAERK,GAAcr8E,EAAAA,EAAAA,KAAaC,IAC/B+7E,EAAa/7E,EAAEsK,cAAcnM,SAC5B,CAAC49E,IAEEM,GAAqBt8E,EAAAA,EAAAA,KAAaC,IACtC,GAAkB,IAAdA,EAAEkO,QACJ,OAGF,MAAMvN,EAASX,EAAEsK,cACbnM,QAAoB6F,IAAXkB,IACXvE,EAAOxC,MAAQ,IAGjB49E,EAAap7E,EAAOxC,SACnB,CAAC+G,EAAQ62E,EAAc59E,IAiD1B,OACE,mBAACm+E,GAAA,EAAD,CACEh9E,UAAU,mBACV8N,QAlD+D,EAAGmB,UAAAA,EAAWV,OAAAA,MAC/E,MAAM0uE,EAAgB,KACpB,GAAI1uE,EACF,OAGFrB,YAAW,KACTmvE,EAAS1tE,QAASuuE,WAzDH,IA4DjBjuE,IAEA,MAAMkuE,EAASp7E,SAASq7E,eAAe,0BACvCD,EAAOE,SAAS,CAAEC,IAAKH,EAAOI,aAAcC,SAAU,YAQlDC,EAAa73E,MAAAA,EAAAA,GAAW/G,MAAAA,OAAA,EAAAA,EAAO1D,QAAQ0D,MAAAA,OAAf,EAAeA,EAAO89E,cAAe,GAEnE,OACE,0BAAK38E,WAAWmB,EAAAA,EAAAA,GAAe,cAAetC,GAAS,YACrD,4BACE2M,IAAK6wE,EACLr8E,WAAWmB,EAAAA,EAAAA,GAAe,eAAgBoN,GAAU,SACpDlV,KAAK,OACL4J,GAAIA,EACJpE,MAAO4+E,EACPluE,aAAa,MACbhO,QAAS07E,EACTpxE,QAASoxE,EACTvtE,QAlBmBhP,IACvBo8E,EAAYp8E,GACZu8E,KAiBIxuE,UAAWsuE,IAEb,gCAAQp5E,EAAK,8BACZyI,EACC,mBAACsxE,GAAA,EAAD,CAAS5xE,MAAM,UAEf,wBAAGvK,QAAS07E,EAAej9E,WAAWmB,EAAAA,EAAAA,GAAe,gBAAiBoN,GAAU,aAWnFguE,EACE72E,KAAK4iE,GACJ,mBAACqV,GAAA,EAAD,CACE15D,IAAKqkD,EAAQC,KACbvoE,UAAWnB,GAASypE,EAAQC,OAAS1pE,EAAM0pE,KAAO,WAAa,GAC/DhnE,QAAS,IAAMqM,EAAa06D,IAE5B,2BAAMtoE,UAAU,iBAAgBuF,EAAAA,GAAAA,IAAWutD,EAAAA,GAAAA,IAAWwV,EAAQC,MAAO,CAAC,cACtE,2BAAMvoE,UAAU,gBAAgBsoE,EAAQntE,MAAQmtE,EAAQqU,aACxD,2BAAM38E,UAAU,gBAAgBsoE,EAAQI,iBAG5C6T,EAAah/E,QACb,mBAACogF,GAAA,EAAD,CACE15D,IAAI,aACJjkB,UAAU,aACVuM,UAAQ,GAER,+BAAO5I,EAAK,2BC9GtB,IAAIi6E,IAAqB,EAEzB,MAoNA,IAAe99E,EAAAA,EAAAA,KAAKoL,EAAAA,EAAAA,KACjBC,IACC,MACE6lB,UAAY+B,OAAO,SAAEwB,IACrBC,aAAeiiD,WAAYpO,IACzBl9D,EAEJ,MAAO,KACFqqC,EAAAA,EAAAA,IAAKrqC,EAAQ,CACd,kBACA,YACA,kBACA,gBACA,sBACA,YACA,iBACA,uBAEFopB,SAAAA,EACA8zC,cAAAA,KAnBcn9D,EApNoB,EACtCikB,gBAAAA,EACA+F,UAAAA,EACA0D,gBAAAA,EACA3K,cAAAA,EACAM,oBAAAA,EACAL,UAAAA,EACA+H,eAAAA,EACA7G,mBAAAA,EACAi5C,cAAAA,EACA9zC,SAAAA,MAEA,MAAM,mBACJspD,EADI,kBAEJC,EAFI,mBAGJC,EAHI,gBAIJC,EAJI,eAKJC,EALI,eAMJC,EANI,iBAOJxpD,IACEr0B,EAAAA,EAAAA,MAEEsD,GAAOgK,EAAAA,EAAAA,KAEP0uE,GAAWxvE,EAAAA,EAAAA,IAAyB,MACpCsvE,EAAoBD,KAEpBiC,EAAeC,GAAcjC,EAAmB,2BAC/C7T,EAAS+V,IAAcrxE,EAAAA,EAAAA,OACvBghB,EAAaswD,IAAkBtxE,EAAAA,EAAAA,OAC/BuxE,EAAWC,IAAgBxxE,EAAAA,EAAAA,KAAS,IACpCyxE,EAAeC,IAAoB1xE,EAAAA,EAAAA,OACnCZ,EAAWuyE,EAAeC,IAAmB/C,EAAAA,EAAAA,KAE9CgD,EAAavW,EAAW,IAAGA,EAAQI,eAAe16C,GAAe,KAAOA,EACxE8wD,EAAYD,GAAcA,EAAWr/E,QAAQ,UAAW,IAAIjC,QAvC1C,GAyCxBgT,EAAAA,EAAAA,KAAU,KACH8nB,EAAAA,IACHgkD,EAAS1tE,QAASK,UAEnB,CAACs5D,KAEJ/3D,EAAAA,EAAAA,KAAU,KACgB,yBAApB4e,GAA+CC,GACjD2uD,MAED,CAAC5uD,EAAiBC,EAAoB2uD,KAEzCxtE,EAAAA,EAAAA,KAAU,KACgB,yBAApB4e,GACF6uD,EAAgB,CAAE1pD,SAAUC,MAE7B,CAACpF,EAAiBoF,EAAUypD,KAE/BztE,EAAAA,EAAAA,KAAU,KACJ6e,GAAsBi5C,IAAkBC,IAAYiW,GACtDF,GAAWjW,EAAAA,EAAAA,IAAqBC,EAAej5C,GAAoB,MAEpE,CAACk5C,EAASl5C,EAAoBmvD,EAAWlW,IAE5C,MAAM0W,GAAkBt+E,EAAAA,EAAAA,KAAau+E,IAC9BA,EAAczhF,QACjB+gF,EAAe,IAGjB,MAAMW,EAAmB5W,IAAiBG,EAAAA,EAAAA,IAA0BH,EAAe2W,GAG7EE,GAAmB5W,GACrB2W,GAAoBA,EAAiB1W,OAASD,EAAQC,OACrD0W,GAAoBD,EAAczhF,OACnC0hF,EACA3W,IAECA,IAAY4W,GAAoBA,GAAmBA,EAAgB3W,OAASD,EAAQC,OACvF8V,EAAWa,GAEbZ,GAAexV,EAAAA,EAAAA,IAAkBkW,EAAeE,MAC/C,CAAC7W,EAAeC,IAEb6W,GAAmB1+E,EAAAA,EAAAA,KAAY,KACnCk+E,KAEK5pD,EAAAA,EAAAA,IAAYonD,GAAmB,KAClCyC,IAEAlqD,EAAiB,CAAEH,SAAU4nD,SAE9B,CAACwC,EAAejqD,EAAkBynD,EAAmByC,KAExDruE,EAAAA,EAAAA,KAAU,UACY7L,IAAhBspB,GAA6B4K,GAC/BmmD,EAAgBnmD,KAEjB,CAACA,EAAiB5K,EAAa+wD,KAElCv0D,EAAAA,EAAAA,KAAgB,KACV6xD,EAAS1tE,SAAW8vE,GACtBpC,EAAS1tE,QAAQywE,qBAAqBX,KAEvC,CAACA,IAEJ,MAAMY,GAAkBxyE,EAAAA,EAAAA,KAAO,GACzByyE,GAAc7+E,EAAAA,EAAAA,KAAY,KAC9B4+E,EAAgB1wE,SAAU,EAC1B0D,uBAAsB,KACpBgtE,EAAgB1wE,SAAU,OAE3B,IAEG4wE,GAAsB9+E,EAAAA,EAAAA,KAAa5B,IACvCw/E,EAAWx/E,GACXy/E,EAAe,MACd,IAEGkB,GAA0B/+E,EAAAA,EAAAA,KAAaC,IACvCwtB,GACF+vD,IAIGL,KACHA,IAAqB,EACrBnD,KACKvkB,EAAAA,EAAAA,IAAaglB,IAGpB,MAAM,MAAEr8E,EAAF,eAAS4gF,EAAT,aAAyBC,GAAiBh/E,EAAEW,OAClDq9E,EACEe,GAAkBC,GAAgBA,EAAe7gF,EAAMtB,OACnD,CAACkiF,EAAgBC,QACjBh7E,GAGN85E,GAAa,GAEb,MAAMmB,EACJlnD,EAAAA,IAAa6vC,QAA0B5jE,IAAfm6E,GACrBhgF,EAAMtB,OAASshF,EAAWthF,OAAS,IAAM8hF,EAAgB1wE,QAE9DowE,EAAgBY,EAA+B,GAAErX,EAASI,eAAe7pE,IAAUA,KAClF,CAACqvB,EAAW+vD,EAAgB3V,EAASuW,EAAYE,IAE9Ca,GAA0Bn/E,EAAAA,EAAAA,KAAaC,IAC3Co9E,EAAkBp9E,EAAEW,OAAOkM,WAC1B,CAACuwE,IAcE+B,EAA4B,sCAAd3qD,EAEpB,OACE,0BAAKjyB,GAAG,yBAAyBjD,UAAU,iBACzC,0BAAKA,UAAU,aACb,0BAAKiD,GAAG,SACR,yCACA,wBAAGjD,UAAU,QAAQ2D,EAAK,cAC1B,2BAAMM,OAAO,GAAG67E,SApBtB,SAAsBjyE,GACpBA,EAAM5M,iBAEFgtB,GAIA6wD,GACFjB,EAAmB,CAAE7vD,YAAa6wD,MAa9B,mBAAC,GAAD,CACE57E,GAAG,qBACHpE,MAAOypE,EACPl8D,WAAYgjB,IAAuBk5C,EACnC76D,SAAU8xE,IAEZ,mBAACQ,GAAA,EAAD,CACEv0E,IAAK6wE,EACLp5E,GAAG,uBACHoK,MAAO1J,EAAK,0BACZ9E,MAAOggF,EACPnlF,MAAOw0B,GAAavqB,EAAKuqB,GACzB1e,UAAU,MACV/B,SAAU+xE,EACV3vE,QAAS4oB,EAAAA,GAAY6mD,OAAc56E,IAErC,mBAACs7E,GAAA,EAAD,CACE/8E,GAAG,uBACHoK,MAAM,oBACNE,QAAShL,QAAQ0zB,GACjBxoB,SAAUmyE,IAEXd,IACCe,EACE,mBAACI,GAAA,EAAD,CAAQ5mF,KAAK,SAASmT,QAAM,EAACJ,UAAW6hB,GAAgBtqB,EAAK,eAE7D,mBAACu8E,GAAA,EAAD,OAGHL,GACC,mBAACI,GAAA,EAAD,CAAQ9zE,QAAM,EAACK,QAAM,EAACJ,UAAWmiB,EAAqBhtB,QAAS28E,GAC5Dv6E,EAAK,mBAGTw4E,GAAqBA,IAAsB5nD,GAAY4pD,GACtD,mBAAC8B,GAAA,EAAD,CAAQ9zE,QAAM,EAACC,UAAWA,EAAW7K,QAAS49E,GAAmBhB,U,eCnP7E,MAMA,IAAer+E,EAAAA,EAAAA,KANW,KACxB,MAAMqgF,GAAWC,EAAAA,GAAAA,GAAgBtc,EAAAA,GAAAA,KAAc,YAE/C,OAAOqc,EAAW,mBAACA,EAAD,MAAe,mBAACD,GAAA,EAAD,SCGnC,IAAepgF,EAAAA,EAAAA,KANe,KAC5B,MAAMugF,GAAeD,EAAAA,GAAAA,GAAgBtc,EAAAA,GAAAA,KAAc,gBAEnD,OAAOuc,EAAe,mBAACA,EAAD,MAAmB,mBAACH,GAAA,EAAD,SCG3C,IAAepgF,EAAAA,EAAAA,KANe,KAC5B,MAAMwgF,GAAeF,EAAAA,GAAAA,GAAgBtc,EAAAA,GAAAA,KAAc,gBAEnD,OAAOwc,EAAe,mBAACA,EAAD,MAAmB,mBAACJ,GAAA,EAAD,SCP9B,IAAIK,GAAE,KAAK,MAAMC,IAAGA,GAAE95D,OAAO,SAAS1oB,EAAEyiF,GAAGF,GAAEviF,EAAEyiF,IAAI51B,KAAK61B,UAAUF,GAC/E,SAAUxiF,GAAG,SAASyiF,EAAEviF,EAAE+0D,EAAE3jB,EAAE5uC,GAAG,IAAI6uC,EAAE,GAAGoxC,EAAE3iF,EAAEsxC,EAAE2jB,GAAG0tB,EAAE7M,EAAE51E,GAAGyiF,EAAEC,IAAIlgF,EAAEA,GAAG,EAAE,IAAI8uE,EAAEmR,EAAEA,IAAI9hE,EAAE8hE,EAAEA,IAAI,EAAEjgF,EAA4G,OAA1G6uC,EAAExvC,KAAK7B,EAAEqxC,EAAEsxC,MAAM5tB,EAAE1jB,EAAEmiC,QAAQpiC,EAAEC,EAAEuxC,EAAEjiE,EAAE0wB,EAAED,EAAE,SAASC,EAAED,GAAa,OAALA,GAAG5uC,IAAS,GAAjB6uC,GAAG7uC,IAAmB6uC,GAAGigC,GAAG,EAAElgC,GAAGA,GAAGkgC,IAAKmR,EAAErxC,EAAEC,EAAED,IAAWC,EAAE,SAASwxC,EAAE7iF,EAAE+0D,EAAE3jB,EAAE5uC,EAAE6uC,EAAEoxC,EAAEnR,EAAE3wD,EAAE4wD,EAAEx9D,GAAG,SAAS6hE,EAAEvkC,EAAED,EAAEib,EAAE0I,EAAEp0C,EAAE2wD,EAAEC,GAAGlgC,GAAGrxC,EAAE8iF,OAAO1xC,EAAEkgC,EAAEjlB,EAAEklB,GAAGvxE,EAAE+iF,MAAM3xC,EAAEib,EAAE0I,EAAEp0C,EAAE8hE,IAAIziF,EAAE8iF,OAAO1xC,EAAEib,GAAGilB,EAAEtxE,EAAEgjF,OAAOjuB,EAAE0tB,EAAErxC,GAAGpxC,EAAEgjF,OAAOjuB,EAAE3jB,GAAGwkC,EAAEj1D,EAAEne,EAAE4uC,EAAE5uC,EAAE6uC,GAAGoxC,EAAE,GAAG7M,EAAErE,EAAE/uE,EAAE6uC,EAAE0jB,EAAE1jB,EAAE,GAAGoxC,GAAG7M,EAAE7hE,EAAEghD,EAAE1jB,EAAE0jB,EAAE3jB,EAAEqxC,EAAE,GAAG7M,EAAEtE,EAAEvc,EAAE3jB,EAAE5uC,EAAE4uC,EAAE,EAAEqxC,GAAG,SAASQ,EAAEjjF,EAAE+0D,EAAE3jB,EAAE5uC,EAAE6uC,EAAEoxC,EAAEnR,EAAE3wD,EAAE4wD,EAAEx9D,GAAG,SAAS6hE,EAAEvkC,EAAED,EAAE2jB,EAAEp0C,GAAG3gB,EAAEgjF,OAAO3xC,EAAE0jB,EAAE3jB,GAAGpxC,EAAE8iF,OAAOzxC,EACtfD,GAAGpxC,EAAE8iF,OAAOzxC,EAAED,EAAEzwB,GAAG3gB,EAAE+iF,MAAM1xC,EAAED,EAAEC,EAAE0jB,EAAE3jB,EAAEqxC,GAAGnR,GAAGsE,EAAE7gB,EAAE3jB,EAAEqxC,EAAEA,GAAG9hE,GAAGi1D,EAAEpzE,EAAE4uC,GAAGqxC,EAAEA,GAAGlR,GAAGqE,EAAEpzE,EAAE6uC,GAAGoxC,GAAGA,GAAG1uE,GAAG6hE,EAAE7gB,EAAE1jB,EAAEoxC,GAAGA,GAAmX,SAASxuE,EAAEjU,EAAE+0D,GAAG3jB,EAAE,CAAC,IAAIA,EAAE2jB,EAAElzD,KAAKW,EACpfuyD,EAAEmuB,EAAE7xC,EAAE0jB,EAAEouB,EAAEV,EAAE1tB,EAAEquB,EAAE9R,EAAEvc,EAAEsuB,EAAqB,IAAnBhyC,EAAExyC,KAAK+oB,IAAI,EAAEypB,GAAG,GAAOoxC,EAAE5jF,KAAKy0C,IAAI,GAAGmvC,GAAG,IAAIpxC,GAAGoxC,EAAEpxC,GAAG,EAAE,IAAI,IAAI1wB,EAAE4hE,EAAEnxC,EAAE5uC,EAAE6uC,EAAEigC,GAAG,MAAMlgC,EAAE,MAAMsxC,IAAI/hE,OAAE,EAAO,IAAIA,EAAE,OAAO,KAAyI,IAApIywB,EAAEpxC,EAAEw2D,WAAW,MAAMzB,EAAEmoB,aAAa9rC,EAAEkyC,UAAUvuB,EAAEmoB,WAAW9rC,EAAEmyC,SAASxuB,EAAEyuB,KAAKzuB,EAAEqqB,IAAIrqB,EAAE7pD,KAAK6pD,EAAE7pD,OAAO1I,EAAEme,EAAEiiE,EAAEH,EAAE1tB,EAAE7pD,KAAK1I,EAAE4uC,EAAEqyC,YAAgBnS,EAAE,EAAEA,EAAE9uE,EAAE8uE,GAAG,EAAE,IAAIjgC,EAAE,EAAEA,EAAE7uC,EAAE6uC,GAAG,EAAE,CAAC,IAAIkgC,EAAEngC,EAAEr9B,EAAEghD,EAAEyuB,KAAKnyC,EAAEoxC,EAAE7M,EAAE7gB,EAAEqqB,IAAI9N,EAAEmR,EAAEp/D,EAAEiuD,EAAEoS,EAAEryC,EAAEgb,EAAE1rC,EAAEywB,EAAExyC,EAAEmV,EAAE0uE,EAAE5N,EAAEe,EAAE6M,EAAEkB,EAAEtgE,EAAE,EAAEugE,EAAEvgE,EAAE,EAAE/jB,EAAEokF,EAAE,EAAEllE,EAAEklE,EAAE,EAAEzvE,EAAEpV,KAAKC,MAAMD,KAAKy0C,IAAI,GAAGz0C,KAAK+oB,IAAI,EAAEmtC,EAAE8uB,IAAIpB,GAAGS,EAAE72B,EAAEhpC,EAAEqgE,GAAGI,EAAEz3B,EAAEs3B,EAAErkF,GAAGQ,EAAEusD,EAAEs3B,EAAED,GAAGC,EAAEt3B,EAAEs3B,EAAEnlE,GAAG,IAAIulE,EAAE13B,EAAEhpC,EAAE7E,GAAGA,EAAE6tC,EAAEu3B,EAAEplE,GAAGklE,EAAEr3B,EAAEu3B,EACnfF,GAAGE,EAAEv3B,EAAEu3B,EAAEtkF,GAAG+jB,EAAEgpC,EAAEhpC,EAAE/jB,GAAGyU,EAAElV,KAAKiP,MAAMiG,GAAG6hE,EAAE/2E,KAAKiP,MAAM8nE,GAAGh3E,EAAEC,KAAKiP,MAAMlP,GAAGi2E,EAAEh2E,KAAKiP,MAAM+mE,GAAGqO,EAAEL,EAAEtR,EAAEx9D,EAAE6hE,EAAEh3E,EAAEi2E,EAAE5gE,GAAGnU,IAAIujB,GAAGvjB,IAAIikF,GAAGL,IAAIK,GAAGL,IAAIrgE,GAAG4/D,EAAE1R,EAAEx9D,EAAE6hE,EAAEh3E,EAAEi2E,EAAE5gE,EAAEnU,GAAGujB,GAAGygE,EAAEhkF,GAAGikF,GAAGJ,EAAED,GAAGK,GAAGvlE,EAAEklE,GAAGrgE,GAAGugE,GAAmB,OAF7F,SAAW5jF,EAAE+0D,GAAG,IAAI3jB,EAAE2jB,EAAEivB,KAAK,GAAG,iBAAkB5yC,EAAEpxC,EAAEsjF,UAAUlyC,MAAM,CAAC,IAAI5uC,EAAE4uC,EAAEj2C,KAAKk2C,EAAED,EAAE6yC,WAAuD,GAA5C7yC,EAAEA,EAAEz9B,SAASnM,KAAK6pC,GAAIxyC,KAAKiP,MAAMujC,EAAE0jB,EAAE7pD,QAAU,oBAAoB1I,EAAE,IAAIigF,EAAEziF,EAAEkkF,qBAAqBC,MAAMnkF,EAAEoxC,OAAQ,IAAG,oBAAoB5uC,EAA2C,MAAMjG,MAAM,oBAArDkmF,EAAEziF,EAAEokF,qBAAqBD,MAAMnkF,EAAEoxC,GAAwCC,EAAEroC,SAAQ,EAAEqoC,EAAED,MAAMqxC,EAAE4B,aAAahzC,EAAED,MAAKpxC,EAAEsjF,UAAUb,GAEhS6B,CAAElzC,EAAE2jB,GAAG3jB,EAAE4yC,OAAchkF,EAAE,IAAIkjF,EAAE,CAACqB,WAAW,EAAEC,WAAW,GAAGC,QAAQ,IAAIjB,KAAK,EAAEpE,IAAI,EAAEl0E,KAAK,IAAI84E,KAAK,OAAO9G,WAAW,KAAKr7E,KAAK,UAAU6iF,OAAO,GAAGC,MAAM,GAAGtC,GAAE,SAASriF,EAAE+0D,GAAG,IAAI3jB,EAAE,GAAGzzC,OAAOC,OAAOwzC,EAAE8xC,EAAEljF,GAAGoxC,EAAE+xC,EAAE/xC,EAAEmzC,WAAWnzC,EAAEgyC,EAAEhyC,EAAEozC,WAAWpzC,EAAE8xC,EAAE9xC,EAAEqzC,QAAQrzC,EAAEoyC,KAAKpyC,EAAEoyC,KAAKpyC,EAAEguC,IAAIhuC,EAAEguC,IAAIhuC,EAAElmC,KAAKkmC,EAAElmC,KAAKkmC,EAAE4yC,KAAK5yC,EAAE4yC,KAAK5yC,EAAE8rC,WAAW9rC,EAAE8rC,WAC/e9rC,EAAEvvC,KAAKuvC,EAAEvvC,KAAKuvC,EAAEyyC,EAAEzyC,EAAEszC,OAAOtzC,EAAEiyC,EAAEjyC,EAAEuzC,MAAS5vB,aAAa6vB,mBAAsB7vB,EAAEvsB,QAAQ4I,EAAElmC,MAAM6pD,EAAEtsB,SAAS2I,EAAElmC,OAAK6pD,EAAEvsB,MAAM4I,EAAElmC,KAAK6pD,EAAEtsB,OAAO2I,EAAElmC,MAAK6pD,EAAEyB,WAAW,MAAMquB,UAAU,EAAE,EAAE9vB,EAAEvsB,MAAMusB,EAAEtsB,QAAQx0B,EAAE8gD,EAAE3jB,MAAQpxC,EAAE6D,SAAS6F,cAAc,WAAY8+B,MAAM4I,EAAElmC,KAAKlL,EAAEyoC,OAAO2I,EAAElmC,KAAKkmC,EAAEn9B,EAAEjU,EAAEoxC,GAAG2jB,EAAE3vC,YAAYgsB,KAJxS,CAI8S,WACjE,SAASyxC,EAAE9tB,EAAE3jB,GAAG,SAAS5uC,EAAE6uC,EAAEoxC,GAAG,IAAI,IAAIrxC,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,MAAM,GAAGC,EAAED,GAAGzwB,GAAG0wB,EAAED,GAAG,IAAI,IAAI2jB,GAAG,EAAE,GAAGA,EAAEA,GAAG,GAAG,GAAG0tB,EAAE1tB,GAAGp0C,GAAG8hE,EAAE1tB,IAAIuc,EAAEjgC,EAAED,GAAGqxC,EAAE1tB,GAAG,GAAG3jB,GAAG,GAAGA,IAAI,GAAG2jB,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,IAAI,GAAG3jB,GAAG,GAAGA,IAAI,GAAGA,GAAG,GAAGA,GAAG,GAAG2jB,GAAG,GAAGA,GAAS,SAAS1jB,EAAEA,EAAED,GAAG,IAAI,IAAIib,EAAE1rC,EAAE,EAAEo0C,EAAE,GAAGn2D,EAAEkK,MAAMujD,GAAGwoB,EAAE,EAAEA,EACnfxoB,EAAEwoB,GAAG,EAAE,CAACj2E,EAAEi2E,GAAG/rE,MAAMujD,GAAG,IAAI,IAAIhpC,EAAE,EAAEA,EAAEgpC,EAAEhpC,GAAG,EAAEzkB,EAAEi2E,GAAGxxD,GAAG,KAA2C,IAAtCiuD,EAAE1yE,EAAE4D,EAAE,EAAE,GAAGA,EAAEme,EAAE,EAAE,GAAGne,EAAE,EAAEme,EAAE,GAAG0rC,EAAEp4C,EAAEouE,EAAEttB,GAAOn2D,EAAE,EAAEA,EAAEytD,EAAEhtD,OAAOT,GAAG,EAAE,IAAIi2E,EAAE,EAAEA,EAAExoB,EAAEhtD,OAAOw1E,GAAG,EAAE,CAACxxD,EAAEgpC,EAAEztD,GAAG,IAAI8kF,EAAEr3B,EAAEwoB,GAAG,GAAG,MAAMvD,EAAEjuD,GAAGqgE,GAAG,IAAI,IAAIpkF,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,IAAI,IAAIkf,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE8yD,EAAEjuD,EAAE/jB,GAAGokF,EAAEllE,IAAI,GAAGlf,GAAG,GAAGA,IAAI,GAAGkf,GAAG,GAAGA,GAAG,GAAGlf,GAAG,GAAGkf,EAAE,IAAI6tC,EAAE,EAAEA,EAAE1rC,EAAE,EAAE0rC,GAAG,EAAE,MAAMilB,EAAEjlB,GAAG,KAAKilB,EAAEjlB,GAAG,GAAG,GAAGA,EAAE,GAAG,IAAIA,EAAE,EAAEA,EAAE1rC,EAAE,EAAE0rC,GAAG,EAAE,MAAMilB,EAAE,GAAGjlB,KAAKilB,EAAE,GAAGjlB,GAAG,GAAGA,EAAE,GAAiB,IAAdA,EAAEp4C,EAAEnU,EAAE2iF,GAAG,EAAErxC,GAAOxyC,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEi2E,GAAGxjC,GAAG,IAAIgb,GAAGztD,EAAE,GAAG0yE,EAAE,EAAE1yE,EAAEA,EAAE,EAAEA,EAAEA,EAAE,EAAE+hB,EAAE,GAAG/hB,GAAG,GAAGi2E,EAAEvD,EAAE,GAAG,EAAE1yE,EAAE+hB,EAAE/hB,EAAE,EAAE,EAAEA,EAAE,GAAGA,EAAE,GAAGA,GAAGi2E,EAAe,GAAbvD,EAAE3wD,EAAE,GAAG,IAAI0wB,EAAK,GACtf0jB,EAAE,CAAU,IAAT1I,EAAEp4C,EAAEqwE,EAAEvvB,GAAOn2D,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEi2E,GAAGxjC,GAAG,IAAIgb,GAAGztD,EAAE,GAAG0yE,EAAEzyE,KAAKC,MAAMF,EAAE,IAAIA,EAAE,EAAE+hB,EAAE,EAAE,GAAGk0D,EAAE,IAAIj2E,EAAE,EAAE,GAAGA,EAAEA,GAAG,EAAEi2E,GAAGxjC,GAAG,IAAIgb,GAAGztD,EAAE,GAAG0yE,EAAE1yE,EAAE,EAAE+hB,EAAE,EAAE,GAAG9hB,KAAKC,MAAMF,EAAE,IAAIi2E,EAAE,GAAG,MAAMtD,EAAE,CAAkB,IAAjBlgC,EAAErxC,EAAE8jF,EAAE/uB,EAAE0tB,GAAGp2B,EAHmS,WAAa,IAAI0I,EAAE,GAAG3jB,EAAE,EAAE5uC,EAAE,CAAC+/E,EAAE,WAAW,OAAOxtB,GAC/fA,EAAE,SAAS1jB,GAAG,OAAO,IAAI0jB,EAAEl2D,KAAKC,MAAMuyC,EAAE,MAAM,EAAEA,EAAE,EAAE,IAAI0c,IAAI,SAAS1c,EAAEoxC,GAAG,IAAI,IAAIrxC,EAAE,EAAEA,EAAEqxC,EAAErxC,GAAG,EAAE5uC,EAAEqyE,EAAE,IAAIxjC,IAAIoxC,EAAErxC,EAAE,EAAE,KAAKib,EAAE,WAAW,OAAOjb,GAAGyjC,EAAE,SAASxjC,GAAG,IAAIoxC,EAAE5jF,KAAKC,MAAMsyC,EAAE,GAAG2jB,EAAE11D,QAAQojF,GAAG1tB,EAAE10D,KAAK,GAAGgxC,IAAI0jB,EAAE0tB,IAAI,MAAMrxC,EAAE,GAAGA,GAAG,IAAI,OAAO5uC,EAE9D+/E,GAAQ3jF,EAAE,EAAEA,EAAEmV,EAAE1U,OAAOT,GAAG,EAAEi2E,EAAE9gE,EAAEnV,GAAGytD,EAAE0B,IAAI,EAAE,GAAG1B,EAAE0B,IAAI8mB,EAAExjC,IAAIp9B,EAAEo4C,EAAE,EAAE0I,IAAI8f,EAAEiQ,MAAMz4B,GAAG,IAAIztD,EAAEi2E,EAAE,EAAEj2E,EAAEyyC,EAAEhyC,OAAOT,GAAG,EAAEi2E,GAAGxjC,EAAEzyC,GAAGe,EAAE,GAAG0sD,EAAEA,IAAI,EAAEwoB,EAAE,MAAMt4E,MAAM,0BAA0B8vD,EAAEA,IAAI,IAAI,EAAEwoB,EAAE,KAAK,IAAIxoB,EAAEA,IAAI,GAAG,EAAEwoB,GAAGxoB,EAAE0B,IAAI,EAAE,GAAG,GAAG1B,EAAEA,IAAI,GAAGA,EAAEwoB,GAAE,GAAI,OAAOxoB,EAAEA,KAAK,EAAEwoB,IAAKxoB,EAAE0B,IAAI,IAAI,GAAM1B,EAAEA,KAAK,EAAEwoB,KAAQxoB,EAAE0B,IAAI,GAAG,GAAG,IAAI6nB,EAAE,EAC7c,IAD+cf,EAAEj2E,EAAE,EAAEykB,EAAEva,MAAMuoC,EAAEhyC,QACjfqkF,EAAE56E,MAAMuoC,EAAEhyC,QAAYC,EAAE,EAAEA,EAAE+xC,EAAEhyC,OAAOC,GAAG,EAAE,CAAC,IAAI4jF,EAAE7xC,EAAE/xC,GAAGK,EAAEG,EAAEuxC,EAAE/xC,GAAGi2E,EAAE2N,EAAgD,IAA9CtkF,EAAEC,KAAK+oB,IAAIhpB,EAAEskF,GAAGrO,EAAEh2E,KAAK+oB,IAAIitD,EAAE/0E,GAAGujB,EAAE/jB,GAAGwJ,MAAMo6E,GAAO1kE,EAAE,EAAEA,EAAE6E,EAAE/jB,GAAGD,OAAOmf,GAAG,EAAE6E,EAAE/jB,GAAGkf,GAAG,IAAI6tC,EAAEk2B,IAAI/jE,EAAEo3D,GAA4D,IAAzDA,GAAGsN,EAAE1kE,EAAEvK,EAAE4uE,EAAE/iF,GAAGojF,EAAED,EAAE5/D,EAAE/jB,GAAGkf,EAAE6yB,IAAI,GAAG7yB,EAAEA,GAAGklE,EAAEpkF,GAAGwJ,MAAM0V,EAAE6yB,IAAI,GAAO7yB,EAAE,EAAEA,EAAEklE,EAAEpkF,GAAGD,OAAOmf,GAAG,EAAE1e,EAAE0e,EAAE0kE,EAAE7xC,IAAIqyC,EAAEpkF,GAAGD,OAAOqkF,EAAEpkF,GAAGkf,GAAG,GAAG1e,EAAEojF,EAAEnuB,EAAEj1D,GAAG,EAAE,IAAI0e,EAAE6tC,EAAE,EAAE7tC,EAAE6yB,EAAEhyC,OAAOmf,GAAG,EAAE6tC,GAAGhb,EAAE7yB,GAAG+2D,EAAa,IAAXlpB,EAAEvjD,MAAMujD,GAAO7tC,EAAEo3D,EAAE,EAAEp3D,EAAE5f,EAAE4f,GAAG,EAAE,IAAIlf,EAAE,EAAEA,EAAE+xC,EAAEhyC,OAAOC,GAAG,EAAEkf,EAAE6E,EAAE/jB,GAAGD,SAASgtD,EAAEupB,GAAGvyD,EAAE/jB,GAAGkf,GAAGo3D,GAAG,GAAG,IAAIp3D,EAAE,EAAEA,EAAEq2D,EAAEr2D,GAAG,EAAE,IAAIlf,EAAE,EAAEA,EAAE+xC,EAAEhyC,OAAOC,GAAG,EAAEkf,EAAEklE,EAAEpkF,GAAGD,SAASgtD,EAAEupB,GAAG8N,EAAEpkF,GAAGkf,GAAGo3D,GAAG,GAAGrE,EAAEllB,EACpd,IADsdhb,EAAEkgC,EAAEllB,GACnf,EAAEztD,EAAE+hB,EAAE,EAAEk0D,EAAE,EAAExxD,EAAE,EAAE+tB,EAAEn9B,EAAE8vE,EAAE3yC,GAAOsyC,EAAE/iE,EAAE,EAAE,EAAE+iE,EAAEA,GAAG,EAAE,IAAI,GAAGA,KAAKA,IAAI,CAAC,IAAIpkF,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,MAAMgyE,EAAE1yE,GAAG8kF,EAAEpkF,KAAKkf,GAAE,EAAG6E,EAAEguB,EAAEhyC,SAASmf,EAAE,IAAI6yB,EAAEhuB,KAAKwxD,EAAE,IAAIzjC,EAAExyC,EAAE8kF,EAAEpkF,KAAKkf,GAAGA,GAAG8yD,EAAE1yE,GAAG8kF,EAAEpkF,GAAGkf,GAAO,KAAHq2D,IAAUxxD,GAAG,EAAEwxD,EAAE,IAAS,GAAG,GAARj2E,GAAGytD,IAAU1rC,GAAG/hB,EAAE,CAACA,GAAGytD,EAAEA,GAAGA,EAAE,QAAQ,IAAIo2B,EAAE6B,EAAElzC,GAAGkgC,EAAE,KAAK3wD,EAAE,EAAE4wD,EAAE,KAAKx9D,EAAE,GAAG6hE,EAAE,CAACA,EAAE,SAASvkC,GAAGA,EALuC,SAAW0jB,GAAG,IAAI3jB,EAAEyxC,EAAEphF,EAAEszD,GAAG,MAAM,CAACgwB,EAAE,WAAW,OAAO,GAAG1zC,EAAE,WAAW,OAAOD,EAAE/xC,QAAQylF,MAAM,SAAS/vB,GAAG,IAAI,IAAI1jB,EAAE,EAAEA,EAAED,EAAE/xC,OAAOgyC,GAAG,EAAE0jB,EAAEhH,IAAI3c,EAAEC,GAAG,KAKrLvxC,CAAEuxC,GAAGt9B,EAAE1T,KAAKgxC,GAAGkgC,EAAE,MAAMngC,EAAE,SAASC,EAAED,GAAG,GAAG,EAAEC,GAAG1wB,GAAG0wB,GAAG,EAAED,GAAGzwB,GAAGywB,EAAE,MAAM70C,MAAM80C,EAAE,IAAID,GAAG,OAAOkgC,EAAEjgC,GAAGD,IAAIqxC,EAAE,WAAW,OAAO9hE,GAAG+hE,EAAE,WAAW,IAAI,IAAItxC,EAAE,EAAEqxC,EAAE,EAAE1tB,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAE,CAAC1jB,GAAE,EAAG0jB,GAAG,IAAIp0C,EAAE1M,EAAE0vE,EAAE/N,IAAM,GAAG7gB,GAAG3jB,EAAEzwB,KAAEywB,EAAEzwB,EAAE8hE,EAAE1tB,GAAE1jB,GAAE,EAAGoxC,KAAK,OAAO7M,EACrf,SAASqN,EAAEluB,EAAE3jB,GAAG,QAAG,IAAoB2jB,EAAE11D,OAAO,MAAM9C,MAAMw4D,EAAE11D,OAAO,IAAI+xC,GAAG,IAAI5uC,EAAE,WAAW,IAAI,IAAI6uC,EAAE,EAAEA,EAAE0jB,EAAE11D,QAAQ,GAAG01D,EAAE1jB,IAAIA,GAAG,EAAE,IAAI,IAAIigC,EAAExoE,MAAMisD,EAAE11D,OAAOgyC,EAAED,GAAGzwB,EAAE,EAAEA,EAAEo0C,EAAE11D,OAAOgyC,EAAE1wB,GAAG,EAAE2wD,EAAE3wD,GAAGo0C,EAAEp0C,EAAE0wB,GAAG,OAAOigC,EAAxH,GAA6HjgC,EAAE,CAAC0jB,EAAE,SAAS1jB,GAAG,OAAO7uC,EAAE6uC,IAAIA,EAAE,WAAW,OAAO7uC,EAAEnD,QAAQ2lF,SAAS,SAAS5zC,GAAG,IAAI,IAAIqxC,EAAE35E,MAAMuoC,EAAEA,IAAID,EAAEC,IAAI,GAAG0jB,EAAE,EAAEA,EAAE1jB,EAAEA,IAAI0jB,GAAG,EAAE,IAAI,IAAIwc,EAAE,EAAEA,EAAEngC,EAAEC,IAAIkgC,GAAG,EAAEkR,EAAE1tB,EAAEwc,IAAI2R,EAAE1jF,EAAE0jF,EAAE3R,EAAElgC,EAAE0jB,EAAEA,IAAImuB,EAAE3R,EAAEngC,EAAE2jB,EAAEwc,KAAK,OAAO0R,EAAER,EAAE,IAAIjkE,EAAE,SAAS4yB,GAAG,GAAG,EAAEC,EAAEA,IAAID,EAAEC,IAAI,OAAOA,EAAE,IAAI,IAAI0jB,EAAEmuB,EAAE3R,EAAElgC,EAAE0jB,EAAE,IAAImuB,EAAE3R,EAAEngC,EAAE2jB,EAAE,IAAI0tB,EAAE35E,MAAMuoC,EAAEA,KACjfkgC,EAAE,EAAEA,EAAElgC,EAAEA,IAAIkgC,GAAG,EAAEkR,EAAElR,GAAGlgC,EAAE0jB,EAAEwc,GAAG,IAAIA,EAAE,EAAEA,EAAEngC,EAAEC,IAAIkgC,GAAG,EAAEkR,EAAElR,IAAI2R,EAAE1jF,EAAE0jF,EAAE3R,EAAEngC,EAAE2jB,EAAEwc,IAAIxc,GAAG,OAAOkuB,EAAER,EAAE,GAAGjkE,EAAE4yB,KAAK,OAAOC,EAAEwxC,EAAEphF,EAAE,SAASszD,GAAG,IAAI,IAAI3jB,EAAE,GAAG5uC,EAAE,EAAEA,EAAEuyD,EAAE11D,OAAOmD,IAAI,CAAC,IAAI6uC,EAAE0jB,EAAE50D,WAAWqC,GAAG,IAAI6uC,EAAED,EAAE/wC,KAAKgxC,GAAG,KAAKA,EAAED,EAAE/wC,KAAK,IAAIgxC,GAAG,EAAE,IAAM,GAAFA,GAAM,MAAMA,GAAG,OAAOA,EAAED,EAAE/wC,KAAK,IAAIgxC,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAO7uC,IAAI6uC,EAAE,QAAU,KAAFA,IAAS,GAAmB,KAAhB0jB,EAAE50D,WAAWqC,IAAS4uC,EAAE/wC,KAAK,IAAIgxC,GAAG,GAAG,IAAIA,GAAG,GAAG,GAAG,IAAIA,GAAG,EAAE,GAAG,IAAM,GAAFA,IAAO,OAAOD,GAAG,IAAIkzC,EAAE,CAACW,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAE7C,EAAE,GAAGruE,EAAE,WAAW,SAAS8gD,EAAE1jB,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,MAGyE,MAHjE,CAACtxC,EAAE,SAASuxC,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAG0jB,EAAE3jB,GAAG2jB,EAAE,OAAO3jB,GAAG,MAAM2jB,EAAE3jB,GAAG2jB,EAAE,MAAM,OAAgB,OAAT1jB,GAAG,GAAGD,IAAUkzC,EAAE,SAASjzC,GAAG,IAAI,IAAID,EAAEC,GAAG,GAAG,GAAG0jB,EAAE3jB,GAAG2jB,EAAE,OAAO3jB,GAAG,MAAM2jB,EAAE3jB,GAAG2jB,EAAE,MAAM,OAAO1jB,GAAG,GAAGD,GAAGixC,EAAE,SAAShxC,GAAG,OAAOD,EAAEC,EAAE,IAAI0yC,EAAE,SAAS1yC,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,IAAIvyC,KAAKC,MAAMuyC,EAAE,GAAGxyC,KAAKC,MAAMsyC,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,MAAM70C,MAAM,mBAAmB80C,KAAMwxC,EAAE,SAASxxC,GAAG,IAAI,IAAID,EAAE6xC,EAAE,CAAC,GAAG,GAAGluB,EAAE,EAAEA,EAAE1jB,EAAE0jB,GAAG,EAAE3jB,EAAEA,EAAE4zC,SAAS/B,EAAE,CAAC,EAAEC,EAAE1jF,EAAEu1D,IAAI,IAAI,OAAO3jB,GAAGib,EAAE,SAAShb,EAAED,GAAG,GAAG,GAAGC,GAAG,EAAED,GAAG,GAAGA,EAAE,MAAM70C,MAAM,SAAS80C,EAAE,WAAWD,GAAG,OAAO,GAAGA,EAAE,EAAE,IAAIuyC,EAAE,SAAStyC,GAAG,IAAI,IAAID,EAAEC,EAAEoxC,IAAI1tB,EAAE,EACpfp0C,EAAE,EAAEA,EAAEywB,EAAEzwB,GAAG,EAAE,IAAI,IAAI4wD,EAAE,EAAEA,EAAEngC,EAAEmgC,GAAG,EAAE,CAAC,IAAI,IAAI/uE,EAAE,EAAExC,EAAEqxC,EAAED,EAAEzwB,EAAE4wD,GAAGluD,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,KAAK,EAAE1C,EAAE0C,GAAG+tB,GAAGzwB,EAAE0C,GAAG,IAAI,IAAIqgE,GAAG,EAAE,GAAGA,EAAEA,GAAG,EAAE,EAAEnS,EAAEmS,GAAGtyC,GAAGmgC,EAAEmS,IAAI,GAAGrgE,GAAG,GAAGqgE,IAAI1jF,GAAGqxC,EAAED,EAAEzwB,EAAE0C,EAAEkuD,EAAEmS,KAAKlhF,GAAG,GAAG,EAAEA,IAAIuyD,GAAG,EAAEvyD,EAAE,GAAG,IAAIme,EAAE,EAAEA,EAAEywB,EAAE,EAAEzwB,GAAG,EAAE,IAAI4wD,EAAE,EAAEA,EAAEngC,EAAE,EAAEmgC,GAAG,EAAK/uE,EAAE,EAAE6uC,EAAED,EAAEzwB,EAAE4wD,KAAK/uE,GAAG,GAAG6uC,EAAED,EAAEzwB,EAAE,EAAE4wD,KAAK/uE,GAAG,GAAG6uC,EAAED,EAAEzwB,EAAE4wD,EAAE,KAAK/uE,GAAG,GAAG6uC,EAAED,EAAEzwB,EAAE,EAAE4wD,EAAE,KAAK/uE,GAAG,IAAG,GAAGA,GAAG,GAAGA,KAAEuyD,GAAG,GAAE,IAAIp0C,EAAE,EAAEA,EAAEywB,EAAEzwB,GAAG,EAAE,IAAI4wD,EAAE,EAAEA,EAAEngC,EAAE,EAAEmgC,GAAG,EAAElgC,EAAED,EAAEzwB,EAAE4wD,KAAKlgC,EAAED,EAAEzwB,EAAE4wD,EAAE,IAAIlgC,EAAED,EAAEzwB,EAAE4wD,EAAE,IAAIlgC,EAAED,EAAEzwB,EAAE4wD,EAAE,IAAIlgC,EAAED,EAAEzwB,EAAE4wD,EAAE,KAAKlgC,EAAED,EAAEzwB,EAAE4wD,EAAE,IAAIlgC,EAAED,EAAEzwB,EAAE4wD,EAAE,KAAKxc,GAAG,IAAI,IAAIwc,EAAE,EAAEA,EAAEngC,EAAEmgC,GAAG,EAAE,IAAI5wD,EAAE,EAAEA,EAAEywB,EAAE,EAAEzwB,GAAG,EAAE0wB,EAAED,EAAEzwB,EAAE4wD,KAAKlgC,EAAED,EAAEzwB,EACrf,EAAE4wD,IAAIlgC,EAAED,EAAEzwB,EAAE,EAAE4wD,IAAIlgC,EAAED,EAAEzwB,EAAE,EAAE4wD,IAAIlgC,EAAED,EAAEzwB,EAAE,EAAE4wD,KAAKlgC,EAAED,EAAEzwB,EAAE,EAAE4wD,IAAIlgC,EAAED,EAAEzwB,EAAE,EAAE4wD,KAAKxc,GAAG,IAAI,IAAIwc,EAAE/uE,EAAE,EAAE+uE,EAAEngC,EAAEmgC,GAAG,EAAE,IAAI5wD,EAAE,EAAEA,EAAEywB,EAAEzwB,GAAG,EAAE0wB,EAAED,EAAEzwB,EAAE4wD,KAAK/uE,GAAG,GAAG,OAAOuyD,EAAGl2D,KAAK8sC,IAAI,IAAInpC,EAAE4uC,EAAEA,EAAE,IAAI,EAAE,KALiQ,GAKhP8xC,EAAE,WAAW,IAAI,IAAInuB,EAAEjsD,MAAM,KAAKsoC,EAAEtoC,MAAM,KAAKtG,EAAE,EAAE,EAAEA,EAAEA,GAAG,EAAEuyD,EAAEvyD,GAAG,GAAGA,EAAE,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAEuyD,EAAEvyD,GAAGuyD,EAAEvyD,EAAE,GAAGuyD,EAAEvyD,EAAE,GAAGuyD,EAAEvyD,EAAE,GAAGuyD,EAAEvyD,EAAE,GAAG,IAAIA,EAAE,EAAE,IAAIA,EAAEA,GAAG,EAAE4uC,EAAE2jB,EAAEvyD,IAAIA,EAAE,MAAM,CAAC+uE,EAAE,SAASlgC,GAAG,GAAG,EAAEA,EAAE,MAAM90C,MAAM,QAAQ80C,EAAE,KAAK,OAAOD,EAAEC,IAAI7xC,EAAE,SAAS6xC,GAAG,KAAK,EAAEA,GAAGA,GAAG,IAAI,KAAK,KAAKA,GAAGA,GAAG,IAAI,OAAO0jB,EAAE1jB,KAArR,GAA6RrxC,EAAE,WAAW,SAAS+0D,EAAE1jB,EAAE0jB,GAAG,OAAOA,GAAG,KAAKuvB,EAAEW,EAAE,OAAO7zC,EAAE,GAC3gBC,EAAE,IAAI,KAAKizC,EAAEY,EAAE,OAAO9zC,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAKizC,EAAEa,EAAE,OAAO/zC,EAAE,GAAGC,EAAE,GAAG,GAAG,KAAKizC,EAAEhC,EAAE,OAAOlxC,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,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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/renderText.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/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/messages.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/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/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/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/callbacks.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/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/esm/index.js","webpack://telegram-t/./node_modules/safari-14-idb-fix/dist/esm/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 = {\"87\":1,\"133\":1,\"301\":1,\"472\":1,\"532\":1,\"886\":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 { ApiInitialArgs, ApiOnProgress, OnApiUpdate } from '../../types';\nimport { Methods, MethodArgs, MethodResponse } from '../methods/types';\nimport { WorkerMessageEvent, ThenArg, 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 return makeRequest({\n type: 'callMethod',\n name: fnName,\n args,\n }) 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 data.error;\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<ThenArg<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 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', async () => {\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}\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 | AnyLiteral | ArrayBuffer;\nexport type ApiPreparedMedia = string | AnyLiteral;\nexport type ApiMediaFormatToPrepared<T> = T extends ApiMediaFormat.Lottie ? AnyLiteral : 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 isAnimated: boolean;\n width?: number;\n height?: number;\n thumbnail?: ApiThumbnail;\n isPreloadedGlobally?: boolean;\n}\n\nexport interface ApiStickerSet {\n archived?: true;\n isAnimated?: 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 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}\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' | '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","// @ts-ignore\nimport 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\nexport default (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","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 { openUserInfo } = getDispatch();\n\n const handleClick = useCallback(() => {\n if (sender) {\n openUserInfo({ id: sender.id });\n }\n }, [sender, openUserInfo]);\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 getMessageContent,\n getMessageSummaryText,\n getUserFullName,\n isUserId,\n} from '../../../modules/helpers';\nimport trimText from '../../../util/trimText';\nimport { formatCurrency } from '../../../util/formatCurrency';\nimport { TextPart } 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 ActionMessageTextOptions {\n maxTextLength?: number;\n asPlain?: boolean;\n isEmbedded?: boolean;\n}\n\nconst NBSP = '\\u00A0';\n\nexport function renderActionMessageText(\n lang: LangFn,\n message: ApiMessage,\n actionOrigin?: ApiUser | ApiChat,\n targetUsers?: ApiUser[],\n targetMessage?: ApiMessage,\n targetChatId?: string,\n options: ActionMessageTextOptions = {},\n) {\n if (!message.content.action) {\n return [];\n }\n const {\n text, translationValues, amount, currency, call,\n } = message.content.action;\n const content: TextPart[] = [];\n const textOptions: ActionMessageTextOptions = { ...options, maxTextLength: 32 };\n const translationKey = text === 'Chat.Service.Group.UpdatedPinnedMessage1' && !targetMessage\n ? 'Message.PinnedGenericMessage'\n : text;\n\n let unprocessed = lang(translationKey, translationValues && 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 actionOrigin\n ? (!options.isEmbedded && renderOriginContent(lang, actionOrigin, options.asPlain)) || 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, options.asPlain)).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, textOptions)\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, options.asPlain)\n : 'another chat',\n );\n content.push(...processed);\n\n if (options.asPlain) {\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: ActionMessageTextOptions = {}) {\n const text = getMessageSummaryText(lang, message);\n const {\n photo, video, document, sticker,\n } = getMessageContent(message);\n\n const { maxTextLength, isEmbedded, asPlain } = options;\n\n const showQuotes = isEmbedded && text && !photo && !video && !document && !sticker;\n let messageText = trimText(text as string, maxTextLength)!;\n\n if (isEmbedded) {\n if (photo) {\n messageText = 'a photo';\n } else if (video) {\n messageText = video.isGif ? 'a GIF' : 'a video';\n } else if (document) {\n messageText = 'a document';\n } else if (sticker) {\n messageText = text;\n }\n }\n\n if (asPlain) {\n return showQuotes ? `«${messageText}»` : messageText;\n }\n\n if (showQuotes) {\n return (\n <span>\n &laquo;\n <MessageLink className=\"action-link\" message={message}>{renderText(messageText)}</MessageLink>\n &raquo;\n </span>\n );\n }\n\n return (\n <MessageLink className=\"action-link\" message={message}>{renderText(messageText)}</MessageLink>\n );\n}\n\nfunction renderOriginContent(lang: LangFn, origin: ApiUser | ApiChat, asPlain?: boolean) {\n return isUserId(origin.id)\n ? renderUserContent(origin as ApiUser, asPlain)\n : renderChatContent(lang, origin as ApiChat, asPlain);\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, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getUserFullName(sender));\n\n if (asPlain) {\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, asPlain?: boolean): string | TextPart | undefined {\n const text = trimText(getChatTitle(lang, chat));\n\n if (asPlain) {\n return text;\n }\n\n return <ChatLink className=\"action-link\" chatId={chat.id}>{chat && renderText(text!)}</ChatLink>;\n}\n\nfunction renderMigratedContent(chatId: string, asPlain?: boolean): string | TextPart | undefined {\n const text = 'another chat';\n\n if (asPlain) {\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 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';\n\nimport MentionLink from '../../middle/message/MentionLink';\nimport SafeLink from '../SafeLink';\n\ntype TextPart = string | Element;\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<(\n 'escape_html' | 'hq_emoji' | 'emoji' | 'emoji_html' | 'br' | 'br_html' | 'highlight' | 'links' |\n 'simple_markdown' | 'simple_markdown_html'\n )> = ['emoji'],\n params?: { highlight: string | undefined },\n): TextPart[] {\n if (typeof part !== 'string') {\n return [part];\n }\n\n return 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 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?: 'primary' | 'secondary' | 'gray' | 'danger' | 'translucent' | 'translucent-white' | 'dark';\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 // @ts-ignore\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 || !!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 { ChangeEvent, FormEvent, RefObject } 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';\n\nimport './Loading.scss';\n\ntype OwnProps = {\n color?: 'blue' | 'white' | 'black';\n};\n\nconst Loading: FC<OwnProps> = ({ color = 'blue' }) => {\n return (\n <div className=\"Loading\">\n <Spinner color={color} withBackground={color === 'white'} />\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 menuStyle?: string;\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 menuStyle,\n children,\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 (prevIsOpen !== undefined) {\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 return (\n <div\n className={buildClassName('Menu no-selection', className)}\n onKeyDown={isOpen ? handleKeyDown : undefined}\n onMouseEnter={onMouseEnter}\n onMouseLeave={isOpen ? onMouseLeave : undefined}\n // @ts-ignore teact feature\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 // @ts-ignore teact feature\n style={`transform-origin: ${positionY} ${positionX};${menuStyle || ''}`}\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 // @ts-ignore\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';\n withBackground?: boolean;\n}> = ({\n color = 'blue',\n withBackground,\n}) => {\n return (\n <div className={buildClassName('Spinner', color, withBackground && 'with-background')}>\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_CHAT_LIST_LIMIT = 30;\nexport const GLOBAL_STATE_CACHE_USER_LIST_LIMIT = 5000;\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;\n\nexport const TOP_CHAT_MESSAGES_PRELOAD_LIMIT = 20;\nexport const ALL_CHATS_PRELOAD_DISABLED = false;\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 = 80;\nexport const STICKER_SIZE_INLINE_BOT_RESULT = 100;\nexport const RECENT_STICKERS_LIMIT = 20;\nexport const MEMOJI_STICKER_ID = 'MEMOJI_STICKER';\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';\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\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// TODO Get values from `getConfig` method once it's available\nexport const SEEN_BY_MEMBERS_CHAT_MAX = 50;\nexport const SEEN_BY_MEMBERS_EXPIRE = 604680; // One week - 2 min\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\nexport default <T extends any[], PT = T>(cb: (args: PT) => void, dependencies: T, debugKey?: string) => {\n const prevDeps = usePrevious<T>(dependencies);\n return useEffect(() => {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n return cb(prevDeps || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies, debugKey);\n};\n","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default (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","import { useCallback, useState } from '../lib/teact/teact';\n\nexport default () => {\n const [, setTrigger] = useState<boolean>(false);\n\n return useCallback(() => {\n setTrigger((trigger) => !trigger);\n }, []);\n};\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\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n) => {\n useEffect(() => {\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 }, [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","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\nexport default (\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","import * as langProvider from '../util/langProvider';\nimport useForceUpdate from './useForceUpdate';\nimport useOnChange from './useOnChange';\n\nexport type LangFn = typeof langProvider.getTranslation;\n\nexport default (): LangFn => {\n const forceUpdate = useForceUpdate();\n\n useOnChange(() => {\n return langProvider.addCallback(forceUpdate);\n }, [forceUpdate]);\n\n return langProvider.getTranslation;\n};\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\nexport default <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 if (autoUpdate) {\n // Use effect and cleanup for listener removal\n addLoadListener(forceUpdate);\n }\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","import usePrevious from './usePrevious';\n\nexport default <T extends any[], PT = T>(cb: (args: PT) => void, dependencies: T) => {\n const prevDeps = usePrevious<T>(dependencies);\n if (!prevDeps || dependencies.some((d, i) => d !== prevDeps[i])) {\n // @ts-ignore (workaround for \"could be instantiated with a different subtype\" issue)\n cb(prevDeps || []);\n }\n};\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\nexport default (\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 closeTimeoutRef.current = window.setTimeout(() => {\n setIsClosed(true);\n\n if (onCloseTransitionEnd) {\n onCloseTransitionEnd();\n }\n\n closeTimeoutRef.current = undefined;\n }, noCloseTransition ? 0 : CLOSE_DURATION);\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","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;\n\nconst NON_BUBBLEABLE_EVENTS = new Set(['scroll', 'mouseenter', 'mouseleave']);\n\nconst delegationRegistry: Record<string, Map<HTMLElement, Handler>> = {};\nconst delegatedEventsByElement = new Map<HTMLElement, Set<string>>();\nconst documentEventCounters: Record<string, number> = {};\n\nexport function addEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n addDelegatedListener(eventName, element, handler);\n } else {\n element.addEventListener(eventName, handler, asCapture);\n }\n}\n\nexport function removeEventListener(element: HTMLElement, propName: string, handler: Handler, asCapture = false) {\n const eventName = resolveEventName(propName, element);\n if (canUseEventDelegation(eventName, element, asCapture)) {\n removeDelegatedListener(eventName, element);\n } else {\n element.removeEventListener(eventName, handler, asCapture);\n }\n}\n\nfunction resolveEventName(propName: string, element: HTMLElement) {\n const eventName = propName\n .replace(/^on/, '')\n .replace(/Capture$/, '').toLowerCase();\n\n if (eventName === '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 (eventName === 'doubleclick') {\n return 'dblclick';\n }\n\n // Replace focus/blur by their \"bubbleable\" versions\n if (eventName === 'focus') {\n return 'focusin';\n }\n\n if (eventName === 'blur') {\n return 'focusout';\n }\n\n return eventName;\n}\n\nfunction canUseEventDelegation(realEventName: string, element: HTMLElement, asCapture: boolean) {\n return (\n !asCapture\n && !NON_BUBBLEABLE_EVENTS.has(realEventName)\n && element.tagName !== 'VIDEO'\n && element.tagName !== 'IFRAME'\n );\n}\n\nfunction addDelegatedListener(eventName: string, element: HTMLElement, handler: Handler) {\n if (!documentEventCounters[eventName]) {\n documentEventCounters[eventName] = 0;\n document.addEventListener(eventName, handleEvent);\n }\n\n resolveDelegationRegistryForName(eventName).set(element, handler);\n resolveDelegatedEventsForElement(element).add(eventName);\n documentEventCounters[eventName]++;\n}\n\nfunction removeDelegatedListener(eventName: string, element: HTMLElement) {\n documentEventCounters[eventName]--;\n if (!documentEventCounters[eventName]) {\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(eventName, handleEvent);\n }\n\n delegationRegistry[eventName].delete(element);\n delegatedEventsByElement.get(element)!.delete(eventName);\n}\n\nexport function removeAllDelegatedListeners(element: HTMLElement) {\n const eventNames = delegatedEventsByElement.get(element);\n if (!eventNames) {\n return;\n }\n\n eventNames.forEach((eventName) => removeDelegatedListener(eventName, element));\n delegatedEventsByElement.delete(element);\n}\n\nfunction handleEvent(realEvent: Event) {\n const events = delegationRegistry[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 resolveDelegationRegistryForName(eventName: string) {\n if (!delegationRegistry[eventName]) {\n delegationRegistry[eventName] = new Map();\n }\n\n return delegationRegistry[eventName];\n}\n\nfunction resolveDelegatedEventsForElement(element: HTMLElement) {\n const existing = delegatedEventsByElement.get(element);\n if (existing) {\n return existing;\n }\n\n const newSet = new Set<string>();\n delegatedEventsByElement.set(element, newSet);\n\n return newSet;\n}\n\nif (DEBUG) {\n document.addEventListener('dblclick', () => {\n // eslint-disable-next-line no-console\n console.log('DELEGATED EVENTS', { delegationRegistry, delegatedEventsByElement, documentEventCounters });\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 if (\n !skipComponentUpdate\n && $current && $new\n && isComponentElement($current) && isComponentElement($new)\n && !hasElementChanged($current, $new)\n ) {\n $new = updateComponent($current, $new);\n }\n\n // Parent element may have changed, so we need to update the listener closure.\n if (!skipComponentUpdate && $new && isComponentElement($new) && $new.componentInstance.isMounted) {\n setupComponentUpdateListener($new, $parent, index, parentEl);\n }\n\n if ($current === $new) {\n return $new;\n }\n\n if (!$current && $new) {\n if (isComponentElement($new)) {\n $new = initComponent($new, $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 (isComponentElement($new)) {\n $new = initComponent($new, $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 = isComponentElement($current) && isComponentElement($new);\n\n if (!areComponents) {\n setTarget($new, getTarget($current)!);\n }\n\n if (isRealElement($current) && isRealElement($new)) {\n if (moveDirection) {\n const node = getTarget($current)!;\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, $new, getTarget($current) as HTMLElement);\n }\n\n $new.children = renderChildren(\n $current,\n $new,\n areComponents ? parentEl : getTarget($current) 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.keys(props).forEach((key) => {\n if (props[key] !== undefined) {\n setAttribute(element, key, props[key]);\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 maxLength = Math.max($current.children.length, $new.children.length);\n const newChildren = [];\n const fragment = $new.children.length > $current.children.length + 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 >= $current.children.length ? { 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 ...(shouldMoveNode && {\n moveDirection: isMovingDown ? 'down' : 'up',\n }),\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 currentKeys = Object.keys($current.props);\n const newKeys = Object.keys($new.props);\n\n currentKeys.forEach((key) => {\n const currentValue = $current.props[key];\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 newKeys.forEach((key) => {\n const currentValue = $current.props[key];\n const newValue = $new.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 (element as HTMLInputElement).value = value;\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\nexport default { render };\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?: 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;\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.log('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 (componentName !== 'TeactMemoWrapper' && componentName !== 'TeactNContainer') {\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) {\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 (!isRealElement($element)) {\n return;\n }\n\n if (isComponentElement($element)) {\n unmountComponent($element.componentInstance);\n } else if ($element.target) {\n removeAllDelegatedListeners($element.target as HTMLElement);\n // Trying to help GC\n // eslint-disable-next-line no-null/no-null\n $element.target = null as any;\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 componentInstance.hooks.memos.byCursor.forEach((hook) => {\n // eslint-disable-next-line no-null/no-null\n hook.current = null;\n });\n\n componentInstance.hooks.effects.byCursor.forEach(({ cleanup }) => {\n if (typeof cleanup === 'function') {\n try {\n cleanup();\n } catch (err) {\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 /* eslint-disable no-null/no-null */\n\n componentInstance.hooks.effects.byCursor.forEach((hook) => {\n hook.cleanup = null as any;\n hook.effect = null as any;\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks.state.byCursor.forEach((hook) => {\n hook.value = null as any;\n hook.nextValue = null as any;\n hook.setter = null as any;\n });\n\n componentInstance.hooks.memos.byCursor.forEach((hook) => {\n hook.dependencies = null as any;\n });\n\n componentInstance.hooks = null as any;\n componentInstance.$element = null as any;\n componentInstance.renderedValue = null as any;\n componentInstance.Component = null as any;\n componentInstance.props = null as any;\n componentInstance.forceUpdate = null as any;\n componentInstance.onUpdate = null as any;\n\n /* eslint-enable no-null/no-null */\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>(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?: 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) {\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(\n '[Teact]',\n debugKey,\n 'Effect caused by dependencies.',\n causedBy.join(', '),\n );\n }\n\n primarySchedulerFn(execCleanup);\n schedulerFn(exec);\n }\n } else {\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?: any[], debugKey?: string) {\n return useLayoutEffectBase(fastRaf, fastRafPrimary, effect, dependencies, debugKey);\n}\n\nexport function useLayoutEffect(effect: () => Function | void, dependencies?: 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.\nexport default {\n createElement,\n Fragment,\n};\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) {\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) {\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.log(\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, 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 });\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","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 lastSyncTime: Date.now(),\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 setGlobal({\n ...global,\n connectionState,\n });\n\n if (connectionState === 'connectionStateReady' && global.authState === 'authorizationStateReady') {\n getDispatch().sync();\n } else 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';\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 switchTheme(theme, animationLevel === ANIMATION_LEVEL_MAX);\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 { GlobalState } from '../../global/types';\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(untilDate * 1000, lang)],\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 prepareFolderListIds(\n allListIds: GlobalState['chats']['listIds'],\n chatsById: Record<string, ApiChat>,\n usersById: Record<string, ApiUser>,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n) {\n const excludedChatIds = folder.excludedChatIds ? new Set(folder.excludedChatIds) : undefined;\n const includedChatIds = folder.excludedChatIds ? new Set(folder.includedChatIds) : undefined;\n const pinnedChatIds = folder.excludedChatIds ? new Set(folder.pinnedChatIds) : undefined;\n const listIds = ([] as string[]).concat(allListIds.active || [], allListIds.archived || [])\n .filter((id) => {\n const chat = chatsById[id];\n return chat && filterChatFolder(\n chat,\n folder,\n usersById,\n notifySettings,\n notifyExceptions,\n excludedChatIds,\n includedChatIds,\n pinnedChatIds,\n );\n });\n\n return [listIds, folder.pinnedChatIds] as const;\n}\n\n// This function is the most expensive in the project, so any possible optimizations are welcome\nfunction filterChatFolder(\n chat: ApiChat,\n folder: ApiChatFolder,\n usersById: Record<string, ApiUser>,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n excludedChatIds?: Set<string>,\n includedChatIds?: Set<string>,\n pinnedChatIds?: Set<string>,\n) {\n if (!chat.isListed) {\n return false;\n }\n\n const { id: chatId, type, unreadMentionsCount } = chat;\n\n if (excludedChatIds?.has(chatId)) {\n return false;\n }\n\n if (includedChatIds?.has(chatId)) {\n return true;\n }\n\n if (pinnedChatIds?.has(chatId)) {\n return true;\n }\n\n if (folder.excludeArchived && chat.folderId === ARCHIVED_FOLDER_ID) {\n return false;\n }\n\n if (folder.excludeRead && !chat.unreadCount && !unreadMentionsCount && !chat.hasUnreadMark) {\n return false;\n }\n\n if (folder.excludeMuted && !unreadMentionsCount && selectIsChatMuted(chat, notifySettings, notifyExceptions)) {\n return false;\n }\n\n if (type === 'chatTypePrivate') {\n const user = usersById[chatId];\n if (user) {\n const { type: userType, isContact } = user;\n\n if (userType === 'userTypeBot') {\n if (folder.bots) {\n return true;\n }\n } else {\n if (folder.contacts && isContact) {\n return true;\n }\n\n if (folder.nonContacts && !isContact) {\n return true;\n }\n }\n }\n } else if (type === 'chatTypeChannel') {\n return !!folder.channels;\n } else if (type === 'chatTypeBasicGroup' || type === 'chatTypeSuperGroup') {\n return !!folder.groups;\n }\n\n return false;\n}\n\nexport function prepareChatList(\n chatsById: Record<string, ApiChat>,\n listIds: string[],\n orderedPinnedIds?: string[],\n folderType: 'all' | 'archived' | 'folder' = 'all',\n noOrder = false,\n) {\n const listIdsSet = new Set(listIds);\n const orderedPinnedIdsSet = orderedPinnedIds ? new Set(orderedPinnedIds) : undefined;\n\n const pinnedChats = orderedPinnedIds?.reduce((acc, id) => {\n const chat = chatsById[id];\n\n if (chat && listIdsSet.has(chat.id) && checkChat(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]) || [];\n\n const otherChats = listIds.reduce((acc, id) => {\n const chat = chatsById[id];\n\n if (chat && (!orderedPinnedIdsSet || !orderedPinnedIdsSet.has(chat.id)) && checkChat(chat, folderType)) {\n acc.push(chat);\n }\n\n return acc;\n }, [] as ApiChat[]);\n\n return {\n pinnedChats,\n otherChats: noOrder ? otherChats : orderBy(otherChats, getChatOrder, 'desc'),\n };\n}\n\nfunction checkChat(chat: ApiChat, folderType: 'all' | 'archived' | 'folder') {\n return (\n chat.lastMessage && !chat.migratedTo && !chat.isRestricted && !chat.isNotJoined\n && !(folderType === 'all' && chat.folderId === ARCHIVED_FOLDER_ID)\n && !(folderType === 'archived' && chat.folderId !== ARCHIVED_FOLDER_ID)\n );\n}\n\nexport function reduceChatList(\n chatArrays: { pinnedChats: ApiChat[]; otherChats: ApiChat[] },\n filteredIds: string[],\n) {\n const filteredIdsSet = new Set(filteredIds);\n\n return {\n pinnedChats: chatArrays.pinnedChats.filter(({ id }) => filteredIdsSet.has(id)),\n otherChats: chatArrays.otherChats.filter(({ id }) => filteredIdsSet.has(id)),\n };\n}\n\nexport function getFolderUnreadDialogs(\n allListIds: GlobalState['chats']['listIds'],\n chatsById: Record<string, ApiChat>,\n usersById: Record<string, ApiUser>,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n) {\n const [listIds] = prepareFolderListIds(allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions);\n\n let hasActiveDialogs = false;\n const unreadDialogsCount = listIds.reduce((acc, id) => {\n const chat = chatsById[id];\n if (!chat?.lastMessage || chat?.isRestricted || chat?.isNotJoined) {\n return acc;\n }\n\n const isUnread = chat.unreadCount || chat.hasUnreadMark;\n\n if (isUnread) {\n acc++;\n }\n\n if (!hasActiveDialogs && (\n chat.unreadMentionsCount || (isUnread && !selectIsChatMuted(chat, notifySettings, notifyExceptions))\n )) {\n hasActiveDialogs = true;\n }\n\n return acc;\n }, 0);\n\n return {\n unreadDialogsCount,\n hasActiveDialogs,\n };\n}\n\nexport function getFolderDescriptionText(\n lang: LangFn,\n allListIds: GlobalState['chats']['listIds'],\n chatsById: Record<string, ApiChat>,\n usersById: Record<string, ApiUser>,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<number, NotifyException>,\n) {\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 Object.values(filters).filter(Boolean).length > 1\n || (excludedChatIds?.length)\n || (includedChatIds?.length)\n ) {\n const length = getFolderChatsCount(allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions);\n return lang('Chats', length);\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\nfunction getFolderChatsCount(\n allListIds: GlobalState['chats']['listIds'],\n chatsById: Record<string, ApiChat>,\n usersById: Record<string, ApiUser>,\n folder: ApiChatFolder,\n notifySettings: NotifySettings,\n notifyExceptions?: Record<string, NotifyException>,\n) {\n const [listIds, pinnedIds] = prepareFolderListIds(\n allListIds, chatsById, usersById, folder, notifySettings, notifyExceptions,\n );\n const { pinnedChats, otherChats } = prepareChatList(chatsById, listIds, pinnedIds, 'folder', true);\n return pinnedChats.length + otherChats.length;\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, ApiUser,\n} from '../../api/types';\nimport { LangFn } from '../../hooks/useLang';\n\nimport { LOCAL_MESSAGE_ID_BASE, SERVICE_NOTIFICATIONS_USER_ID, RE_LINK_TEMPLATE } from '../../config';\nimport { getUserFullName } from './users';\nimport { isWebpSupported, IS_OPUS_SUPPORTED } from '../../util/environment';\nimport { getChatTitle, isUserId } from './chats';\nimport parseEmojiOnlyString from '../../components/common/helpers/parseEmojiOnlyString';\n\nconst CONTENT_NOT_SUPPORTED = 'The message is not supported on this version of Telegram';\nconst RE_LINK = new RegExp(RE_LINK_TEMPLATE, 'i');\nconst TRUNCATED_SUMMARY_LENGTH = 80;\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 getMessageSummaryText(lang: LangFn, message: ApiMessage, noEmoji = false) {\n const {\n text, photo, video, audio, voice, document, sticker, contact, poll, invoice,\n } = message.content;\n\n const truncatedText = text && text.text.substr(0, TRUNCATED_SUMMARY_LENGTH);\n\n if (message.groupedId) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('lng_in_dlg_album')}`;\n }\n\n if (photo) {\n return `${noEmoji ? '' : '🖼 '}${truncatedText || lang('AttachPhoto')}`;\n }\n\n if (video) {\n return `${noEmoji ? '' : '📹 '}${truncatedText || lang(video.isGif ? 'AttachGif' : 'AttachVideo')}`;\n }\n\n if (sticker) {\n return `${sticker.emoji || ''} ${lang('AttachSticker')}`.trim();\n }\n\n if (audio) {\n return `${noEmoji ? '' : '🎧 '}${getMessageAudioCaption(message) || lang('AttachMusic')}`;\n }\n\n if (voice) {\n return `${noEmoji ? '' : '🎤 '}${truncatedText || lang('AttachAudio')}`;\n }\n\n if (document) {\n return `${noEmoji ? '' : '📎 '}${truncatedText || document.fileName}`;\n }\n\n if (contact) {\n return lang('AttachContact');\n }\n\n if (poll) {\n return `${noEmoji ? '' : '📊 '}${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 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 !!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 getMessageAudioCaption(message: ApiMessage) {\n const { audio, text } = message.content;\n\n return (audio && [audio.title, audio.performer].filter(Boolean).join(' — ')) || (text?.text);\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.isAnimated ? 'tgs' : 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","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): Exclude<ApiMediaFormat, ApiMediaFormat.Lottie>;\nexport function getMessageMediaFormat(message: ApiMessage, target: Target, canBeLottie: true): ApiMediaFormat;\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.isAnimated) {\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 const ids = getMessageContentIds(messages, listedIds, isFromSharedMedia ? 'media' : 'inlineMedia');\n\n return isFromSharedMedia ? ids.reverse() : ids;\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(wasOnlineDate, lang));\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(wasOnlineDate, lang));\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(userIds: string[], usersById: Record<string, ApiUser>, query?: string) {\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 = 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 {\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 { 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\n return {\n ...global,\n stickers: {\n ...global.stickers,\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 updateSelectedUserId(global: GlobalState, selectedId?: string): GlobalState {\n if (global.users.selectedId === selectedId) {\n return global;\n }\n\n return {\n ...global,\n users: {\n ...global.users,\n selectedId,\n },\n };\n}\n\nexport function deleteUser(global: GlobalState, userId: string): GlobalState {\n const { byId } = global.users;\n const { userIds } = global.contactList || {};\n delete byId[userId];\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, byId);\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) => a - b);\n}\n","import { GlobalState } from '../../global/types';\nimport { ManagementProgress } from '../../types';\n\ninterface ManagementState {\n isActive: boolean;\n isUsernameAvailable?: boolean;\n error?: string;\n}\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 { ApiChat, MAIN_THREAD_ID } from '../../api/types';\nimport { GlobalState } from '../../global/types';\n\nimport {\n getPrivateChatUserId, isChatChannel, isUserId, isHistoryClearMessage, isUserBot, isUserOnline, selectIsChatMuted,\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';\nimport { selectNotifyExceptions, selectNotifySettings } from './settings';\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 !!active && active.includes(chatId);\n }\n\n if (folderId === ARCHIVED_FOLDER_ID) {\n return !!archived && archived.includes(chatId);\n }\n\n const { byId: chatFoldersById } = global.chatFolders;\n\n const { pinnedChatIds } = chatFoldersById[folderId] || {};\n return !!pinnedChatIds && 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\n// Slow, not to be used in `withGlobal`\nexport function selectCountNotMutedUnread(global: GlobalState) {\n const activeChatIds = global.chats.listIds.active;\n if (!activeChatIds) {\n return 0;\n }\n\n const chats = global.chats.byId;\n const notifySettings = selectNotifySettings(global);\n const notifyExceptions = selectNotifyExceptions(global);\n\n return activeChatIds.reduce((acc, chatId) => {\n const chat = chats[chatId];\n\n if (\n chat\n && chat.unreadCount\n && chat.isListed\n && !chat.isNotJoined\n && !chat.isRestricted\n && (chat.unreadMentionsCount || !selectIsChatMuted(chat, notifySettings, notifyExceptions))\n ) {\n return acc + chat.unreadCount;\n }\n\n return acc;\n }, 0);\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 stickerSets.forEach(({ packs }) => {\n if (!packs) {\n return;\n }\n const stickers = packs[emoji];\n if (stickers) {\n stickersForEmoji = stickersForEmoji.concat(stickers);\n }\n });\n return stickersForEmoji;\n}\n\nexport function selectAnimatedEmoji(global: GlobalState, emoji: string) {\n const { animatedEmojis } = global;\n if (!animatedEmojis || !animatedEmojis.stickers) {\n return undefined;\n }\n\n // Some emojis (❤️ for example) with a service symbol 'VARIATION SELECTOR-16' are not recognized as animated\n const cleanedEmoji = emoji.replace('\\ufe0f', '');\n\n return animatedEmojis.stickers.find((sticker) => sticker.emoji === emoji || sticker.emoji === cleanedEmoji);\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 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","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 selectCurrentMediaSearchPeerId(global: GlobalState) {\n const { byChatId } = global.localMediaSearch;\n const { chatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = global.users.selectedId;\n\n return currentProfileUserId && byChatId[currentProfileUserId] ? currentProfileUserId : chatId;\n}\n\nexport function selectCurrentMediaSearch(global: GlobalState) {\n const peerId = selectCurrentMediaSearchPeerId(global);\n if (!peerId) {\n return undefined;\n }\n\n return global.localMediaSearch.byChatId[peerId];\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 { selectCurrentStickerSearch, selectCurrentGifSearch } from './symbols';\nimport { selectAreActiveChatsLoaded } from './chats';\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 const {\n users,\n isChatInfoShown,\n newChatMembersProgress,\n } = global;\n\n const isAddingChatMembersShown = newChatMembersProgress !== NewChatMembersProgress.Closed;\n const isPollResults = selectIsPollResultsOpen(global);\n const isSearch = Boolean(!IS_SINGLE_COLUMN_LAYOUT && selectCurrentTextSearch(global));\n const isManagement = selectCurrentManagement(global);\n const stickerSearch = selectCurrentStickerSearch(global);\n const isStickerSearch = stickerSearch.query !== undefined;\n const gifSearch = selectCurrentGifSearch(global);\n const isGifSearch = gifSearch.query !== undefined;\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const currentProfileUserId = users.selectedId;\n const areActiveChatsLoaded = selectAreActiveChatsLoaded(global);\n const isUserInfo = Boolean(currentProfileUserId && areActiveChatsLoaded);\n const isChatShown = Boolean(currentChatId && areActiveChatsLoaded);\n const isChatInfo = isChatShown && isChatInfoShown;\n\n return isPollResults ? (\n RightColumnContent.PollResults\n ) : isSearch ? (\n RightColumnContent.Search\n ) : isManagement ? (\n RightColumnContent.Management\n ) : isStickerSearch ? (\n RightColumnContent.StickerSearch\n ) : isGifSearch ? (\n RightColumnContent.GifSearch\n ) : isAddingChatMembersShown ? (\n RightColumnContent.AddingMembers\n ) : isUserInfo ? (\n RightColumnContent.UserInfo\n ) : isChatInfo ? (\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 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}\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}\n\nexport type StickerSetOrRecent = Pick<ApiStickerSet, (\n 'id' | 'title' | 'count' | 'stickers' | 'hasThumbnail' | 'isAnimated'\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 UserInfo,\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 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 GroupMembers,\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 fastRaf(() => {\n if (!instance!.isCancelled && tick()) {\n animateSingle(tick, instance);\n }\n });\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if (tick()) {\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)[];\n\nexport default (...parts: Parts) => {\n return parts.filter(Boolean).join(' ');\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\n // Safari does not return correct Content-Type header for webp images.\n if (key.startsWith('sticker')) {\n return new Blob([blob], { type: 'image/webp' });\n }\n\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","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 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(datetime: number | Date, lang: LangFn) {\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(date, lang);\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 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}\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(date, lang)}`;\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/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');\nexport const IS_MOV_SUPPORTED = Boolean(\n TEST_VIDEO.canPlayType(VIDEO_MOV_TYPE).replace('no', '')\n || IS_IOS, // IOS reports '', but still plays .mov files\n);\n\nif (IS_MOV_SUPPORTED) SUPPORTED_VIDEO_CONTENT_TYPES.add(VIDEO_MOV_TYPE);\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 { 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","export default (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","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 SERVICE_WORKER_DISABLED: 'Service Worker is disabled. Please reload 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};\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(array: any[]) {\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","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 return {\n runCallbacks,\n addCallback,\n removeCallback,\n };\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 ApiMediaFormatToPrepared,\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.Json,\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<ApiMediaFormatToPrepared<T>> {\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<ApiMediaFormatToPrepared<T>>;\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<ApiMediaFormatToPrepared<T>>;\n}\n\nexport function getFromMemory<T extends ApiMediaFormat>(url: string) {\n return memoryCache.get(url) as ApiMediaFormatToPrepared<T>;\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: ApiParsedMedia): 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';\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\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(handleBundleLoad);\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\nconst listeners: NoneToVoidFunction[] = [];\n\nexport function addLoadListener(listener: NoneToVoidFunction) {\n if (!listeners.includes(listener)) {\n listeners.push(listener);\n }\n}\n\nfunction handleBundleLoad() {\n listeners.forEach((listener) => {\n listener();\n });\n}\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) {\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 actionOrigin = chat && (isChatChannel(chat) || message.senderId === message.chatId)\n ? chat\n : messageSender;\n body = renderActionMessageText(\n getTranslation,\n message,\n actionOrigin,\n actionTargetUsers,\n actionTargetMessage,\n actionTargetChatId,\n { asPlain: 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<ApiMediaFormat.BlobUrl>(imageHash);\n if (!mediaData) {\n await mediaLoader.fetch(imageHash, ApiMediaFormat.BlobUrl);\n mediaData = mediaLoader.getFromMemory<ApiMediaFormat.BlobUrl>(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","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\nexport const createMessageHash = (messageList: MessageList): string => (\n messageList.chatId.toString()\n + (messageList.type !== 'thread' ? `_${messageList.type}`\n : (messageList.threadId !== -1 ? `_${messageList.threadId}` : ''))\n);\n\nexport const parseLocationHash = (value: string): MessageList | undefined => {\n if (!value) return undefined;\n\n const [chatId, typeOrThreadId] = value.replace(/^#/, '').split('_');\n\n if (!chatId) return undefined;\n\n const isType = ['thread', 'pinned', 'scheduled'].includes(typeOrThreadId);\n\n return {\n chatId,\n type: !!typeOrThreadId && isType ? (typeOrThreadId as MessageListType) : 'thread',\n threadId: !!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 * 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(customStore, callback) {\n return customStore('readonly', (store) => {\n // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n // And openKeyCursor isn't supported by Safari.\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/**\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 const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\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 const items = [];\n return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\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 const items = [];\n return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","/**\n * https://bugs.webkit.org/show_bug.cgi?id=226547\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up.\n * The only solution is to keep nudging it until it's awake.\n * This probably creates garbage, but garbage is better than totally failing.\n */\nfunction idbReady() {\n const 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 let intervalId;\n return new Promise((resolve) => {\n const tryIdb = () => indexedDB.databases().finally(resolve);\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(() => 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';\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\nexport default (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 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 } 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","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","const DEFAULT_MAX_TEXT_LENGTH = 30;\n\nexport default function trimText(text: string | undefined, length = DEFAULT_MAX_TEXT_LENGTH) {\n if (!text || text.length <= length) {\n return text;\n }\n\n return `${text.substr(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 = () => !!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","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 windowSize = updateSizes();\nlet isRefreshDisabled = false;\n\nfunction disableRefresh() {\n isRefreshDisabled = true;\n}\n\nfunction enableRefresh() {\n isRefreshDisabled = false;\n}\n\nconst handleResize = throttle(() => {\n windowSize = 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 windowSize.width <= MOBILE_SCREEN_MAX_WIDTH || (\n windowSize.width <= MOBILE_SCREEN_LANDSCAPE_MAX_WIDTH && windowSize.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\nexport default {\n get: () => windowSize,\n getIsKeyboardVisible: () => initialHeight > windowSize.height,\n disableRefresh,\n enableRefresh,\n};\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 + \".\" + {\"87\":\"f9efe67c5df9f5da39e2\",\"99\":\"f03a947e6e336feffec8\",\"133\":\"42b7d5ed8329409ab320\",\"161\":\"286d0207d962142ad548\",\"301\":\"1f369c31b0862e5bbb87\",\"354\":\"5a3212a48341fe482e1e\",\"472\":\"21e5264f606f2b525030\",\"501\":\"72ce4b6e27f459e194cd\",\"524\":\"bb18f0820dd431486c23\",\"532\":\"0ac3c86599df5cf0b45e\",\"536\":\"55dc7dd4ab42a2c9f037\",\"739\":\"091045a7bd9587161776\",\"745\":\"9316c5c2b711c39a20a5\",\"884\":\"0aacd0fcecc50a0aec87\",\"886\":\"3dd0d770ecb4bdf3aed4\",\"915\":\"0588cdc78683d0e9bbbc\",\"927\":\"fd5c9ce4522d0a6d85a8\",\"941\":\"5a6cedb5afef94338282\",\"993\":\"f0aad9f6787f211b4e51\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + {\"87\":\"f9efe67c5df9f5da39e2\",\"133\":\"42b7d5ed8329409ab320\",\"301\":\"1f369c31b0862e5bbb87\",\"472\":\"21e5264f606f2b525030\",\"532\":\"0ac3c86599df5cf0b45e\",\"886\":\"3dd0d770ecb4bdf3aed4\"}[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[chunkIds[i]] = 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 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 },\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\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_CHAT_LIST_LIMIT,\n MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN,\n GLOBAL_STATE_CACHE_USER_LIST_LIMIT,\n DEFAULT_VOLUME,\n DEFAULT_PLAYBACK_RATE,\n} from '../config';\nimport { IS_SINGLE_COLUMN_LAYOUT } from '../util/environment';\nimport { isHeavyAnimating } from '../hooks/useHeavyAnimationCheck';\nimport { pick } from '../util/iteratees';\nimport { selectCurrentMessageList } from '../modules/selectors';\nimport { hasStoredSession } from '../util/sessions';\nimport { INITIAL_STATE } from './initial';\nimport { parseLocationHash } from '../util/routing';\nimport { LOCATION_HASH } from '../hooks/useHistoryBack';\nimport { isUserId } from '../modules/helpers';\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(LOCATION_HASH) : 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 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 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\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 };\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, selectedId } } = global;\n const chatIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT).filter(isUserId);\n const userIds = Object.keys(byId);\n const idsToSave = chatIds.concat(userIds).slice(0, GLOBAL_STATE_CACHE_USER_LIST_LIMIT);\n\n return {\n byId: pick(byId, idsToSave),\n statusesById: pick(statusesById, idsToSave),\n selectedId: window.innerWidth > MIN_SCREEN_WIDTH_FOR_STATIC_RIGHT_COLUMN ? selectedId : undefined,\n };\n}\n\nfunction reduceChats(global: GlobalState): GlobalState['chats'] {\n const newListIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n const idsToSave = newListIds.concat(currentChatId ? [currentChatId] : []);\n\n return {\n ...global.chats,\n byId: pick(global.chats.byId, idsToSave),\n listIds: {\n active: newListIds,\n },\n isFullyLoaded: {},\n orderedPinnedIds: {\n active: global.chats.orderedPinnedIds.active,\n },\n };\n}\n\nfunction reduceMessages(global: GlobalState): GlobalState['messages'] {\n const byChatId: GlobalState['messages']['byChatId'] = {};\n const { chatId: currentChatId } = selectCurrentMessageList(global) || {};\n\n const chatIds = (global.chats.listIds.active || []).slice(0, GLOBAL_STATE_CACHE_CHAT_LIST_LIMIT);\n const chatIdsToSave = chatIds.concat(currentChatId ? [currentChatId] : []);\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","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\n// @ts-ignore\nimport telegramLogoPath from '../../assets/telegram-logo.svg';\n// @ts-ignore\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 ]),\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 // @ts-ignore teact feature\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\nexport default (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","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\n// @ts-ignore\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","subscribeToWorker","platform","window","async","Promise","race","makeRequest","pause","then","Error","err","Date","now","startedAt","location","reload","args","callApi","fnName","name","warn","cancelApiProgress","progressCallback","isCanceled","postMessage","message","generateIdFor","payload","promise","Object","assign","pop","set","catch","finally","delete","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","openUserInfo","id","Link","focusMessage","handleMessageClick","chatId","openChat","groupCall","joinGroupCall","accessHash","renderActionMessageText","lang","actionOrigin","targetUsers","targetMessage","targetChatId","options","action","translationValues","amount","currency","call","textOptions","maxTextLength","processed","unprocessed","undefined","includes","processPlaceholder","formatCurrency","code","isEmbedded","origin","asPlain","isUserId","renderUserContent","chat","trimText","getChatTitle","renderText","renderChatContent","renderOriginContent","map","user","filter","getMessageSummaryText","photo","video","sticker","getMessageContent","showQuotes","messageText","isGif","renderMessageContent","invoice","renderProductContent","renderMigratedContent","trim","renderGroupCallContent","getUserFullName","placeholder","replaceValue","placeholderPosition","substring","Array","isArray","forEach","index","RE_LETTER_OR_DIGIT","SIMPLE_MARKDOWN_REGEX","part","filters","params","reduce","textParts","divEl","createElement","result","innerText","innerHTML","escapeHtml","EMOJI_REGEX","replaceEmojis","addLineBreaks","highlight","lowerCaseText","toLowerCase","queryPosition","nextSymbol","newParts","links","RE_LINK","nextLink","shift","lastIndex","startsWith","username","endsWith","addLinks","replaceSimpleMarkdown","size","IS_EMOJI_SUPPORTED","parts","fixNonStandardEmoji","emojis","emojiResult","emoji","nativeToUnified","removeVS16s","src","alt","splittenParts","line","source","trimmedLine","trimLeft","indentLength","repeat","RE_LINK_TEMPLATE","RE_MENTION_TEMPLATE","entities","entityResult","entity","preventMessageInputBlur","withBubbling","IS_IOS","activeElement","EDITABLE_INPUT_ID","currentTarget","preventMessageInputBlurWithBubbling","withGlobal","global","userId","userOrChat","selectUser","openChatByUsername","ref","onContextMenu","onMouseDown","onMouseEnter","onMouseLeave","onFocus","color","backgroundImage","round","pill","fluid","isText","isLoading","ariaLabel","download","disabled","ripple","faded","tabIndex","withClickPropagation","elementRef","useRef","isClicked","setIsClicked","useState","fullClassName","setTimeout","handleMouseDown","style","label","subLabel","checked","blocking","onChange","onCheck","useLang","handleChange","event","trigger","positionX","positionY","footer","forceOpen","onOpen","onClose","menuRef","dropdownRef","isOpen","setIsOpen","onKeyDown","menu","current","keyCode","focusedElement","elementChildren","from","focus","onTrigger","containerRef","autoClose","shouldSkipTransition","success","readOnly","autoComplete","inputMode","maxLength","onInput","onKeyPress","onBlur","onPaste","labelText","htmlFor","withBackground","menuStyle","noCloseOnBackdrop","onCloseAnimationEnd","backdropContainerRef","transitionClassNames","useShowTransition","useEffect","captureEscKeyListener","useHistoryBack","useEffectWithPrevDeps","prevIsOpen","dispatchHeavyAnimationEvent","handleKeyDown","useKeyboardListNavigation","useVirtualBackdrop","bubbleClassName","props","icon","destructive","stopPropagation","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_CHAT_LIST_LIMIT","GLOBAL_STATE_CACHE_USER_LIST_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","ALL_CHATS_PRELOAD_DISABLED","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","Set","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","MEMOJI_STICKER_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","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","SEEN_BY_MEMBERS_CHAT_MAX","SEEN_BY_MEMBERS_EXPIRE","GROUP_CALL_VOLUME_MULTIPLIER","GROUP_CALL_DEFAULT_VOLUME","ENABLE_THUMBNAIL_VIDEO","cb","dependencies","debugKey","prevDeps","usePrevious","initial","setValue","setTrigger","ANIMATION_START_EVENT","ANIMATION_END_EVENT","timeout","isAnimating","handleAnimationStart","handleAnimationEnd","removeEventListener","isHeavyAnimating","duration","onEnd","clearTimeout","dispatchEvent","Event","LOCATION_HASH","hash","PATH_BASE","pathname","search","historyState","currentIndex","nextStateIndexToReplace","isHistoryAltered","isDisabled","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","some","d","next","shouldSkipUndefined","onCloseTransitionEnd","noOpenTransition","noCloseTransition","setIsClosed","closeTimeoutRef","hasOpenClassName","setHasOpenClassName","shouldHaveOpenClassName","isClosing","shouldRender","handleEvent","contains","classList","NON_BUBBLEABLE_EVENTS","delegationRegistry","delegatedEventsByElement","documentEventCounters","propName","handler","asCapture","eventName","resolveEventName","canUseEventDelegation","resolveDelegationRegistryForName","existing","newSet","resolveDelegatedEventsForElement","add","addDelegatedListener","removeDelegatedListener","tagName","realEventName","has","removeAllDelegatedListeners","eventNames","realEvent","events","furtherCallsPrevented","Proxy","p","Reflect","body","parentNode","FILTERED_ATTRIBUTES","HTML_ATTRIBUTES","MAPPED_ATTRIBUTES","autoPlay","headsByElement","renderWithVirtual","parentEl","$current","$new","$parent","skipComponentUpdate","forceIndex","fragment","moveDirection","isComponentElement","hasElementChanged","componentInstance","renderComponent","updateComponent","isMounted","setupComponentUpdateListener","initComponent","node","createNode","setTarget","childNodes","insertBefore","appendChild","removeChild","getTarget","unmountTree","replaceChild","areComponents","isRealElement","nextSibling","currentKeys","keys","newKeys","key","currentValue","newValue","cssText","removeAttribute","setAttribute","updateAttributes","currentEl","teactFastList","$newChild","currentRemainingIndex","remainingByKey","acc","$currentChild","isKeyPresent","newChildKey","$element","order","teactOrderKey","fragmentQueue","fragmentIndex","newChildren","currentPreservedIndex","currentChildInfo","concat","flushFragmentQueue","shouldMoveNode","isMovingDown","renderFastListChildren","max","createDocumentFragment","renderChildren","mountComponent","$firstChild","isEmptyElement","createTextNode","isTextElement","tag","$child","$fragmentChild","__html","render","headId","getAttribute","$head","VirtualElementTypesEnum","Fragment","Symbol","renderingInstance","Empty","Text","isTagElement","Tag","Component","flatten","parsedChildren","hooks","cursor","byCursor","effects","memos","buildComponentElement","createComponentInstance","dropEmptyTail","buildChildElement","buildTagElement","isEmptyPlaceholder","child","DEBUG_components","newRenderedValue","DEBUG_startAt","componentName","renderCount","renderTimes","performance","handleError","renderedValue","newChild","$old","hook","cleanup","effect","nextValue","setter","helpGc","prepareComponentForFrame","prepareForFrame","throttleWithPrimaryRaf","throttleWithRaf","forceUpdateComponent","currentElement","DEBUG_contentComponentName","useLayoutEffectBase","schedulerFn","primarySchedulerFn","execCleanup","exec","dependency","causedBy","res","prevValue","fastRaf","fastRafPrimary","useLayoutEffect","onTickEnd","onTickEndPrimary","resolver","getUnequalProps","newCallback","areEqual","arePropsShallowEqual","propsRef","renderedRef","orderBy","values","React","currentGlobal","reducers","callbacks","containers","mapStateToProps","ownProps","mappedProps","newMappedProps","Number","isNaN","DEBUG_componentName","areMappedPropsChanged","DEBUG_updates","updateTime","actions","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","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","collectChats","allowedUsers","allowedChats","blockedUsers","blockedChats","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","selectNotifySettings","setLanguage","onUpdateApiReady","wasAuthReady","authState","authorizationState","isLoggingOut","authIsCodeViaApp","isCodeViaApp","authHint","hint","authQrCode","qrCode","lastSyncTime","onUpdateAuthorizationState","onUpdateAuthorizationError","sync","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","startWebsync","IS_ANDROID","IS_MAC_OS","IS_SAFARI","uiReadyState","remove","authPhoneNumber","shouldSkipHistoryAnimations","replaceThemeSettings","FOREVER_BANNED_DATE","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","getChatOrder","joinDate","draftDate","date","isChatArchived","folderId","selectIsChatMuted","notifySettings","notifyExceptions","isMuted","hasPrivateChatsNotifications","hasBroadcastNotifications","hasGroupNotifications","selectShouldShowMessagePreview","hasPrivateChatsMessagePreview","hasBroadcastMessagePreview","hasGroupMessagePreview","getCanDeleteChat","prepareFolderListIds","allListIds","folder","excludedChatIds","includedChatIds","pinnedChatIds","active","archived","isListed","unreadMentionsCount","excludeArchived","excludeRead","unreadCount","hasUnreadMark","excludeMuted","userType","isContact","bots","contacts","nonContacts","channels","groups","filterChatFolder","prepareChatList","listIds","orderedPinnedIds","folderType","noOrder","listIdsSet","orderedPinnedIdsSet","pinnedChats","checkChat","otherChats","reduceChatList","chatArrays","filteredIds","filteredIdsSet","getFolderUnreadDialogs","hasActiveDialogs","unreadDialogsCount","isUnread","getFolderDescriptionText","emoticon","description","pinnedIds","getFolderChatsCount","getMessageSenderName","getUserFirstOrLastName","sortChatIds","chatIds","shouldPrioritizeVerified","priorityIds","priority","isVerified","filterChatsByName","query","searchWords","prepareSearchWordsForNeedle","CONTENT_NOT_SUPPORTED","getMessageKey","msgId","buildMessageKey","parseMessageKey","getMessageOriginalId","previousLocalId","noEmoji","audio","voice","contact","poll","truncatedText","substr","groupedId","performer","getMessageAudioCaption","summary","question","getMessageText","webPage","getMessageCustomShape","isRound","parseEmojiOnlyString","getMessageSingleEmoji","getFirstLinkInMessage","link","find","offset","isOwnMessage","isOutgoing","isReplyMessage","replyToMessageId","isForwardedMessage","forwardInfo","isActionMessage","isServiceNotificationMessage","isAnonymousOwnMessage","senderId","getSenderTitle","getSendingState","sendingState","isMessageLocal","isHistoryClearMessage","getMessageContentFilename","isAnimated","isWebpSupported","baseFilename","IS_OPUS_SUPPORTED","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","reverse","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","sortUserIds","userIds","userStatusesById","getServerTime","expires","filterUsersByName","getUserIdDividend","abs","getUserColorKey","peer","replaceChatListIds","newIds","updateChatListIds","idsUpdate","replaceChats","newById","updateChat","chatUpdate","updatedChat","getUpdatedChat","updatedById","addChats","isUpdated","addedById","isMin","shouldOmitMinInfo","omit","photos","updateChatListType","listType","currentListIds","listTypeKey","currentFolderList","updateChatListSecondaryInfo","info","totalCountKey","totalChatCount","isFullyLoaded","leaveChat","leftChatId","selectChatListType","listId","updateCurrentMessageList","shouldReplaceHistory","messageLists","newMessageLists","replaceChatMessages","updateMessageStore","byChatId","threadsById","replaceThreadParam","paramName","threadUpdate","updateThread","addMessages","addedByChatId","messagesByChatId","addChatMessagesById","selectChatMessages","every","newId","updateChatMessage","messageUpdate","updatedMessage","updateScheduledMessage","selectScheduledMessages","replaceScheduledMessages","deleteChatMessages","deletedForwardedPosts","pickTruthy","isLinkedChannelPost","threadInfo","selectThreadInfo","selectListedIds","outlyingIds","selectOutlyingIds","viewportIds","selectViewportIds","selectPinnedIds","newMessageCount","messagesCount","currentMessageList","selectCurrentMessageList","canDeleteCurrentThread","currentThreadId","fromChatId","fromMessageId","originalPost","selectChatMessage","deleteChatScheduledMessages","scheduledIds","selectScheduledIds","updateListedIds","orderHistoryIds","updateOutlyingIds","sort","a","b","addViewportId","safeReplaceViewportIds","newViewportIds","currentIds","updateThreadInfo","newThreadInfo","updateThreadInfos","updates","scheduledMessages","updateScheduledMessages","updateFocusedMessage","noHighlight","isResizingContainer","focusedMessage","updateSponsoredMessage","sponsoredByChatId","updateFocusDirection","direction","enterMessageSelectMode","selectedMessages","prototype","toggleMessageSelection","messageListType","childMessageIds","withShift","oldSelectedMessages","selectMessageIdsByGroupId","selectedMessageIds","newMessageIds","newSelectedMessageIds","selectCurrentMessageIds","prevIndex","min","to","unique","exitMessageSelectMode","updateThreadUnreadFromForwardedMessage","originMessage","lastMessageId","isDeleting","channelPostId","threadInfoOld","updateStickerSets","category","sets","resultIds","updatedSets","stickerSet","stickers","setsById","setIds","updateStickerSet","stickerSetId","currentStickerSet","updateGifSearch","isNew","results","nextOffset","currentResults","gifs","newResults","gif","replaceAnimatedEmojis","animatedEmojis","updateStickersForEmoji","remoteStickers","allStickers","selectStickersForEmoji","uniqueIds","forEmoji","rebuildStickersForEmoji","replaceUsers","updateContactList","updatedUsers","contactUserIds","contactList","newContactUserIds","userUpdate","updatedUser","getUpdatedUser","updateUsers","updateSelectedUserId","selectedId","deleteUser","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","updateGlobalSearchFetchingStatus","prevFoundIds","newFoundIds","foundOrPrevFoundIds","nextOffsetId","replaceLocalTextSearch","chatThreadKey","searchParams","localTextSearch","byChatThreadKey","updateLocalTextSearch","replaceLocalTextSearchResults","updateLocalTextSearchResults","orderFoundIds","replaceLocalMediaSearch","localMediaSearch","updateLocalMediaSearchType","currentType","updateLocalMediaSearchResults","replaceLocalMediaSearchResults","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","selectChat","selectChatUser","selectIsChatWithSelf","selectIsChatWithBot","selectSupportChat","isSupport","selectChatOnlineCount","members","onlineCount","selectChatBot","selectIsChatBotNotStarted","bot","messageInfo","selectAreActiveChatsLoaded","selectIsChatListed","targetList","list","selectChatFolder","chatFolders","selectIsChatPinned","chatFoldersById","selectChatByUsername","usernameLowered","selectCountNotMutedUnread","activeChatIds","selectNotifyExceptions","selectIsServiceChatReady","selectSendAs","sendAsId","selectCurrentStickerSearch","selectCurrentGifSearch","selectStickerSet","selectStickerSetByShortName","shortName","stickerSets","stickersForEmoji","packs","selectAnimatedEmoji","cleanedEmoji","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","selectOutgoingStatus","isScheduledList","lastReadOutboxMessageId","selectIsMessageUnread","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","favorite","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","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","selectSponsoredMessage","expiresAt","selectCurrentTextSearch","currentSearch","selectCurrentMediaSearchPeerId","currentProfileUserId","selectCurrentMediaSearch","peerId","selectManagement","selectCurrentManagementType","selectIsMediaViewerOpen","mediaViewer","avatarOwnerId","selectRightColumnContentKey","isChatInfoShown","newChatMembersProgress","isAddingChatMembersShown","NewChatMembersProgress","isPollResults","pollResults","selectIsPollResultsOpen","isSearch","IS_SINGLE_COLUMN_LAYOUT","isManagement","currentManagement","selectCurrentManagement","isStickerSearch","isGifSearch","currentChatId","areActiveChatsLoaded","isUserInfo","isChatInfo","RightColumnContent","selectIsRightColumnShown","shouldUseSystemTheme","getSystemTheme","selectCurrentGlobalSearchQuery","selectPaymentChatId","selectPaymentMessageId","selectPaymentFormId","formId","selectPaymentRequestId","selectProviderPublishableKey","nativeParams","publishableKey","selectStripeCredentials","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","setAppBadge","currentProps","newProps","currentKeysLength","prop","self","caches","Type","fetch","cacheName","isHtmlAllowed","request","Request","cache","open","headers","Blob","blob","shouldRecreate","resolvedType","Json","json","save","cacheData","Response","put","clear","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","getDayStart","datetime","getDayStartAt","toYearMonth","timestamp","getFullYear","getMonth","toIsoString","hours","getHours","marker","padStart","getMinutes","formatPastTimeShort","weekAgo","getDay","withYear","format","formatDate","formatMonthAndYear","isShort","formatHumanDate","noWeekdays","isUpperFirst","upperFirst","lowerFirst","weekAhead","weekDay","day","monthIndex","formatMediaDateTime","formatMediaDuration","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","MILLISECONDS_IN_DAY","str","EXCLUDE_EMOJIS","EMOJI_EXCEPTIONS","unifiedToNative","unified","codePoints","parseInt","fromCodePoint","regex","replacement","pairs","uncompressEmoji","emojiData","categories","emojiRaw","names","native","image","isoToEmoji","iso","test","c","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","totalPrice","Intl","NumberFormat","store","random","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","SHIPPING_ERRORS","getReadableErrorText","isSlowMode","textParams","extraPartIndex","errorMessage","handleErrorEvent","ErrorEvent","reason","throttle","alert","collection","member","mapValues","newByKey","object","stringKeys","orderRule","mode","compareValues","currentOrderRule","isAsc","aValue","bValue","mode1","mode2","orderRule1","orderRule2","isAsc1","isAsc2","array","compact","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","createCallbackManager","currentLangCode","currentTimeFormat","getTranslation","cacheValue","cached","langString","processTranslation","importFallbackLangPack","getTranslationForLangString","translateString","remoteLangPack","remote","fetchRemoteString","withFallback","newLangPack","sourceLangPacks","fetchRemote","langInfo","rtl","default","template","optionIndex","getPluralOption","translationSlices","initialValue","processTemplate","formatInteger","SAMPLE_RATE","oggToWav","opusData","arrayBuffer","typedArray","decoderWorker","wavWorker","onmessage","command","buffers","buffer","page","terminate","wavBitDepth","wavSampleRate","decoderSampleRate","outputBufferSampleRate","pages","asCacheApiType","memoryCache","fetchPromises","progressCallbacks","cancellableCallbacks","mediaFormat","onProgress","callbackUniqueId","progressiveUrl","getProgressive","mediaPng","webpToPng","prepared","prepareMedia","mediaSource","MediaSource","streamUrl","sourceBuffer","addSourceBuffer","makeOnProgress","revokeObjectURL","fetchFromCacheOrRemote","activeCallbacks","getFromMemory","cancelProgress","parentCallback","endOfStream","appendBuffer","mediaData","serviceWorker","fullSize","controller","Bundles","LOAD_PROMISES","MEMORY_CACHE","Auth","Main","Extra","Calls","handleBundleLoad","bundle","listeners","listener","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","senderName","getNotificationContent","imageHash","mediaLoader","getAvatar","badge","vibrate","onclick","close","onshow","closeMessageNotifications","notifyClientReady","PATTERN_PLACEHOLDER","DEFAULT_PATTERN","getCountryCodesByIso","phoneCodeList","country","iso2","getCountryFromPhoneNumber","possibleCountries","countryCode","bestMatches","prefixes","prefix","formatPhoneNumber","pattern","numberWithoutCode","patterns","defaultPattern","stripped","getBestPattern","formatPhoneNumberWithCode","numberWithPlus","createMessageHash","messageList","parseLocationHash","typeOrThreadId","isType","fn","shouldRunFirst","shouldRunLast","waitingTimeout","interval","isPending","_args","setInterval","clearInterval","throttleWith","waiting","onIdle","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","intervalId","tryIdb","onupgradeneeded","createObjectStore","txMode","db","transaction","objectStore","createStore","DC_IDS","hasStoredSession","withLegacy","userAuthJson","dcID","dcId","removeItem","sessionId","sessionJson","customStore","idb","idbKeys","items","openCursor","continue","eachCursor","isInitialized","HEX_COLOR_REGEX","RGB_VARIABLES","lerp","start","end","interpolationRatio","colors","themeColors","property","hexToRgb","withAnimation","isDarkTheme","shouldAnimate","startIndex","endIndex","startAt","themeColorTag","querySelector","applyColorAnimationStep","transition","hex","r","g","propertyColors","formatFixedNumber","formatIntegerCompact","views","getFirstLetters","phrase","count","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","version","saveSync","IS_LANDSCAPE","isLandscape","initialHeight","windowSize","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","register","hasErrorKey","INITIAL_STATE","isLeftColumnShown","phoneCodes","general","groupCalls","activeChatFolder","recentEmojis","added","recent","greeting","featured","emojiKeywords","saved","inlineBots","byUsername","topPeers","topInlineBots","audioPlayer","playbackRate","notifications","dialogs","messageSendKeyCombo","autoLoadFileMaxSizeMb","shouldSuggestStickers","light","isBlurred","patternColor","dark","shouldShowContextMenuHint","updateCacheThrottled","updateCache","unsubscribeFromBeforeUnload","isCaching","setupCaching","clearCaching","reducedGlobal","reduceShowChatInfo","reduceUsers","reduceChats","reduceMessages","recentlyFoundChatIds","reduceSettings","reduceChatFolders","reduceGroupCalls","idsToSave","newListIds","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","telegramLogoPath","authCode","monkeyPath","authPassword","background","backgroundColor","hasCustomBackground","hasCustomBackgroundColor","isRightColumnShown","leftColumnWidth","setIsUiReady","isReady","markReady","useFlag","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","fill","colorStops","createLinearGradient","apply","createRadialGradient","addColorStop","A","minVersion","maxVersion","ecLevel","radius","quiet","HTMLCanvasElement","clearRect","write","S","multiply","L","M","Q","returnToAuthPhoneNumber","qrCodeRef","token","isMobile","AuthQrCode","appInactivePath","renderMain","disconnect","isInactive","markInactive","TeactDOM"],"sourceRoot":""}