tweb/public/53.0848e83cc329eb6130be.chu...

1 line
63 KiB
Plaintext

{"version":3,"file":"53.0848e83cc329eb6130be.chunk.js","mappings":"wIAQe,MAAMA,UAAuB,IAC1CC,YAAYC,GAIVC,MAAM,OAAD,QACHC,WAAW,GACRF,IAGL,MAAMG,EAAQC,KAAKD,MACnBA,EAAME,KAAO,MACbF,EAAMG,aAAa,WAAY,IAC/BH,EAAMI,aAAe,MAErB,IAAIC,EAAa,EACjBJ,KAAKD,MAAMM,iBAAiB,SAAUC,IACpCN,KAAKD,MAAMQ,UAAUC,OAAO,SAC5BR,KAAKS,WAEL,MAAMC,EAAQV,KAAKU,MAAMC,QAAQ,MAAO,IAAIC,MAAM,EAAGhB,EAAQiB,QAC7Db,KAAKc,iBAAiBJ,GAEtB,MAAMG,EAASb,KAAKU,MAAMG,OAC1B,GAAGA,IAAWjB,EAAQiB,OACpBjB,EAAQmB,OAAOf,KAAKU,YACf,GAAGG,IAAWT,EACnB,OAGFA,EAAaS,Q,oHCtBnB,IAmBIG,EAnBAC,GAAM,EAqBK,SAASC,EAAwBC,GAC3CF,IAnBAD,IACIA,EAAgB,gBAAuBI,MAAKC,GAC9CA,EAAOC,sBAAwB,gCAGzBC,QAAQC,IAAI,CACjBH,EACA,qBAAgBA,EAAOC,oBAAqB,CAAC,6BAC7C,+BAGK,OASDF,MAAK,EAAEC,EAAQI,MACvB,IAAIJ,EACF,OAGF,MAAMK,EAA2B,GACjCD,EAAQE,SAAQC,IACd,MAAMC,EAAe,sBAAiBD,EAAOE,KACzCD,IAIJH,EAAOK,KAAKF,GACZ,sBAAiBD,EAAOE,IAAoBF,OAG9C,MAAMI,GAAoB,OAAO,4DAA6D,CAACC,KAAM,6BACrGD,EAAkBE,iBAAiB3B,UAAUC,OAAO,SACpD,SAAYY,MAAK,KACfe,OAAOC,uBAAsB,KAC3BjB,EAASkB,OAAOL,SAIpB,2BAA2B,mBAAmB,KAC5CA,EAAkBxB,WACjB,CAAC8B,MAAM,IAEVZ,EAAOC,SAAQC,IACb,sBAAiBA,EAAOE,IAAoBF,OAG9C,QAAiBI,GAAoB1B,KACnC,OAAYA,GAEZW,GAAM,EAENe,EAAkBO,UAAW,GAC7B,QAAaP,GAEb,sBAAiBX,EAAOC,6B,8CCrEf,MAAMkB,EAWnB7C,YAAsB8C,EAAkCC,GAAlC,KAAAD,WAAAA,EAAkC,KAAAC,KAAAA,EAR9C,KAAAC,IAAM,GACN,KAAAC,UAAY,EAQpB5C,KAAK6C,UAAYC,SAASC,cAAc,OACxC/C,KAAK6C,UAAUtC,UAAUyC,IAAI,yBAE7B,MAAMjD,EAAQ0C,EAAW1C,MAEzBA,EAAMM,iBAAiB,QAAQ,KAC7BL,KAAKiD,cAAc,MAGrBlD,EAAMM,iBAAiB,SAAUC,IAC/BN,KAAKiD,cAAcR,EAAW/B,MAAMG,WAUjCoC,cAAcpC,GACnB,IAAIb,KAAKkD,UAAW,OAGpB,IAAIC,GADJtC,EAASuC,KAAKC,IAAIxC,EAAQ,MAGxBsC,EAAQC,KAAKE,MAAMF,KAAKC,IAAIrD,KAAK2C,IAAK9B,IAAW,IAAMb,KAAK2C,KAAO,OAEhE3C,KAAKuD,gBACNvD,KAAKuD,cAAcC,MAAK,GACxBxD,KAAKuD,cAAcE,OAAOC,MAAMC,QAAU,QAG5C3D,KAAKkD,UAAUO,OAAOC,MAAMC,QAAU,IAYtCR,EAAQ,EAIV,MAAMS,EAAY5D,KAAK4C,UAAYO,GAAS,EAAI,EAGhDnD,KAAKkD,UAAUW,aAAaD,GACN,IAAnB5D,KAAK4C,WAA6B,IAAVO,GACzBnD,KAAKkD,UAAUY,SAAS,GAI1B9D,KAAK4C,UAAYO,EAEjBnD,KAAKkD,UAAUa,OAMVC,OACL,OAAGhE,KAAKiE,YAAoBjE,KAAKiE,YAC1BjE,KAAKiE,YAAc1C,QAAQC,IAAI,CACpC,yBAAkC,CAChCqB,UAAW7C,KAAK6C,UAChBqB,MAAM,EACNC,UAAU,EACVC,MAAOpE,KAAK0C,KACZ2B,OAAQrE,KAAK0C,MACZ,4BAA4BtB,MAAK8B,IAClClD,KAAKuD,cAAgBL,EAGjBlD,KAAKyC,WAAW/B,MAAMG,QACxBqC,EAAUa,OAGL,sBAA+Bb,MAGxC,yBAAkC,CAChCL,UAAW7C,KAAK6C,UAChBqB,MAAM,EACNC,UAAU,EACVC,MAAOpE,KAAK0C,KACZ2B,OAAQrE,KAAK0C,MACZ,gCAAgCtB,MAAKkD,IACtCtE,KAAKkD,UAAYoB,EAEbtE,KAAKyC,WAAW/B,MAAMG,SACxBb,KAAKkD,UAAUO,OAAOC,MAAMC,QAAU,QAGxC3D,KAAKkD,UAAU7C,iBAAiB,cAAckE,KAIX,IAA7BvE,KAAKkD,UAAUU,WAAmBW,GAAgBvE,KAAK4C,YAC1B,IAA9B5C,KAAKkD,UAAUU,WAAoBW,GAAgBvE,KAAK4C,aACzD5C,KAAKkD,UAAUY,SAAS,GACxB9D,KAAKkD,UAAUsB,SAGG,IAAjBD,GAAyC,IAAnBvE,KAAK4C,WAGzB5C,KAAKuD,gBACNvD,KAAKuD,cAAcE,OAAOC,MAAMC,QAAU,GAC1C3D,KAAKuD,cAAcQ,OACnB/D,KAAKkD,UAAUO,OAAOC,MAAMC,QAAU,WAMrC,sBAA+BW,QAKrC9D,SACFR,KAAKkD,WAAWlD,KAAKkD,UAAU1C,SAC/BR,KAAKuD,eAAevD,KAAKuD,cAAc/C,Y,eCtJ/B,SAASiE,EAASC,EAA+BC,GAC9D,MAAMC,EAAMF,EAAO7D,OACnB,GAAG+D,IAAQD,EAAO9D,OAChB,OAAO,EAGT,IAAI,IAAIgE,EAAI,EAAGA,EAAID,IAAOC,EACxB,GAAGH,EAAOG,KAAOF,EAAOE,GACtB,OAAO,EAIX,OAAO,E,iCCZM,SAASC,EAAgBC,EAAaC,GACnD,OAAGA,EACMD,EAAIpE,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,OAAQ,IAE5DoE,EAAIpE,QAAQ,KAAM,KAAKA,QAAQ,KAAM,K,mFCoDhD,MAAMsE,EAAoB,IAvCnB,MAYLtF,cAQEK,KAAKkF,iBAAmB,EAMxB,QAAmB,sBAAsB9D,MAAM+D,IAC1CA,IACDnF,KAAKkF,iBAAmBC,MAK5B,oBAA2B,yBAA0BC,IACnDpF,KAAKkF,iBAAmBE,EAAKC,aAMnC,OAAmB,uBAAmCJ,GACtD,W,mJCxCA,IAIIK,EAJAC,EAAsC,KAEtCC,EAAiC,KACjCC,EAAwC,KAgH5C,MAAMC,EAAO,IAAI,IAAK,iBAAiB,GA7GpB,KACjB,MAAMC,EAAcJ,EAAStF,KAA8CY,OAErE+E,EAAiB,IAAI,IAAe,CACxCC,MAAO,OACPC,MAAM,SACNjF,OAAQ8E,EACR5E,OAASgF,IACPC,EAAWD,MAIfT,EAAYM,EAAe7F,MAE3B2F,EAAKO,OAAOC,cAAc,kBAAkB7D,OAAOuD,EAAe/C,WAE/C6C,EAAKO,OAAOC,cAAc,eAElC7F,iBAAiB,SAAS,WACnC,OAAO,qBAGT,MAAM8F,EAAU,KACdC,YAAW,KACTC,EAAO7F,WACN,MAGCwF,EAAcD,IAClBT,EAAUpF,aAAa,WAAY,QAEnC,MAAMoG,EAAqB,CACzBC,aAAchB,EAASgB,aACvBC,gBAAiBjB,EAASiB,gBAC1BC,WAAYV,GAKd,cAAqB,cAAeO,EAAQ,CAACI,cAAc,IAC1DtF,MAAMuF,IAGL,OAAOA,EAASC,GACd,IAAK,qBACH,YAAmBD,EAASE,MAE5B,8BAAmBzF,MAAK0F,IACtBA,EAAEC,QAAQC,WAEZb,IACA,MACF,IAAK,mCAGH,sDAAuB/E,MAAK0F,IAC1BA,EAAEC,QAAQC,MAAM,CACd,aAAgBzB,EAASgB,aACzB,gBAAmBhB,EAASiB,qBAIhCL,QAMHc,OAAYC,IAAQ,O,OAAD,E,OAAA,E,EAAA,YACpB,IAAIC,GAAO,EACX,OAAOD,EAAIjH,MACT,IAAK,0BAEHkH,GAAO,EACPD,EAAIE,SAAU,cACD,+BAA0BL,QAAQC,QAC/CZ,YAAW,KACTd,EAAU5E,MAAQ,KACjB,KACH,MACF,IAAK,qBACH4E,EAAU/E,UAAUyC,IAAI,UACxB,OAAe4C,EAAeC,OAAO,IAAAwB,MAAK,uBAC1C,MACF,IAAK,mBACL,IAAK,qBACH/B,EAAU/E,UAAUyC,IAAI,UACxB,OAAe4C,EAAeC,OAAO,IAAAwB,MAAK,uBAC1C,MACF,QACEzB,EAAeC,MAAMyB,UAAYJ,EAAIjH,KAIrCkH,GACFvB,EAAe2B,SAGjBjC,EAAUkC,gBAAgB,a,YA9BN,K,kRAkClBC,EAAW/B,EAAKO,OAAOC,cAAc,eACrCxD,EAAO,cAAsB,IAAM,IACnC2D,EAAS,IAAI,IAAeT,EAAgBlD,GAElD,OADA+E,EAASpF,OAAOgE,EAAOxD,WAChBwD,EAAOrC,UAG4C0D,IAG1D,GAFAnC,EAAWmC,EAEPlC,EAGG,CACLF,EAAU5E,MAAQ,GAElB,MAAMiH,EAAM7E,SAAS8E,YAAY,cACjCD,EAAIE,UAAU,SAAS,GAAO,GAC9BvC,EAAUwC,cAAcH,QAPxBnC,EAAgBE,EAAKO,OAAO8B,uBAAuB,SAAS,GAC5DtC,EAAkBC,EAAKO,OAAO8B,uBAAuB,aAAa,GAUpE,IAAIjG,EAAkBkG,EACtB,OAFAxC,EAAc8B,UAAY/B,EAASgB,aAE5BhB,EAAStF,KAAK2G,GACnB,IAAK,uBACH9E,EAAM,qBACN,MACF,IAAK,uBACHA,EAAM,uBACN,MACF,IAAK,wBACHA,EAAM,sBACN,MACF,QACEA,EAAM,yBACNkG,EAAO,CAACzC,EAAStF,KAAK2G,IAI1B,OAAenB,GAAiB,IAAA4B,MAAKvF,EAAKkG,IAE1C,sBAA4B,YAAa,CAACpB,EAAG,oBAAqBqB,SAAUP,OAC3E,KACDpC,EAAU4C,WAGZ,K,gYChIA,IAAuCC,EAAnCC,EAA6B,KAgdjC,MAAM1C,EAAO,IAAI,IAAK,aAAa,GA9chB,KAmBjB,MAAM2C,EAAe,KACnBC,EAAY,gCACJC,IAAU,MAAC,QAAe,QAAd,EAAAA,EAAQC,cAAM,eAAEC,WACnCC,MAAK,CAACC,EAAGC,KAAOD,EAAE7C,MAAQ6C,EAAEE,cAAcC,cAAcF,EAAE9C,MAAQ8C,EAAEC,iBAEvE,IAAIP,EAEJD,IAEA,2BAA2B,mBAAmB,KAC5CA,OAGF,MAAMU,EAAsC,IAAIC,IAEhD,IAAIC,EAAkCC,EAEtC,MAAMC,EAAerG,SAASC,cAAc,OAC5CoG,EAAa5I,UAAUyC,IAAI,iBAE3B,MAAMoG,EAAoB,IAAI,IAAW,CACvCvD,MAAO,6BACPC,MAAM,WAGRsD,EAAkBvG,UAAUtC,UAAUyC,IAAI,gBAE1C,MAAMqG,EAAeD,EAAkBrJ,MAGjCuJ,EAAgBxG,SAASC,cAAc,OAC7CuG,EAAc/I,UAAUyC,IAAI,iBAAkB,YAAa,QAE3D,MAAMuG,EAAYzG,SAASC,cAAc,QACzCwG,EAAUhJ,UAAUyC,IAAI,QAAS,cACjCoG,EAAkBvG,UAAUR,OAAOkH,GAEnC,MAAMC,EAAa1G,SAASC,cAAc,MAC1CuG,EAAcG,YAAYD,GAEX,IAAI,KAAWF,GAE9B,IAAII,EAAa,KACfA,EAAa,KAEbpB,EAAU3G,SAASgI,IACjB,MAAMC,GAAQ,QAAgBD,EAAEE,MAE1BC,EAA8B,GACpCH,EAAEI,cAAcpI,SAASqI,IACvB,MAAMC,EAAKnH,SAASC,cAAc,MAElC,IAAImH,EAAU,kBAAgCN,GAC9C,GAAG,IAAoB,CACrB,MAAMO,EAAYrH,SAASC,cAAc,QACzCoH,EAAUC,UAAYF,EACtBD,EAAG5H,OAAO8H,QAEVF,EAAGG,UAAYF,EAGjB,MAAMG,GAAK,IAAAhD,MAAKsC,EAAEd,cAClBwB,EAAGC,QAAQC,YAAcZ,EAAEd,aAC3BoB,EAAG5H,OAAOgI,GAEV,MAAMG,EAAO1H,SAASC,cAAc,QACpCyH,EAAKjK,UAAUyC,IAAI,cACnBwH,EAAKlD,UAAY,IAAM0C,EAAYS,aACnCR,EAAGR,YAAYe,GAEfV,EAAM/H,KAAKkI,GACXT,EAAWnH,OAAO4H,MAGpBlB,EAAM9H,IAAI0I,EAAEE,KAAMC,MAGpBN,EAAWnJ,iBAAiB,aAAcC,IACxC,GAAgB,IAAbA,EAAEoK,OACH,OAGF,MAAMC,GAAS,OAAUrK,EAAEqK,OAAQ,MACnCC,EAAsBD,MAIxBvB,EAAkBvG,UAAU4G,YAAYH,IAG1C,MAAMsB,EAAyBD,IAC7B,MAAMJ,EAAeI,EAAOE,WAAW,GAAmBP,QAAQC,YAC5DO,EAAYH,EAAOzE,cAA2B,eAAeoB,UAC7D0C,EAAcc,EAAUnK,QAAQ,MAAO,KAE7C,OAAe0I,GAAc,IAAAhC,MAAKkD,KAClC,OAAclB,EAAc,SAC5BJ,EAAsBX,EAAUyC,MAAKpB,GAAKA,EAAEd,eAAiB0B,IAC7DrB,EAA0BD,EAAoBc,cAAcgB,MAAKC,GAAgBA,EAAaP,eAAiBT,IAE/GiB,EAAcvK,MAAQuK,EAAcC,UAAYJ,EAChDK,IACA/E,YAAW,KACTgF,GAAMlD,SACN,OAAgBkD,IAAO,KACtB,IAKL,IAAIC,EAFJ3B,IAIAL,EAAahJ,iBAAiB,SAAS,SAAoCC,GACtEoJ,EACDA,IAEApB,EAAU3G,SAASgI,IACjBZ,EAAMuC,IAAI3B,EAAEE,MAAMlI,SAAQsI,GAAMA,EAAGvG,MAAMC,QAAU,QAIvD4H,aAAaF,GACbA,OAAcG,EAEdlC,EAAc/I,UAAUC,OAAO,QAC1B8I,EAAcmC,YACnBnC,EAAc/I,UAAUyC,IAAI,UAE5BoG,EAAkB7B,UAElB,OAAiB,CACf1E,UAAW6C,EAAKO,OAAOyF,cAAcA,cACrCC,QAAStC,EACTuC,SAAU,QACVC,OAAQ,IAGVzF,YAAW,KACL0F,IACFhJ,SAASzC,iBAAiB,YAAa0L,EAAa,CAACC,SAAS,IAC9DF,GAA2B,KAE5B,MAGL,IAAIA,GAA2B,EAC/B,MAAMC,EAAezL,KAChB,OAAgBA,EAAEqK,OAAQ,iBAG1BrK,EAAEqK,SAAWtB,IAIhB8B,IACArI,SAASmJ,oBAAoB,YAAaF,EAAa,CAACC,SAAS,IACjEF,GAA2B,IAGvBX,EAAa,UACEK,IAAhBH,IACH/B,EAAc/I,UAAUC,OAAO,UAC/B6K,EAAclJ,OAAOiE,YAAW,KAC9BkD,EAAc/I,UAAUyC,IAAI,QAC5BqI,OAAcG,IACb,OAQLnC,EAAahJ,iBAAiB,SAAUC,IACtC,MAAMwB,EAAMxB,EAAEwB,IACd,GAAGxB,EAAE4L,SAAmB,YAARpK,EAAmB,OAAO,EAG1C,IAAIqK,EAAS/C,EAAkB1I,MAAM0L,cACjCC,EAAyB,GAC7B/D,EAAU3G,SAASgI,IACjB,MAAM2C,EAAQ,CACZ3C,EAAE7D,KACF6D,EAAEd,aACFc,EAAEE,MAGJyC,EAAMC,OAAOC,SAAS7K,SAAQmE,IAC5B,MAAM2G,EAAO3G,EAAK4G,MAAM,KAAKH,QAAOI,GAAQ,KAAKC,KAAKD,KAAOE,KAAIF,GAAQA,EAAK,KAAIG,KAAK,IACpFL,EAAK5L,OAAS,GACfyL,EAAMvK,KAAK0K,MAIf,IAAItF,IAASmF,EAAMC,OAAOC,SAASzB,MAAKhG,IAA8C,IAAvCA,EAAIqH,cAAcW,QAAQZ,KAEzEpD,EAAMuC,IAAI3B,EAAEE,MAAMlI,SAAQsI,GAAMA,EAAGvG,MAAMC,QAAUwD,EAAO,GAAK,SAC5DA,GAAMkF,EAAQtK,KAAK4H,MAYQ,IAAnB0C,EAAQxL,OACnByH,EAAU3G,SAASgI,IACjBZ,EAAMuC,IAAI3B,EAAEE,MAAMlI,SAAQsI,GAAMA,EAAGvG,MAAMC,QAAU,QAE1B,IAAnB0I,EAAQxL,QAAwB,UAARiB,GAChC8I,EAAsB7B,EAAMuC,IAAIe,EAAQ,GAAGxC,MAAM,OAIrDN,EAAUlJ,iBAAiB,aAAa,SAAiCC,GACvEA,EAAE0M,cAAe,EACjB1M,EAAE2M,iBACC5D,EAAagD,QAAQ,UAAWhD,EAAa6D,OAC3C7D,EAAanB,WAGpB,MAAM+C,EAAgB,IAAI,IAAc,CACtCkC,QAAUC,IACR,wBAEA,MAAM,QAAC7E,EAAO,KAAExC,GAAQqH,GAAa,GACrC,IAAIC,EAAc9E,EAAUA,EAAQzC,MAAQyC,EAAQM,aAAe,GAChEwE,IAAgBjE,EAAkB1I,OAChCuI,GACAV,GACAxC,IACCkD,IAAwBV,GACxBW,EAAwBuB,eAAiB1E,EAAK0E,iBAIlD,OAAepB,EAAcd,GAAU,IAAAlB,MAAKkB,EAAQM,cAAuBwE,GAC3EpE,EAAsBV,EACtBW,EAA0BnD,GAIzBwC,GAAY0C,EAAcvK,MAAMG,OAAS,EAAK,EAC/CuH,EAAQ1E,MAAM4J,WAAa,GAE3BlF,EAAQ1E,MAAM4J,WAAa,YAK3BlC,GAAQH,EAAclL,MAE5BqL,GAAM/K,iBAAiB,YAAaC,IAElC,IAAI8H,EAAQ1E,MAAM4J,YAAuD,UAAVhN,EAAEwB,IAC/D,OAAOyL,QAQX,MAAMC,GAAsB,IAAI,IAAc,CAC5CvL,KAAM,mBACN6D,KAAM,cACN2H,YAAY,EACZC,SAAS,IAGXF,GAAoBzN,MAAMM,iBAAiB,UAAU,KACnD,MAAMsN,EAAaH,GAAoBE,QACvC,sBAA4B,aAAcC,GAE1C,kBAAyBA,GACzB,kBAAqCA,GACrC,kBAAyBA,GACzB,kBAA6BA,MAG/B,qBAA2BvM,MAAKwM,IAC1B,gCAIFJ,GAAoBE,QAAUE,EAAMD,YAHpCH,GAAoBE,SAAU,EAC9BF,GAAoB3H,MAAMtF,UAAUyC,IAAI,yBAM5CoF,GAAU,OAAO,gCAAiC,CAACnG,KAAM,eACzDmG,EAAQ1E,MAAM4J,WAAa,SAE3B,MAAMC,GAAYjN,IACbA,IACD,OAAYA,GAGd,MAAMuN,GAAS,OAAiB,CAA4BzF,EAASD,IAAQ,IAE7E,OAAeC,GAAS,IAAAf,MAAK,gBAC7B,QAAae,GAIb,IAAI7B,EAAe0E,EAAcvK,MACjC,cAAqB,gBAAiB,CACpC6F,aAAcA,EACduH,OAAQ,OACRC,SAAU,SACVC,SAAU,CACRpH,EAAG,kBAGJxF,MAAM2E,IAGP,8BAAyB3E,MAAK0F,GAAKA,EAAEC,QAAQC,MAAMiH,OAAOC,OAAOnI,EAAM,CAACQ,aAAcA,UACrFU,OAAMC,IACP2G,IAGO,yBADA3G,EAAIjH,MAEPgL,EAAckD,YACd,OAAelD,EAAcpF,OAAO,IAAAwB,MAAK,4BACzC+D,GAAM7K,UAAUyC,IAAI,UACpB,OAAeoF,GAAS,IAAAf,MAAK,iBAG7B+G,QAAQC,MAAM,uBAAwBnH,GACtCkB,EAAQd,UAAYJ,EAAIjH,WAMhC,QAAiBmI,EAASmF,IAE1BpF,GAAQ,OAAO,4DAA6D,CAAClG,KAAM,mBAGnFkG,EAAM9H,iBAAiB,SAAS,KAC9B,qBAsBF8I,EAAa9G,OAAO+G,EAAkBvG,UAAWoI,EAAcpI,UAAW2K,GAAoB3H,MAAOuC,EAASD,GAE9G,MAAMmG,GAAKxL,SAASC,cAAc,MAClCuL,GAAG/N,UAAUyC,IAAI,gBACjB,IAAAuL,OAAMD,GAAI,eAEV,MAAME,GAAW1L,SAASC,cAAc,OACxCyL,GAASjO,UAAUyC,IAAI,WAAY,gBACnC,IAAAuL,OAAMC,GAAU,mBAEhB9I,EAAKO,OAAOC,cAAc,cAAc7D,OAAOiM,GAAIE,GAAUrF,GAuDzD,EAAAsF,oBACFrI,YAAW,KACTgF,GAAMlD,UACL,IAGL,OAAwBiB,GA1DtB,cAAqB,qBAAqB/H,MAAMsN,I,MAC9C,MAAMC,EAAW,iBAA0B,YACxCA,KAA+B,QAAlB,EAAAA,EAASrG,iBAAS,eAAEsG,OAClC,sBAAiBD,EAASE,WAAWzN,MAAK,MACxC,OAAcgK,GAAO,YAIzB,MAAM0D,EAAM,IAAIC,IAAI,CAAC,EAAG,EAAG,EAAG,EAAG,IAC3BC,EAAiB,CAACN,EAAgBO,SAExC,IAAIC,EA+BJ,OA9BGR,EAAgBS,aAAeT,EAAgBO,UAChDC,EAAU,iBAAwBR,EAAgBS,YAAY/N,MAAK,KACjE4N,EAAKjN,KAAK2M,EAAgBS,iBAI7BD,GAAW3N,QAAQ6N,WAAWhO,MAAK,KAClC4N,EAAKrN,SAAQ0N,IACXP,EAAIQ,OAAOD,MAGb,MAAME,EAAO,IAAIT,GACXU,EAAI,KAA0B,O,OAAD,E,OAAA,E,EAAA,YACjC,MAAMH,EAAOE,EAAKE,QAClB,IAAIJ,EAAM,OAEV,MAAMK,EAAmB,KAAKL,aAE9B,SADkB,QAAmBK,GAEnC,OAAOF,IAGTpJ,YAAW,KACT,iBAAwBiJ,GAAkCM,QAAQH,KACjC,M,YAZF,K,+QAenCA,OAGKd,KACNtN,MAAMsN,IACHtF,EAAkB1I,MAAMG,QAAWoK,EAAcvK,MAAMG,QACzD+J,EAAsB7B,EAAMuC,IAAIoD,EAAgBnG,SAAS,UAkBV,KAClDH,KACD,OAAeA,GAAS,IAAAf,MAAK,gBAC7B,IAAAuI,QAAOxH,OAASoD,OAAWA,GAAW,GACtCpD,EAAQZ,gBAAgB,aAGvBW,GACDA,EAAMX,gBAAgB,YAGxB,sBAA4B,YAAa,CAACZ,EAAG,uBAG/C,K,mLCrfO,SAASiJ,EAAcC,GAC5B,OAAOA,EAAS,GACZA,EAAS,GACTA,EAAS,GACPA,EAAS,GACTA,EAAS,GACPA,EAAS,EACE,KAAXA,EACE,GACW,KAAXA,EACE,GACA,G,0SCNd,IAyNI9O,EACJ,MAAM,EAAO,IAAI,IAAK,eAAe,GAAM,IAClCA,IACN,KAEGA,IAAeA,EA9NS,OAAD,6BAC3B,MACMyG,EADc,EAAKxB,OACIC,cAAc,eAE3C,IAAI6J,GAAY,QAAatI,GAAU,GAEvC,MAAM0B,EAAerG,SAASC,cAAc,OAC5CoG,EAAa5I,UAAUyC,IAAI,iBAE3B,MAAMgN,GAAU,OAAO,4DAA6D,CAAC/N,KAAM,oBAC3FkH,EAAa9G,OAAO2N,IAEpB,OAAwB7G,GAExB,MAAMtG,EAAY4E,EAASiE,cAErB4C,EAAKxL,SAASC,cAAc,OAClC,IAAAwL,OAAMD,EAAI,kBAEV,MAAM2B,EAAWnN,SAASC,cAAc,MACxCkN,EAAS1P,UAAUyC,IAAI,kBACtB,CAAC,iBAAkB,iBAAkB,kBAAoCrB,SAASG,IACjF,MAAMmI,EAAKnH,SAASC,cAAc,MAClCkH,EAAG5H,QAAO,IAAAgF,MAAKvF,IACfmO,EAAS5N,OAAO4H,MAGlBpH,EAAUR,OAAOiM,EAAI2B,EAAU9G,GAE/B6G,EAAQ3P,iBAAiB,SAAS,KAChC,8DAAuBe,MAAK0F,GAAKA,EAAEC,QAAQC,UAC3CxD,GAAO,KAGT,MAGM0M,SAHgB3O,QAAQC,IAAI,CAChC,sCAE4B,GAAGuF,QAEjC,IAAIvD,GAAO,EACX2M,EAAA,yBAA2B,aAAa,KACtC3M,GAAO,EACPxC,EAAgB,OACf,CAACsB,MAAM,IAEV,IACI8N,EADAxQ,EAA6C,CAAC8G,cAAc,GAGhE,MAAM2J,EAAgBC,GAAoB,OAAD,6BACvC,IACE,IAAIC,QAAmB,cAAqB,wBAAyB,CACnEzC,OAAQ,OACRC,SAAU,SACVyC,WAAY,IACX,CAAC9J,cAAc,IAclB,GAZoB,6BAAjB6J,EAAW3J,IACRhH,EAAQyP,OACVzP,EAAQyP,KAAOkB,EAAWE,MAC1B,gBAAuBF,EAAWE,QAIpCF,QAAmB,cAAqB,wBAAyB,CAC/DG,MAAOH,EAAWG,OACjB9Q,IAGe,2BAAjB2Q,EAAW3J,EAAgC,CAC5C,MAAM+J,EAAgBJ,EAAWI,cAGjC,OAFA,YAAmBA,EAAc9J,MACjC,8BAAmBzF,MAAK0F,GAAKA,EAAEC,QAAQC,WAChC,EAOT,IAAIoJ,KAAc,EAAA3L,EAAA,GAAS2L,EAAWG,EAAWG,OAAQ,CACvDN,EAAYG,EAAWG,MAEvB,IAAIE,ED5GG,SAAuBC,GACpC,IAAIC,EACAC,EAAS,GAEb,IAAI,IAAIC,EAAOH,EAAMhQ,OAAQoQ,EAAU,EAAGC,EAAO,EAAGA,EAAOF,IAAQE,EACjEJ,EAAOI,EAAO,EACdD,GAAWJ,EAAMK,KAAU,KAAOJ,EAAO,IAC7B,IAATA,GAAcE,EAAOE,GAAS,IAC/BH,GAAUI,OAAOC,aACfvB,EAAcoB,IAAY,GAAK,IAC/BpB,EAAcoB,IAAY,GAAK,IAC/BpB,EAAcoB,IAAY,EAAI,IAC9BpB,EAAwB,GAAVoB,IAEhBA,EAAU,GAId,OAAOF,EAAOpQ,QAAQ,aAAc,KC0FhB0Q,CAAcd,EAAWG,OACnCY,EAAM,qBAAsB,EAAAxM,EAAA,GAAgB8L,GAAS,GAEzD,MAAMlN,EAAQvB,OAAOoP,iBAAiBzO,SAAS0O,iBACzCC,EAAe/N,EAAMgO,iBAAiB,mBAAmBC,OACzDC,EAAYlO,EAAMgO,iBAAiB,wBAAwBC,OAC3DE,EAAenO,EAAMgO,iBAAiB,mBAAmBC,OAEzDG,QAAgBC,MAAM,8BAC3B3Q,MAAK4Q,GAAOA,EAAI/P,SAChBb,MAAKa,IACJA,EAAOA,EAAKtB,QAAQ,gBAAiB,KAAKkR,OAC1C,MAAMI,EAAO,IAAIC,KAAK,CAACjQ,GAAO,CAAChC,KAAM,gCAGrC,OAAO,IAAIsB,SAAiB6N,IAC1B,MAAM+C,EAAS,IAAIC,WACnBD,EAAOE,OAAU/R,IACf8O,EAAQ9O,EAAEqK,OAAOoG,SAEnBoB,EAAOG,cAAcL,SAKnBM,EAAS,IAAIrC,EAAc,CAC/B9L,MAAO,IAAMjC,OAAOqQ,iBACpBnO,OAAQ,IAAMlC,OAAOqQ,iBACrBC,KAAMnB,EACNoB,MAAOZ,EACPa,YAAa,CACXC,MAAOhB,EACP3R,KAAM,WAER4S,qBAAsB,CACpB5S,KAAM,iBAER6S,aAAc,CACZC,UAAW,EACXlH,OAAQ,GAEVmH,kBAAmB,CACjBJ,MAAOnB,GAETwB,UAAW,CACTC,qBAAsB,OAO1B,IAAIhE,EAHJqD,EAAOlQ,OAAOoF,GACbA,EAAS0L,UAAgC5S,UAAUyC,IAAI,aAItDkM,EADCqD,EAAOa,gBACEb,EAAOa,gBAEP7R,QAAQ8R,KAAK,EACrB,EAAA7O,EAAA,GAAM,KACN,IAAIjD,SAAe6N,IACjBmD,EAAOe,QAAQC,OAAOlT,iBAAiB,QAAQ,KAC7C8B,OAAOC,uBAAsB,IAAMgN,QAClC,CAAC9M,MAAM,eAMV4M,EAAQ9N,MAAK,KACjB,GAAG2O,EAAW,CACZA,EAAUrM,MAAMR,UAAY,yBAE5B,MAAMyG,EAAIlC,EAAS+L,SAAS,GAC5B7J,EAAEjG,MAAMC,QAAU,OAClBgG,EAAEjG,MAAMR,UAAY,yBACpBkD,YAAW,KACTuD,EAAEjG,MAAMC,QAAU,KACjB,KAEHyC,YAAW,KACTuD,EAAEjG,MAAMR,UAAY,KACnB,KACH6M,OAAYvE,OAEZiI,MAAMC,KAAKjM,EAAS+L,UAAU5S,MAAM,GAAI,GAAGe,SAAQ0I,IACjDA,EAAG7J,eAMX,GAAG8P,EAAQ,CACT,IAAIqD,EAAYC,KAAKC,MAAQ,IACzBC,EAAOvD,EAAWwD,QAAUJ,EAAY1O,EAAA,yBAEtC,EAAAT,EAAA,GAAMsP,EAlLG,EAkLqB,IAAuB,IAAMA,EAAO,IAE1E,MAAM5M,GAeN,MAbO,4BADCA,EAAiBjH,MAErBmO,QAAQ4F,KAAK,uCACZ9M,EAAiBE,SAAU,EAC5B,sDAAyBhG,MAAK0F,GAAKA,EAAEC,QAAQC,UAC7CxD,GAAO,EACPxC,EAAgB,OAGhBoN,QAAQC,MAAM,6BAA8BnH,GAC5C1D,GAAO,IAIJ,EAGT,OAAO,KAKT,MAAO,IAAW,OAAD,6BAGf,IAFAA,GAAO,GAGFA,WAIqB6M,GAAQ,cAcpCrP,EAAcI,MAAK6S,IACjBA,OAGFC,EAAA,oBAA4B,YAAa,CAACtN,EAAG,uBAG/C","sources":["webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/languageChangeButton.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/mtproto/serverTimeManager.ts","webpack://tweb/./src/pages/pageAuthCode.ts","webpack://tweb/./src/pages/pageSignIn.ts","webpack://tweb/./src/helpers/bytes/bytesToBase64.ts","webpack://tweb/./src/pages/pageSignQR.ts"],"sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType<typeof getLang>;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise<any>;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","export default function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise<any> => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map<string, HTMLLIElement[]> = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array<HTMLLIElement> = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector<HTMLElement>('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n const names = [\r\n c.name, \r\n c.default_name,\r\n c.iso2\r\n ];\r\n\r\n names.filter(Boolean).forEach(name => {\r\n const abbr = name.split(' ').filter(word => /\\w/.test(word)).map(word => word[0]).join('');\r\n if(abbr.length > 1) {\r\n names.push(abbr);\r\n }\r\n });\r\n\r\n let good = !!names.filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise<any>;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise<void> => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","export default function bytesToBase64(bytes: number[] | Uint8Array) {\n let mod3: number;\n let result = '';\n\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\n mod3 = nIdx % 3;\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\n if(mod3 === 2 || nLen - nIdx === 1) {\n result += String.fromCharCode(\n uint6ToBase64(nUint24 >>> 18 & 63),\n uint6ToBase64(nUint24 >>> 12 & 63),\n uint6ToBase64(nUint24 >>> 6 & 63),\n uint6ToBase64(nUint24 & 63)\n );\n nUint24 = 0;\n }\n }\n\n return result.replace(/A(?=A$|$)/g, '=');\n}\n\nexport function uint6ToBase64(nUint6: number) {\n return nUint6 < 26\n ? nUint6 + 65\n : nUint6 < 52\n ? nUint6 + 71\n : nUint6 < 62\n ? nUint6 - 4\n : nUint6 === 62\n ? 43\n : nUint6 === 63\n ? 47\n : 65;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\nimport bytesCmp from '../helpers/bytes/bytesCmp';\r\nimport bytesToBase64 from '../helpers/bytes/bytesToBase64';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise<string>((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise<void>;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise<void>((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise<void>>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n"],"names":["CodeInputField","constructor","options","super","plainText","input","this","type","setAttribute","autocomplete","lastLength","addEventListener","e","classList","remove","setLabel","value","replace","slice","length","setValueSilently","onFill","cachedPromise","set","getLanguageChangeButton","appendTo","then","config","suggested_lang_code","Promise","all","strings","backup","forEach","string","backupString","key","push","btnChangeLanguage","text","lastElementChild","window","requestAnimationFrame","append","once","disabled","TrackingMonkey","inputField","size","max","needFrame","container","document","createElement","add","playAnimation","animation","frame","Math","min","round","idleAnimation","stop","canvas","style","display","direction","setDirection","setSpeed","play","load","loadPromise","loop","autoplay","width","height","_animation","currentFrame","pause","bytesCmp","bytes1","bytes2","len","i","fixBase64String","str","toUrl","serverTimeManager","serverTimeOffset","to","task","payload","codeInput","authCode","headerElement","sentTypeElement","page","CODELENGTH","codeInputField","label","name","code","submitCode","pageEl","querySelector","cleanup","setTimeout","monkey","params","phone_number","phone_code_hash","phone_code","ignoreErrors","response","_","user","m","default","mount","catch","err","good","handled","i18n","innerText","select","removeAttribute","imageDiv","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","focus","btnQr","btnNext","setCountries","countries","country","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","c","emoji","iso2","liArr","country_codes","countryCode","li","wrapped","spanEmoji","innerHTML","el","dataset","defaultName","span","country_code","button","target","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","lastValue","hidePicker","telEl","hideTimeout","get","clearTimeout","undefined","offsetWidth","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","removeEventListener","ctrlKey","_value","toLowerCase","matches","names","filter","Boolean","abbr","split","word","test","map","join","indexOf","cancelBubble","preventDefault","blur","onInput","formatted","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","state","toggle","api_id","api_hash","settings","Object","assign","setError","console","error","h4","_i18n","subtitle","IS_TOUCH_SUPPORTED","nearestDcResult","langPack","hash","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","resolve","dcId","delete","_dcs","g","shift","dbKey","finally","ripple","uint6ToBase64","nUint6","preloader","btnBack","helpList","QRCodeStyling","rootScope","prevToken","iterate","isLoop","loginToken","except_ids","dc_id","token","authorization","encoded","bytes","mod3","result","nLen","nUint24","nIdx","String","fromCharCode","bytesToBase64","url","getComputedStyle","documentElement","surfaceColor","getPropertyValue","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","children","Array","from","timestamp","Date","now","diff","expires","warn","func","appStateManager"],"sourceRoot":""}