{"version":3,"file":"libs_init.87a999c4.js","mappings":"gGAEAA,EAAOC,QAAU,CACfC,MAAO,OACPC,MAAO,OACPC,QAAS,UACTC,YAAa,cACbC,QAAS,eACTC,OAAQ,CACN,YAAa,UACbC,KAAM,WAERC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,IAAK,CACH,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,MAAO,CACL,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,aAAc,CACZ,GAAI,UACJ,IAAK,WAEPC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,MAAO,CACL,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,QAAS,CACP,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPV,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPW,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,OAAQ,CACN,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WAEPC,KAAM,CACJ,GAAI,UACJ,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,W,uKCvKF,IAAKC,EAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,eAAfA,EAAAA,EAAe,eAAfA,EAAAA,EAAe,mBAAfA,EAAAA,EAAe,yBAAfA,EAAAA,EAAe,6BAAfA,CAAe,MAQpB,SAASC,EAAmBC,EAAuBC,GACxD,OAAQD,GACN,KAAKF,EAAgBI,KACnB,MAAO,CACLC,MAAO,gBAEX,KAAKL,EAAgBM,OAGnB,MAAO,CACLD,MAAO,kBASX,KAAKL,EAAgBO,UACnB,MAAO,CACLF,MAAO,aASX,KAAKL,EAAgBQ,YACnB,MAAO,CACLH,MAAO,eAUf,CAEO,SAASI,EAAmBC,EAAYC,GAC7C,OAAIC,EAAAA,EAAAA,IAAUF,GAAcV,EAAgBM,QACxCO,EAAAA,EAAAA,IAAYH,EAAMC,GAAwBX,EAAgBO,WAC1DO,EAAAA,EAAAA,IAAcJ,EAAMC,GAAwBX,EAAgBQ,YAGzDR,EAAgBe,IACzB,CAOO,SAASC,EAAWC,GAAyC,IAAxC,MAAEC,EAAK,UAAEC,GAA6BF,EAChE,OAAIC,IAAUlB,EAAgBe,KAAa,MAGzCK,EAAAA,EAAAA,KAAA,OACED,UAAWE,IAAW,oCAAqCF,EAAW,CACpE,eAAgBD,IAAUlB,EAAgBI,KAC1C,gBAAiB,CAACJ,EAAgBO,UAAWP,EAAgBQ,aAAac,SAASJ,GACnF,aAAcA,IAAUlB,EAAgBM,UAIhD,CCzE6B,IAExBiB,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAAA,EAAkB,yBAAlBA,EAAAA,EAAkB,mBAAlBA,CAAkB,EAAlBA,GAAkB,IAWvB,MAAMC,EAAgC,CACpC,CAAEC,UAAWC,IAAUC,iBAAiB,EAAOC,WAAY,YAC3D,CAAEH,SAAU,IAAKE,iBAAiB,EAAOC,WAAY,SACrD,CAAEH,SAAU,IAAKE,iBAAiB,EAAOC,WAAY,QACrD,CAAEH,SAAU,IAAKE,iBAAiB,EAAMC,WAAY,SAGtD,SAASC,EAAaC,GAAoF,IAAzDnB,EAAuBoB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,eAAevB,eACxF,MAAMD,GAAOyB,EAAAA,EAAAA,IAAQL,GACfZ,EAAQT,EAAmBC,EAAMC,GAEvC,MAAO,CAAED,OAAMQ,QACjB,CAEA,SAASkB,EAAaC,GACpB,MAAMC,GAAQC,EAAAA,EAAAA,iBAAgB,CAAEC,UAAW,WACrCtB,EAAQjB,EAAmBoC,EAAMnB,MAAOmB,EAAM3B,MAEpD,OAAKQ,GAGHuB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACwB,EAAAA,eAAc,CAACN,MAAOA,EAAO,aAAYpB,EAAMb,MAAMsC,UACpDvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uDAAsDwB,UACnEvB,EAAAA,EAAAA,KAACJ,EAAW,IAAKqB,SAGrBjB,EAAAA,EAAAA,KAACyB,EAAAA,QAAO,CAACP,MAAOA,EAAOnB,UAAU,eAAcwB,UAC7CvB,EAAAA,EAAAA,KAAC0B,EAAAA,QAAO,CAACC,MAAO,EAAG5B,UAAU,OAAMwB,SAChCzB,EAAMb,aAXI,IAiBrB,CAEA,SAAS2C,EAAYX,GACnB,MAAMnB,EAAQjB,EAAmBoC,EAAMnB,MAAOmB,EAAM3B,MAEpD,OAAKQ,GAGHuB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACJ,EAAW,IAAKqB,EAAOlB,UAAU,UAClCC,EAAAA,EAAAA,KAAA,QAAAuB,SAAQ,GAAEzB,EAAMb,gBALD,IAQrB,CAKA,SAAS4C,EAAuBC,EAAkCC,GAChE,GAA4B,iBAAjBD,EAA2B,OAAOC,EAAYA,EAAYnB,OAAS,GAI9E,OAF4BmB,EAAYC,QAAQC,GAAeH,GAAgBG,EAAW5B,WAE/D6B,OAASH,EAAYA,EAAYnB,OAAS,EACvE,CAEA,SAASuB,EAAgBC,EAA0BC,GACjD,OAAOD,IAASjC,EAAmBmC,OAASA,OAAOC,WAAaF,GAASG,aAAe,CAC1F,CAyBO,SAASC,EAAI5C,GAMN,IANO,UACnBE,EAAS,UACTW,EAAS,eACTgC,EAAiB,YAAW,YAC5BX,EAAc3B,KACXa,GACOpB,EACV,MAAM8C,GAAiBC,EAAAA,EAAAA,KACjBC,EAAUC,EAAAA,OAA6B,OACtC5B,EAAO6B,GAAYD,EAAAA,SAAerC,EAAaC,KAC/CsC,EAAmBC,GAAiBH,EAAAA,SAAsC,MAqCjF,OAnCAA,EAAAA,WAAgB,KACd,MAAMI,EAAWC,aAAY,IAAMJ,EAAStC,EAAaC,KAlHrC,KAmHpB,MAAO,IAAM0C,cAAcF,EAAS,GACnC,CAACxC,IAEJoC,EAAAA,WAAgB,KACd,IAAKH,IAAmBE,EAAQjF,QAAS,OAEzC,IAAKoF,EAAmB,CACtB,MAAMK,EAAelB,EAAgBhC,EAAmBuC,GAAiBG,EAAQjF,SACjFqF,EAAcpB,EAAuBwB,EAActB,GACrD,CAEA,MAAMuB,EAAeC,KAAS,KAC5B,MACMC,EAAkB3B,EADHM,EAAgBhC,EAAmBuC,GAAiBG,EAAQjF,SACpBmE,GAEzDyB,IAAoBR,GAAmBC,EAAcO,EAAgB,GACxE,KAEGC,EAAW,IAAId,GAAgBe,IACnCpB,OAAOqB,uBAAsB,KACvBC,MAAMC,QAAQH,IAAYA,EAAQ9C,OAAS,GAAG0C,GAAc,GAChE,IAMJ,OAHAG,EAASK,QAAQjB,EAAQjF,SACzB0E,OAAOyB,iBAAiB,SAAUT,GAE3B,KACLG,EAASO,aACT1B,OAAO2B,oBAAoB,SAAUX,EAAa,CACnD,GACA,CAACX,EAAgBK,EAAmBjB,EAAaW,KAGlD1C,EAAAA,EAAAA,KAAA,OAAKkE,IAAKrB,KAAa5B,EAAOlB,UAAWA,EAAUwB,SAChDyB,IACC3B,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,kEAAiEwB,SAAA,CAC7EyB,EAAkBzC,iBACjBP,EAAAA,EAAAA,KAAC4B,EAAW,CAACtC,KAAM4B,EAAM5B,KAAMQ,MAAOoB,EAAMpB,SAE5CE,EAAAA,EAAAA,KAACgB,EAAY,CAAC1B,KAAM4B,EAAM5B,KAAMQ,MAAOoB,EAAMpB,SAE/CE,EAAAA,EAAAA,KAAA,QAAAuB,UAAO4C,EAAAA,EAAAA,IAAuBjD,EAAM5B,KAAM0D,EAAkBxC,kBAKtE,C,mICpJO,SAASO,EAAQqD,GACtB,IAAIC,EAAe,MAARD,EAAe,IAAIE,KAAKF,GAAQ,IAAIE,KAC/C,MAAMC,EAAW,IAAID,KACnBD,EAAKG,iBACLH,EAAKI,cACLJ,EAAKK,aACLL,EAAKM,cAAgB,EACrBN,EAAKO,gBACLP,EAAKQ,iBAEDC,EAxBD,SAAsBT,GAC3B,MAAMU,EAAYV,EAAKtD,UACjBiE,EAAaX,EAAKY,WAElBC,EAAiBH,EADLV,EAAKc,SAEvB,QAAIH,EAAa,GAAKA,EAAa,MAG/BA,EAAa,GAAKA,EAAa,KAGb,IAAfA,EAAmBE,GAAkB,EAAIA,GAAkB,GACpE,CAYgBE,CAAab,GAM3B,OAJIO,GACFP,EAASc,YAAYd,EAASI,cAAgB,GAGzCJ,CACT,CAEA,SAASe,EAAWjB,GAClB,OAAOA,EAAKkB,mBAAmB,QAAS,CAAEC,QAAS,SACrD,CAEA,SAASP,EAASZ,GAA8B,IAAlBoB,IAAS9E,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GACrC,MAAM+E,EAAOrB,EAAKkB,mBAAmB,QAAS,CAAEI,MAAO,UACvD,OAAOF,EAAYC,EAAKE,cAAgBF,CAC1C,CAEA,SAASP,EAAOd,GACd,OAAOA,EAAKtD,UAAU8E,WAAWC,SAAS,EAAG,IAC/C,CAEA,SAASC,EAAQ1B,GACf,OAAOA,EAAK2B,eAAe,QAAS,CAAEC,KAAM,UAAWC,OAAQ,UAAWC,QAAQ,GACpF,CAAC,IAEIC,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,eAAVA,EAAAA,EAAU,iBAAVA,EAAAA,EAAU,uBAAVA,EAAAA,EAAU,uBAAVA,CAAU,EAAVA,GAAU,IASR,SAASjC,IAAgF,IAAzDE,EAAU1D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGI,IAAWsF,EAAsB1F,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,OACtF,OAAQyF,EAAWC,IACjB,KAAKD,EAAWE,KACd,MAAQ,GAAEhB,EAAWjB,MAASY,EAASZ,MAASc,EAAOd,MAASA,EAAKkC,iBAAiBR,EAAQ1B,QAChG,KAAK+B,EAAWI,MACd,MAAQ,GAAElB,EAAWjB,MAASY,EAASZ,MAASc,EAAOd,MAAS0B,EAAQ1B,KAC1E,KAAK+B,EAAWK,SACd,MAAQ,GAAExB,EAASZ,GAAM,MAAUc,EAAOd,KAC5C,KAAK+B,EAAWM,SACd,OAAOX,EAAQ1B,GAErB,CAEO,SAASsC,EAAWC,EAAuBC,EAA6BC,GAC7E,OAAOC,EAAAA,EACLA,EAAAA,EAAeH,GAAUA,EAAiBG,EAAAA,EAAe,GAAEH,IAASC,EAAqB,IAAIvC,MAC7FwC,GAAgBD,EAEpB,CAEO,SAASpH,IAA+E,IAAnE4E,EAAU1D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGI,IAAWiG,EAASrG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,eAAevB,eAC7E,MAAM0H,EAAY5C,EAAKc,SACjB+B,EAAM7C,EAAK8C,aACXC,EAAQ/C,EAAKgD,WAEnB,SAAIL,GAA2B,IAAdC,GAAiC,IAAdA,KAA8B,IAAVG,GAAyB,IAAVA,GAA0B,IAAVA,GAAeF,EAAM,IAI9G,CAEO,SAASxH,IAAiF,IAAnE2E,EAAU1D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGI,IAAWiG,EAASrG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,eAAevB,eAC/E,MAAM0H,EAAY5C,EAAKc,SACjB+B,EAAM7C,EAAK8C,aAEjB,SACEH,GACc,IAAdC,GACc,IAAdA,KACqB,KAApB5C,EAAKgD,YAAyC,KAApBhD,EAAKgD,YAA0C,KAApBhD,EAAKgD,YAAqBH,EAAM,IAK1F,CAKA,MAAMI,EAAgB,CACpB,CACErI,MAAO,iBACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,IAAR6B,GAEvD,CACEvI,MAAO,8BACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,KAAR6B,GAEvD,CACEvI,MAAO,iBACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,KAAR6B,GAEvD,CACEvI,MAAO,cACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,IAAR6B,GAEvD,CACEvI,MAAO,eACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,KAAR6B,GAEvD,CACEvI,MAAO,qBACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,KAAR6B,GAEvD,CACEvI,MAAO,cACPsI,KAAMA,CAACC,EAAa7B,EAAeyB,IAA4B,IAAVzB,GAAuB,IAAR6B,GAAaJ,GAAS,IAE5F,CACEnI,MAAO,mBACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,IAAR6B,GAEvD,CACEvI,MAAO,YACPsI,KAAMA,CAACC,EAAa7B,IAA4B,IAAVA,GAAuB,IAAR6B,GAEvD,CACEvI,MAAO,mBACPsI,KAAMA,CAACC,EAAa7B,IAA4B,KAAVA,GAAwB,KAAR6B,GAExD,CACEvI,MAAO,4CACPsI,KAAMA,CAACC,EAAa7B,EAAeyB,IAA4B,KAAVzB,GAAwB,KAAR6B,GAAcJ,GAAS,IAE9F,CACEnI,MAAO,gBACPsI,KAAMA,CAACC,EAAa7B,IAA4B,KAAVA,GAAwB,KAAR6B,IAInD,SAASC,IAAmC,IAAxBpD,EAAU1D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGI,IACtC,IAAIyG,EAAMnD,EAAKtD,UACX4E,EAAQtB,EAAKY,WAAa,EAC1BmC,EAAQ/C,EAAKgD,WAEjB,OAAOC,EAAcI,MAAMC,GAAYA,EAAQJ,KAAKC,EAAK7B,EAAOyB,IAClE,CAEO,SAAS5H,IAAkC,IAAxB6E,EAAU1D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGI,IACrC,QAAS0G,EAAWpD,EACtB,C,sHChLO,MAAMuD,EAA2B,kBAC3BC,EAAyB,CAAEC,MAAO,CAAC,EAAGC,WAAY,CAAC,EAAGC,QAASC,EAAAA,GAAAA,SAE/DC,EAA2D,CACtE,CAACD,EAAAA,GAAAA,SAAuB,CACtBE,GAAIF,EAAAA,GAAAA,QACJvC,KAAM,oBACN0C,QAASC,EAAAA,GAAAA,QACTC,QACE,gJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,UAAwB,CACvBE,GAAIF,EAAAA,GAAAA,SACJvC,KAAM,qBACN0C,QAASC,EAAAA,GAAAA,SACTC,QACE,+IACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,WAAyB,CACxBE,GAAIF,EAAAA,GAAAA,UACJvC,KAAM,sBACN0C,QAASC,EAAAA,GAAAA,UACTC,QACE,gJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,gBAA8B,CAC7BE,GAAIF,EAAAA,GAAAA,eACJvC,KAAM,uBACN0C,QAASC,EAAAA,GAAAA,eACTC,QACE,kJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,cAA4B,CAC3BE,GAAIF,EAAAA,GAAAA,aACJvC,KAAM,uBACN0C,QAASC,EAAAA,GAAAA,aACTC,QACE,oJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,UAAwB,CACvBE,GAAIF,EAAAA,GAAAA,SACJvC,KAAM,qBACN0C,QAASC,EAAAA,GAAAA,SACTC,QACE,+IACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,gBAA8B,CAC7BE,GAAIF,EAAAA,GAAAA,eACJvC,KAAM,2BACN0C,QAASC,EAAAA,GAAAA,SACTC,QACE,qJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,gBAA8B,CAC7BE,GAAIF,EAAAA,GAAAA,eACJvC,KAAM,kBACN0C,QAASC,EAAAA,GAAAA,eACTC,QACE,qKACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,iBAA+B,CAC9BE,GAAIF,EAAAA,GAAAA,gBACJvC,KAAM,MACN0C,QAASC,EAAAA,GAAAA,gBACTC,QAAS,uDACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,yBAAuC,CACtCE,GAAIF,EAAAA,GAAAA,wBACJvC,KAAM,cACN0C,QAASC,EAAAA,GAAAA,wBACTC,QAAS,+DACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,uBAAqC,CACpCE,GAAIF,EAAAA,GAAAA,sBACJvC,KAAM,MACN0C,QAASC,EAAAA,GAAAA,sBACTC,QAAS,iEACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,mBAAiC,CAChCE,GAAIF,EAAAA,GAAAA,kBACJvC,KAAM,MACN0C,QAASC,EAAAA,GAAAA,kBACTC,QAAS,oDACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,kBAAgC,CAC/BE,GAAIF,EAAAA,GAAAA,iBACJvC,KAAM,MACN0C,QAASC,EAAAA,GAAAA,iBACTC,QAAS,mDACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,eAA6B,CAC5BE,GAAIF,EAAAA,GAAAA,cACJvC,KAAM,iBACN0C,QAASC,EAAAA,GAAAA,cACTC,QAAS,8CACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,aAA2B,CAC1BE,GAAIF,EAAAA,GAAAA,YACJvC,KAAM,0BACN0C,QAASC,EAAAA,GAAAA,YACTC,QAAS,8EACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,YAA0B,CACzBE,GAAIF,EAAAA,GAAAA,WACJvC,KAAM,cACN0C,QAASC,EAAAA,GAAAA,WACTC,QAAS,2DACTC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,uBAAqC,CACpCE,GAAIF,EAAAA,GAAAA,sBACJvC,KAAM,kBACN0C,QAASC,EAAAA,GAAAA,sBACTC,QACE,mJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,cAA4B,CAC3BE,GAAIF,EAAAA,GAAAA,aACJvC,KAAM,2BACN0C,QAASC,EAAAA,GAAAA,UACTC,QACE,sHACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,cAA4B,CAC3BE,GAAIF,EAAAA,GAAAA,aACJvC,KAAM,gBACN0C,QAASC,EAAAA,GAAAA,aACTC,QAAS,yCACTC,mBAAmB,EACnBC,iBAAiB,IAIRC,EAAyB,CACpC,CAACR,EAAAA,GAAAA,SAAuB,CACtBE,GAAIF,EAAAA,GAAAA,QACJvC,KAAM,oBACN0C,QAASC,EAAAA,GAAAA,QACTC,QACE,gJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,UAAwB,CACvBE,GAAIF,EAAAA,GAAAA,SACJvC,KAAM,qBACN0C,QAASC,EAAAA,GAAAA,SACTC,QACE,+IACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,WAAyB,CACxBE,GAAIF,EAAAA,GAAAA,UACJvC,KAAM,sBACN0C,QAASC,EAAAA,GAAAA,UACTC,QACE,gJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,gBAA8B,CAC7BE,GAAIF,EAAAA,GAAAA,eACJvC,KAAM,uBACN0C,QAASC,EAAAA,GAAAA,eACTC,QACE,kJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,cAA4B,CAC3BE,GAAIF,EAAAA,GAAAA,aACJvC,KAAM,uBACN0C,QAASC,EAAAA,GAAAA,aACTC,QACE,oJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,UAAwB,CACvBE,GAAIF,EAAAA,GAAAA,SACJvC,KAAM,qBACN0C,QAASC,EAAAA,GAAAA,SACTC,QACE,+IACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,gBAA8B,CAC7BE,GAAIF,EAAAA,GAAAA,eACJvC,KAAM,2BACN0C,QAASC,EAAAA,GAAAA,SACTC,QACE,qJACFC,mBAAmB,EACnBC,iBAAiB,GAEnB,CAACP,EAAAA,GAAAA,gBAA8B,CAC7BE,GAAIF,EAAAA,GAAAA,eACJvC,KAAM,kBACN0C,QAASC,EAAAA,GAAAA,eACTC,QACE,qKACFC,mBAAmB,EACnBC,iBAAiB,IAIRE,EAAuCC,OAAOC,OAAOV,GAErDW,EAAiCF,OAAOC,OAAOH,GAE/CK,EAAuB,CAClC,CACEpD,KAAM,UACNqD,UAAW,cACXC,YACE,0GACFlK,KAAMmK,EAAAA,GAAAA,OACNC,SAAUR,GAEZ,CACEhD,KAAM,QACNqD,UAAW,YACXC,YACE,2GACFlK,KAAMmK,EAAAA,GAAAA,MACNC,SAAUR,GAEZ,CACEhD,KAAM,OACNqD,UAAW,mBACXC,YACE,8GACFlK,KAAMmK,EAAAA,GAAAA,WACNC,SAAUR,GAEZ,CACEhD,KAAM,wBACNqD,UAAW,sCACXI,UAAW,MACXH,YAAa,sGACblK,KAAMmK,EAAAA,GAAAA,IACNC,SAAUL,IAIDO,EAAoB,CAC/B1D,KAAM,WACNqD,UAAW,eACXC,YACE,8GACFlK,KAAMmK,EAAAA,GAAAA,SACNC,SAAUR,GAGCW,EAA+B,CAC1C3D,KAAM,eACNqD,UAAW,GACXC,YAAa,GACblK,KAAMmK,EAAAA,GAAAA,YACNC,SAAUR,E,uLCxSL,MAAMY,EAAgB,IAChBC,EAAiB,IACjBC,EAAoB,EACpBC,EAAgB,GAEhBC,EAAyB,IACzBC,EAA6B,IAC7BC,EAAyB,MAGzBC,EAAkB,CAC7BC,GAAI,GACJC,GAAI,IAIOC,EAAwB,EAExBC,EAAwB,CACnCC,WAAY,GACZC,UAAW,GACX,yBAA0B,EAC1BC,WAAY,EACZ,oBAAqB,EACrB,qBAAsB,EACtBC,YAAa,EACb,cAAe,EACfC,OAAQ,EACRC,UAAW,EACX,kBAAmB,GAGRC,EAA0B,CACrCN,WAAY,GACZC,UAAW,EACX,yBAA0B,EAC1BC,WAAY,EACZ,oBAAqB,EACrB,qBAAsB,EACtBC,YAAa,EACb,cAAe,EACfC,OAAQ,EACRC,UAAW,EACX,kBAAmB,GAGRE,EAAsB,CACjCC,GAAI,GACJ,YAAa,GACb,eAAgB,EAChB,aAAc,EACd,eAAgB,EAChB,gBAAiB,EACjBC,OAAQ,EACRC,cAAe,EACf,eAAgB,EAChBC,UAAW,EACXC,SAAU,EACVC,MAAO,GAGIC,EAA2B,CACtCd,WAAY,GACZC,UAAW,EACX,yBAA0B,EAC1BC,WAAY,EACZ,oBAAqB,EACrB,qBAAsB,EACtBC,YAAa,EACb,cAAe,EACfC,OAAQ,EACRC,UAAW,EACX,kBAAmB,GAGRU,EAA+B,IACvCD,EACHb,UAAW,KAGAe,EAAwB,CACnCC,QAAS,GACT,iBAAkB,GAClBC,MAAO,GACPC,OAAQ,GACRC,QAAS,GACTC,YAAa,GACbC,YAAa,GAEbC,MAAO,GACPC,MAAO,GACPC,MAAO,GACP,YAAa,GACb,cAAe,GACfC,OAAQ,GAERC,SAAU,GACVC,MAAO,GACPC,UAAW,IAGAC,EAAmB,CAC9B,CACEC,EAAG,EACHC,EAAG,EACHpC,GAAI,IACJC,GAAI,IACJrE,KAAM,SACNyG,UAAW,CAAC,WAEd,CACEF,EAAG,EACHC,EAAG,IACHpC,GAAI,IACJC,GAAI,IACJrE,KAAM,SACNyG,UAAW,CAAC,iBAAkB,UAAW,WAE3C,CACEF,EAAG,EACHC,EAAG,IACHpC,GAAI,IACJC,GAAI,IACJrE,KAAM,gBACNyG,UAAW,CAAC,uBAAwB,SAAU,OAAQ,YAAa,WAAY,QAAS,WAE1F,CACEF,EAAG,IACHC,EAAG,IACHpC,GAAI,IACJC,GAAI,GACJrE,KAAM,eACNyG,UAAW,CAAC,iBAEd,CACEF,EAAG,IACHC,EAAG,IACHpC,GAAI,IACJC,GAAI,GACJrE,KAAM,SACNyG,UAAW,CAAC,WAEd,CACEF,EAAG,KACHC,EAAG,IACHpC,GAAI,IACJC,GAAI,GACJrE,KAAM,YACNyG,UAAW,CAAC,cAEd,CACEF,EAAG,IACHC,EAAG,EACHpC,GAAI,IACJC,GAAI,IACJrE,KAAM,OACNyG,UAAW,CACT,WACA,SACA,cACA,YACA,YACA,cACA,SACA,QACA,YACA,QACA,UAGJ,CACEF,EAAG,IACHC,EAAG,EACHpC,GAAI,IACJC,GAAI,IACJrE,KAAM,SACNyG,UAAW,CACT,SACA,kBACA,SACA,aACA,UACA,UACA,QACA,SACA,UACA,cACA,cACA,mBAGJ,CACEF,EAAG,IACHC,EAAG,GACHpC,GAAI,IACJC,GAAI,GACJrE,KAAM,SACNyG,UAAW,CAAC,UAAW,SAAU,SAAU,YAE7C,CACEF,EAAG,IACHC,EAAG,IACHpC,GAAI,IACJC,GAAI,GACJrE,KAAM,QACNyG,UAAW,CAAC,U,4JC5KT,MAAMC,EAAoC,CAC/C,CAAC/D,EAAAA,GAAAA,SAAkB,EAAE,EAAG,GACxBgE,GAAI,EAAE,EAAG,GACTC,IAAK,EAAE,GAAI,IACXC,IAAK,EAAE,GAAI,IACXC,IAAK,EAAE,GAAI,IACXC,IAAK,EAAE,GAAI,IACXC,QAAS,CAAC,EAAG,GACbC,IAAK,CAAC,EAAG,IACTC,KAAM,CAAC,EAAG,IACVC,KAAM,CAAC,EAAG,GACVC,IAAK,CAAC,EAAG,GACTC,IAAK,CAAC,EAAG,GACTC,KAAM,CAAC,EAAG,GACVC,OAAQ,EAAE,GAAI,IACdC,OAAQ,CAAC,EAAG,IACZC,KAAM,CAAC,EAAG,GACVC,UAAW,CAAC,IAAK,IAEjBC,cAAe,EAAE,EAAG,GACpBC,cAAe,EAAE,EAAG,IAGTC,EAAwC,CACnD,CAAClF,EAAAA,GAAAA,SAAkB,MACnBgE,GAAI,MACJC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,QAAS,KACTC,IAAK,KACLC,KAAM,KACNC,KAAM,KACNC,IAAK,KACLC,IAAK,KACLC,KAAM,MACNC,OAAQ,MACRC,OAAQ,MACRC,KAAM,CAAE,EAAG,gBAAiB,EAAG,SAAU,EAAG,UAAW,EAAG,UAAW,EAAG,kBACxEC,UAAW,CACT,MAAO,UACP,MAAO,UACP,KAAM,iBACN,EAAG,kBACH,GAAI,UACJ,GAAI,WAENC,cAAe,MACfC,cAAe,OAGJE,EAAsB,CACjCC,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CC,WAAYC,IAAAA,OAAAA,aACZC,OAAQ,CACNP,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CC,WAAY,KACZG,OAAQ,KACRC,OAAQ,CACNC,MAAO,OACPL,WAAY,KACZG,OAAQ,KACRG,OAAQ,KACRC,SAAU,GACVC,WAAY,OACZC,OAAQ,CAAEb,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC7CJ,QAAS,CAAEC,KAAM,EAAGC,MAAO,EAAGE,KAAM,KAGxCW,SAAU,CACRf,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CC,WAAY,KACZG,OAAQ,KACRC,OAAQ,CACNC,MAAO,OACPL,WAAY,KACZG,OAAQF,IAAAA,OAAAA,aACRK,OAAQ,GACRC,SAAU,GACVC,WAAY,SACZC,OAAQ,CAAEb,IAAK,EAAGC,MAAO,GAAKC,OAAQ,EAAGC,MAAO,IAChDJ,QAAS,CAAEC,KAAM,GAAKC,MAAO,EAAGE,KAAM,IAExCY,MAAO,CACLN,MAAO,UACPL,WAAY,UACZG,OAAQ,UACRG,OAAQ,GACRC,SAAU,GACVC,WAAY,SACZC,OAAQ,CAAEb,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC7CJ,QAAS,CAAEC,KAAM,GAAKC,MAAO,EAAGE,KAAM,KAG1Ca,eAAgB,CACd,EAAG,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,GAC/C,IAAK,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GACvD,KAAM,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,GACxD,EAAG,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,IAEvDC,gBAAiB,CACf,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,GACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,EAAG,EACH,EAAG,IACH,EAAG,EACH,EAAG,GAELC,cAAe,CACb,GAAI,CAAC,GAAI,GAAI,GAAI,IACjB,GAAI,CAAC,GAAI,GAAI,GAAI,GAAI,IACrB,GAAI,CAAC,GAAI,GAAI,GAAI,GAAI,IACrB,GAAI,CAAC,GAAI,GAAI,GAAI,EAAG,EAAG,GACvB,GAAI,CAAC,GAAI,GAAI,EAAG,EAAG,GACnB,GAAI,CAAC,EAAG,EAAG,EAAG,GACd,GAAI,CAAC,EAAG,EAAG,EAAG,GACd,GAAI,CAAC,EAAG,EAAG,EAAG,GACd,GAAI,CAAC,EAAG,EAAG,GACX,GAAI,CAAC,GAAI,EAAG,EAAG,EAAG,GAClB,EAAG,CAAC,EAAG,EAAG,EAAG,GACb,EAAG,CAAC,EAAG,EAAG,GACV,EAAG,CAAC,EAAG,GACP,EAAG,CAAC,KAIKC,EAA2B,IACnCrB,EACHC,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CC,WAAY,UACZE,OAAQ,IACHR,EAASgB,SACZf,QAAS,CAAEC,IAAK,GAAKC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAChDI,OAAQ,UACRC,OAAQ,IACHV,EAASgB,SAASN,OACrBK,OAAQ,CAAEb,IAAK,EAAGC,MAAO,GAAKC,OAAQ,EAAGC,MAAO,KAChDJ,QAAS,CAAEC,IAAK,GAAKC,MAAO,EAAGE,KAAM,GACrCI,OAAQ,UACRI,SAAU,IAGdG,SAAU,IACLhB,EAASgB,SACZf,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CK,OAAQ,IACHV,EAASgB,SAASN,OACrBE,OAAQ,IAGZM,eAAgB,IAAKlB,EAASkB,eAAgB,EAAG,CAAC,GAAI,GAAI,GAAI,EAAG,IACjEC,gBAAiB,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GACvDC,cAAe,CACb,GAAI,CAAC,EAAG,EAAG,GACX,GAAI,CAAC,EAAG,EAAG,GACX,GAAI,CAAC,GACL,GAAI,CAAC,GACL,GAAI,CAAC,GACL,EAAG,CAAC,GACJ,EAAG,CAAC,GACJ,EAAG,CAAC,KAIKE,EAA+B,IACvCD,EACHb,OAAQ,IACHa,EAAcb,OACjBF,WAAYC,IAAAA,KAAAA,KACZE,OAAQF,IAAAA,KAAAA,KACRG,OAAQ,IACHW,EAAcb,OAAOE,OACxBT,QAAS,CAAEC,IAAK,GAAKC,MAAO,EAAGE,KAAM,GACrCU,OAAQ,CAAEb,IAAK,EAAGC,MAAO,IAAKC,OAAQ,EAAGC,MAAO,IAChDI,OAAQF,IAAAA,KAAAA,OAGZS,SAAU,IACLK,EAAcL,SACjBN,OAAQ,IACHW,EAAcL,SAASN,OAC1BD,OAAQF,IAAAA,KAAAA,QAKDgB,EAA8B,IACtCvB,EACHC,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CC,WAAY,UACZU,SAAU,IACLhB,EAASgB,SACZV,WAAY,UACZI,OAAQ,IACHV,EAASgB,SAASN,OACrBE,OAAQ,EACRC,SAAU,EACVJ,OAAQ,UACRM,OAAQ,CAAEb,KAAM,GAAKC,MAAO,GAAKC,OAAQ,EAAGC,MAAO,IACnDJ,QAAS,CAAEC,KAAM,EAAGC,MAAO,EAAGE,KAAM,KAGxCa,eAAgB,IAAKlB,EAASkB,eAAgB,EAAG,CAAC,GAAI,GAAI,GAAI,EAAG,IACjEC,gBAAiB,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GACvDC,cAAe,CACb,GAAI,CAAC,EAAG,EAAG,GACX,GAAI,CAAC,EAAG,EAAG,GACX,GAAI,CAAC,GACL,GAAI,CAAC,GACL,GAAI,CAAC,GACL,EAAG,CAAC,GACJ,EAAG,CAAC,GACJ,EAAG,CAAC,KAIKI,EAAkC,IAC1CD,EACHjB,WAAYC,IAAAA,KAAAA,KACZC,OAAQ,IACHe,EAAiBf,OACpBF,WAAYC,IAAAA,KAAAA,KACZE,OAAQF,IAAAA,KAAAA,MAEVS,SAAU,IACLO,EAAiBP,SACpBP,OAAQF,IAAAA,KAAAA,KACRD,WAAYC,IAAAA,KAAAA,KACZG,OAAQ,IACHa,EAAiBP,SAASN,OAC7BD,OAAQF,IAAAA,KAAAA,QAKDkB,EAA8B,IACtCzB,EACHC,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CG,OAAQ,IACHR,EAASQ,OACZP,QAAS,CAAEC,IAAK,EAAGC,MAAO,EAAGC,OAAQ,EAAGC,KAAM,GAC9CC,WAAY,UACZG,OAAQ,UACRC,OAAQ,IACHV,EAASQ,OAAOE,OACnBE,OAAQ,GACRX,QAAS,CAAEC,IAAK,IAAKC,MAAO,EAAGE,KAAM,KAGzCW,SAAU,IACLhB,EAASgB,SACZN,OAAQ,IACHV,EAASgB,SAASN,OACrBD,OAAQ,aAKDiB,EAAkC,IAC1CD,EACHjB,OAAQ,IACHiB,EAAiBjB,OACpBF,WAAYC,IAAAA,KAAAA,KACZE,OAAQF,IAAAA,KAAAA,MAEVS,SAAU,IACLS,EAAiBT,SACpBN,OAAQ,IACHe,EAAiBT,SAASN,OAC7BD,OAAQF,IAAAA,KAAAA,O,qFCnTC,MAAMoB,EACnBC,MACAhB,OACAiB,SACAC,OACAC,QAA2B,GAC3BC,WAAgC,GAChC1H,MAAuB,GACvB2H,QACA3Q,KACA4Q,gBAEAC,4BAA8B,CAC5BjC,IAAK,EACLC,MAAO,EACPC,OAAQ,EACRC,KAAM,GAGR8B,+BAAiC,CAC/BjC,IAAK,EACLC,MAAO,EACPC,OAAQ,EACRC,KAAM,GAGR8B,oBAAsBC,CAAC9Q,EAAiB2Q,IAClCA,EACE3Q,IAASmK,EAAAA,GAAAA,MACJ4G,EAAAA,GAEFA,EAAAA,GAGFA,EAAAA,EAGTF,uBAAyB,SACvBP,EACAtQ,EACA2Q,GAAgB,IAChBK,EAAKnP,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGwO,EAAgBS,aAAa9Q,EAAM2Q,GAAQ,SAC7CL,EAAQU,EAAM,EAEtBH,sBAAwBI,CAAC3B,EAAgBtP,EAAiB2Q,KACxD,MAAMK,EAAQX,EAAgBS,aAAa9Q,EAAM2Q,GAEjD,OAAOO,KAAKC,MAAM7B,EAAS0B,EAAM,EAGnCH,2BAA2BO,EAAWb,GACpC,MAAMc,EAASD,EAAKpG,IAAMkG,KAAKC,MAAMC,EAAKE,IAAMJ,KAAKC,MAAMC,EAAKG,IAC1DC,EAASJ,EAAKnG,IAAMiG,KAAKC,MAAMC,EAAKK,IAAMP,KAAKC,MAAMC,EAAKM,IAE1DC,EAAcN,GAAUN,EAAAA,GAAAA,IAAgCS,GAAUT,EAAAA,GAAAA,GAClEa,EACJJ,EAASjB,EAASb,SAASf,QAAQC,IAAM2B,EAASb,SAASN,OAAOE,OAASyB,EAAAA,GAE7E,OAAOY,GAAeC,CACxB,CAEAC,YAAYvB,EAAehB,EAAgBtP,EAAiBuQ,GAA+C,IAA1BI,EAAgB9O,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAC/FiQ,KAAKxB,MAAQA,EACbwB,KAAKxC,OAASA,EACdwC,KAAKvB,SAAWA,EAChBuB,KAAKnB,QAAUA,EACfmB,KAAK9R,KAAOA,EACZ8R,KAAKlB,gBAAkBL,EAASrB,OAAOP,QAAQC,IAAM2B,EAASrB,OAAOE,OAAOE,OAASyB,EAAAA,EACvF,CAEAgB,gBACE,IAAIC,EAEFA,EADEF,KAAK9R,OAASmK,EAAAA,GAAAA,MACN2H,KAAKG,aAAaH,KAAKpB,YAEvBoB,KAAKtB,QAAQ5H,MAAMwI,GAA4B,SAAnBA,EAAKc,KAAKtL,OAI9CkL,KAAKnB,UACPqB,EAAQvP,SAAWqP,KAAKK,mBAAmBH,EAAQvP,WAGrD,MAAM2P,EAAcC,KAAKC,UAAUN,GAAS,CAACO,EAAKzK,IAAmB,WAARyK,EAAmB,aAAezK,IAE/F,OAAOuK,KAAKG,MAAMJ,EACpB,CAEAK,gBACE,MAAO,CACLzJ,MAAO8I,KAAK9I,MACZyH,QAASqB,KAAKrB,QACdC,WAAYoB,KAAKpB,WAErB,CAEAyB,mBAA0EO,GACxEA,EAAIxP,QAAQkO,IACV,MAAMuB,EAAYb,KAAKc,cAAcxB,GAIrC,OAHIuB,GAAavB,EAAK3O,UAAUX,SAC9BsP,EAAK3O,SAAWqP,KAAKK,mBAAmBf,EAAK3O,WAExCkQ,CAAS,IAGpBC,cAAcC,GACZ,OAAKA,EAAEC,OAASD,EAAEC,MAAQC,EAAAA,GAAAA,UAEnBF,EAAE7H,GAAK,GAAK6H,EAAE5H,GAAK,CAC5B,CAEA+H,UAAUd,GAAsD,IAAnCe,EAA4BpR,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAK3D,OAJAiQ,KAAK9I,MAAQ,GACb8I,KAAKrB,QAAU,GACfqB,KAAKpB,WAAa,GAEVoB,KAAK9R,MACX,KAAKmK,EAAAA,GAAAA,OACH2H,KAAKtB,OAASsB,KAAKoB,eAAehB,GAAMiB,cACxC,MACF,KAAKhJ,EAAAA,GAAAA,WACH2H,KAAKtB,OAASsB,KAAKsB,cAAclB,GAAMiB,cACvC,MACF,KAAKhJ,EAAAA,GAAAA,UACL,KAAKA,EAAAA,GAAAA,SACL,KAAKA,EAAAA,GAAAA,YACH2H,KAAKtB,OAASsB,KAAKuB,kBAAkBnB,EAAMe,GAASE,cACpD,MACF,KAAKhJ,EAAAA,GAAAA,MACH2H,KAAKtB,OAASsB,KAAKwB,eAAepB,GAClC,MACF,KAAK/H,EAAAA,GAAAA,IACH2H,KAAKtB,OAASsB,KAAKyB,aAAarB,GAAMiB,cAkB1C,OAdArB,KAAKtB,QAAQgD,SAASX,IACpBf,KAAK2B,eAAeZ,GAEff,KAAKc,cAAcC,KAEnBA,EAAEpQ,SAEIoQ,EAAEa,SAAWb,EAAEa,OAAOA,OAC/B5B,KAAKrB,QAAQkD,KAAKd,GACTA,EAAEa,QAAYb,EAAEa,OAAOA,QAAUb,EAAEpQ,UAC5CqP,KAAKpB,WAAWiD,KAAKd,GAJrBf,KAAK9I,MAAM2K,KAAKd,GAKlB,IAGKf,KAAKW,eACd,CAEAgB,eAAeZ,GACbhJ,OAAO+J,OAAOf,EAAG,CACfjM,KAAMiM,EAAEX,KAAKtL,KACbsD,YAAa2I,EAAEX,KAAKhI,YACpB2J,KAAMhB,EAAEX,KAAK2B,KACb5K,WAAY4J,EAAEX,KAAKjJ,WACnBkE,EAAG0F,EAAEtB,GACLnE,EAAGyF,EAAEnB,GACL1G,GAAI6H,EAAEvB,GAAKuB,EAAEtB,GACbtG,GAAI4H,EAAEpB,GAAKoB,EAAEnB,IAEjB,CAEAO,aAAa6B,GACX,MAAO,CACLlN,KAAM,OACNnE,SAAU,CACR,CACEmE,KAAM,QACNnE,SAAUqR,IAGdC,iBAAkB,EAEtB,CAEAC,YAAenB,GAETA,EAAEC,QAAUC,EAAAA,GAAAA,KACP,CACLjB,KAAKvB,SAAS5B,QAAQC,IACtBkD,KAAKvB,SAAS5B,QAAQE,MACtBiD,KAAKvB,SAAS5B,QAAQG,OACtBgD,KAAKvB,SAAS5B,QAAQI,MAKtB8D,EAAEC,QAAUC,EAAAA,GAAAA,SACVjB,KAAKnB,SAAWN,EAAgB4D,oBAAoBpB,EAAGf,KAAKvB,UACvD,CACLuB,KAAKvB,SAASb,SAASf,QAAQC,IAAMkD,KAAKvB,SAASb,SAASN,OAAOE,OACnEwC,KAAKvB,SAASb,SAASf,QAAQE,MAC/BiD,KAAKvB,SAASb,SAASf,QAAQG,OAC/BgD,KAAKvB,SAASb,SAASf,QAAQI,MAI5B,CACLsB,EAAgB6D,qBAAqBtF,IACrCyB,EAAgB6D,qBAAqBrF,MACrCwB,EAAgB6D,qBAAqBpF,OACrCuB,EAAgB6D,qBAAqBnF,MAKlC,CACL+C,KAAKvB,SAASrB,OAAOP,QAAQC,IAAMkD,KAAKvB,SAASrB,OAAOE,OAAOE,OAC/DwC,KAAKvB,SAASrB,OAAOP,QAAQE,MAC7BiD,KAAKvB,SAASrB,OAAOP,QAAQG,OAC7BgD,KAAKvB,SAASrB,OAAOP,QAAQI,MAIjCoF,eAAkBtB,GAEZA,EAAEC,QAAUC,EAAAA,GAAAA,KACP,CACLjB,KAAKvB,SAAS5B,QAAQC,IACtBkD,KAAKvB,SAAS5B,QAAQE,MACtBiD,KAAKvB,SAAS5B,QAAQG,OACtBgD,KAAKvB,SAAS5B,QAAQI,MAKtB8D,EAAEC,QAAUC,EAAAA,GAAAA,SACV1C,EAAgB4D,oBAAoBpB,EAAGf,KAAKvB,UACvC,CACLuB,KAAKvB,SAASb,SAASf,QAAQC,IAAMkD,KAAKvB,SAASb,SAASN,OAAOE,OACnEwC,KAAKvB,SAASb,SAASf,QAAQE,MAC/BiD,KAAKvB,SAASb,SAASf,QAAQG,OAC/BgD,KAAKvB,SAASb,SAASf,QAAQI,MAI5B,CACLsB,EAAgB+D,wBAAwBxF,IACxCyB,EAAgB+D,wBAAwBvF,MACxCwB,EAAgB+D,wBAAwBtF,OACxCuB,EAAgB+D,wBAAwBrF,MAKrC,CACL+C,KAAKvB,SAASrB,OAAOP,QAAQC,IAAMkD,KAAKvB,SAASrB,OAAOE,OAAOE,OAC/DwC,KAAKvB,SAASrB,OAAOP,QAAQE,MAC7BiD,KAAKvB,SAASrB,OAAOP,QAAQG,OAC7BgD,KAAKvB,SAASrB,OAAOP,QAAQI,MAIjCsF,kBAAoBA,CAGlBC,EACAC,EACAC,KAGA,MAAMC,EAAUF,EAAE9C,GAAM8C,EAAE7C,GAC1B,OAAI6C,EAAEzB,QAAUC,EAAAA,GAAAA,QAAoB2B,OAAOC,SAASF,IAAYA,EAAU3C,KAAKlB,gBACtE2D,EAAEzM,MAASwM,EAAExM,MAGlB0M,EAAMI,eAAeN,EAAEpC,KAAKtL,OAAS4N,EAAMI,eAAeL,EAAErC,KAAKtL,MAC5D4N,EAAMD,EAAErC,KAAKtL,MAAQ4N,EAAMF,EAAEpC,KAAKtL,MAEpC2N,EAAEzM,MAASwM,EAAExM,KAAM,EAG5B+M,cAAgBA,CAAC3C,EAAmBsC,IAClCM,EAAAA,IACa5C,GACV6C,KAAKlC,GAAMA,EAAE/K,QACbkN,MAAK,CAACV,EAAGC,IAAMzC,KAAKuC,kBAAkBC,EAAGC,EAAGC,KAEjDS,YAAcA,CAAC3E,EAAehB,KAC5B,MAAM4F,EAAYpD,KAAK9R,OAASmK,EAAAA,GAAAA,MAAkB2H,KAAKqC,eAAiBrC,KAAKkC,YAE7E,OAAOc,EAAAA,MAEJK,KAAK,CAAC7E,EAAOhB,IACb6B,OAAM,GACNiE,KAAKN,EAAAA,IAAAA,MAAyB,IAC9BO,YAAYxC,GAAMqC,EAAUrC,GAAG,KAC/ByC,cAAczC,GAAMqC,EAAUrC,GAAG,KACjC0C,eAAe1C,GAAMqC,EAAUrC,GAAG,KAClC2C,aAAa3C,GAAMqC,EAAUrC,GAAG,IAAG,EAGxC4C,oBAAoBvD,EAAmBxB,GACrC,OAAOwB,EAAKzP,SAAS,GAAGA,SAASS,QAAO,SAAU2P,GAChD,OAAOnC,EAAWgF,MAAMC,GAAMA,IAAM9C,EAAEjM,MACxC,GACF,CAEAgP,iBAAiB1D,EAAmBzB,GAClC,OAAOyB,EAAKzP,SAASS,QAAO,SAAU2P,GACpC,OAAOpC,EAAQiF,MAAMG,GAAMA,IAAMhD,EAAEjM,MACrC,GACF,CAEAkP,gBAAgB5D,EAAmBsC,GAAoC,IAAxBuB,EAAclU,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAC3D,MAAMmU,EAAgB3F,EAAgB4F,gBAAgBnE,KAAKxB,MAAOwB,KAAK9R,MAAM,GACvEkW,EAAUpE,KAAKmD,YAAYnD,KAAKxB,MAAO0F,GACvCG,EAAYrE,KAAK+C,cAAc3C,EAAMsC,GACrC4B,EAAoBtE,KAAKxC,SAAW0G,EAG1C,IAAIhN,EAAQkN,EAAQC,GAapB,OAVIrE,KAAKxC,SAAW0G,GAClBE,EAAQd,KAAKN,EAAAA,KAAsBK,KAAK,CAACrD,KAAKxB,MAAOwB,KAAKxC,UAKxDyG,GAAkBK,KACpBpN,EAAQkN,EAAQlN,EAAMgM,MAAK,CAACV,EAAGC,IAAMzC,KAAKuC,kBAAkBC,EAAGC,EAAGC,OAG7DxL,CACT,CAEAkK,eAAehB,GACb,MAAMlJ,EAAQ8I,KAAKgE,gBAAgB5D,EAAMnB,EAAAA,IAGnCsF,EAAkBrN,EAAMJ,MAAMwI,GAA4B,cAAnBA,EAAKc,KAAKtL,OACjD0P,EAAmBtN,EAAMJ,MAAMwI,GAA4B,eAAnBA,EAAKc,KAAKtL,OAClD2P,EAAkBF,EAAgB5E,GAAK4E,EAAgB3E,GACvD8E,EAAmBF,EAAiB7E,GAAK6E,EAAiB5E,GAchE,OAZA2E,EAAgBI,WAAWrF,IACrBA,EAAKK,GAAKL,EAAKM,GAAK,IACxBN,EAAKM,IAAM8E,EACXpF,EAAKK,IAAM+E,EAAgB,IAG7BF,EAAiBG,WAAWrF,IACtBA,EAAKK,GAAKL,EAAKM,GAAK,IACxBN,EAAKM,IAAM6E,EACXnF,EAAKK,IAAM8E,EAAe,IAGrBvN,CACT,CAEAoK,cAAclB,GACZ,OAAOJ,KAAKgE,gBAAgB5D,EAAMnB,EAAAA,GACpC,CAEAsC,kBAAkBnB,EAAiBnR,GAAwC,IAAtC,QAAE2V,GAAkC3V,EACvE,MAAMyT,EAAQkC,EAAU3F,EAAAA,GAA+BA,EAAAA,GAEvD,OAAOe,KAAKgE,gBAAgB5D,EAAMsC,GAAO,EAC3C,CAEAjB,aAAarB,GACX,OAAOJ,KAAKgE,gBAAgB5D,EAAMnB,EAAAA,GACpC,CAEAuC,eAAkBpB,IAChB,MACMlB,EAAQc,KAAKxB,MADG,KAEtB,IAAItH,EAAyD,GAE7D,IAAK,IAAI2N,EAAgB,EAAGA,EAAgB5F,EAAAA,GAAAA,OAAmC4F,IAAiB,CAC9F,MAAMjH,EAAWqB,EAAAA,GAA2B4F,GACtCC,EAAY1F,KAAKC,MAAMzB,EAASvC,EAAI6D,GACpC6F,EAAY3F,KAAKC,MAAMzB,EAAStC,EAAI4D,GACpC8F,EAAgB5F,KAAKC,MAAMzB,EAAS1E,GAAKgG,GACzC+F,EAAiB7F,KAAKC,MAAMzB,EAASzE,GAAK+F,GAE1CgG,EAAiBlF,KAAK2D,oBAAoBvD,EAAMxC,EAASrC,WACzD4J,EAAOnF,KAAKG,aAAa+E,GACzBb,EAAYrE,KAAK+C,cAAcoC,EAAMlG,EAAAA,IAErCmG,EADUpF,KAAKmD,YAAY6B,EAAeC,EAC3Bb,CAAQC,GAU7B,GARAe,EAAaC,MAAMtE,IACjBA,EAAEtB,IAAMqF,EACR/D,EAAEvB,IAAMsF,EACR/D,EAAEnB,IAAMmF,EACRhE,EAAEpB,IAAMoF,CAAS,IAIG,kBAAlBnH,EAAS9I,KAA0B,CACrC,MAAMwQ,EAASF,EAAatO,MAAMiK,GAAsB,WAAhBA,EAAEX,KAAKtL,OACzCyQ,EAAWH,EAAatO,MAAMiK,GAAsB,aAAhBA,EAAEX,KAAKtL,OAC3C0Q,EAAcF,EAAO9F,GAAK8F,EAAO7F,GACjCgG,EAAgBF,EAAS/F,GAAK+F,EAAS9F,GAE7C2F,EAAaC,MAAMtE,IACb,CAACA,EAAEa,QAAQxB,KAAKtL,KAAMiM,EAAEX,KAAKtL,MAAMxF,SAAS,WAC9CyR,EAAEtB,IAAMgG,EACR1E,EAAEvB,IAAMiG,IAER1E,EAAEtB,IAAM+F,EACRzE,EAAEvB,IAAMgG,EACV,GAEJ,CAEAtO,EAAQA,EAAMwO,OAAON,EAAa/D,cACpC,CAEA,OAAOnK,CAAK,E,4ECnaT,IAAKmB,EAAS,SAATA,GAAS,OAATA,EAAS,aAATA,EAAS,YAATA,EAAS,qBAATA,EAAS,UAATA,EAAS,oBAATA,EAAS,sBAATA,EAAS,2BAATA,CAAS,MAUThB,EAAY,SAAZA,GAAY,OAAZA,EAAY,aAAZA,EAAY,cAAZA,EAAY,eAAZA,EAAY,qBAAZA,EAAY,mBAAZA,EAAY,eAAZA,EAAY,qBAAZA,EAAY,wBAAZA,EAAY,qBAAZA,EAAY,8BAAZA,EAAY,4BAAZA,EAAY,uBAAZA,EAAY,sBAAZA,EAAY,oBAAZA,EAAY,oBAAZA,EAAY,mBAAZA,EAAY,4BAAZA,EAAY,wBAAZA,EAAY,wBAAZA,EAAY,oCAAZA,EAAY,oCAAZA,EAAY,wCAAZA,EAAY,wCAAZA,CAAY,MA2BZI,EAAO,SAAPA,GAAO,OAAPA,EAAO,kBAAPA,EAAO,cAAPA,EAAO,gBAAPA,EAAO,qBAAPA,EAAO,mBAAPA,EAAO,eAAPA,EAAO,yBAAPA,EAAO,sBAAPA,EAAO,+BAAPA,EAAO,6BAAPA,EAAO,wBAAPA,EAAO,uBAAPA,EAAO,qBAAPA,EAAO,qBAAPA,EAAO,oBAAPA,EAAO,6BAAPA,EAAO,yBAAPA,EAAO,6BAAPA,EAAO,6BAAPA,CAAO,MAuBDwJ,EAAS,SAATA,GAAS,OAATA,EAAAA,EAAS,eAATA,EAAAA,EAAS,mBAATA,EAAAA,EAAS,uBAATA,EAAAA,EAAS,eAATA,CAAS,K,gPCzCpB,SAAS0E,EAAUC,GACxB,MAAMC,EAAQD,EAAEE,cAA8BC,wBAE9C,MAAO,CACLC,QAASJ,EAAEK,QAAUJ,EAAK5I,KAC1BiJ,QAASN,EAAEO,QAAUN,EAAK/I,IAE9B,CAEO,SAASsJ,IAEd,MAAiC,UADnB,IAAIC,gBAAgB3U,OAAO4U,SAASC,QACrCC,IAAI,WACnB,CAEO,SAASC,EAAsBvY,EAAiB2Q,GACrD,OAAIA,EACE3Q,IAASmK,EAAAA,GAAAA,MACJ8F,EAAAA,GAEFF,EAAAA,GAGFrB,EAAAA,EACT,CAOO,SAAS8J,EACdtG,EACAuG,EACA/E,GAEA,OAAOxB,EAAKwG,KAAKC,IACf,MAAMC,EAAS,IACVD,EACHjF,SACAG,KAAO4E,EAASzP,MAAiC2P,EAAI/R,MACrDqC,WAAYwP,EAASxP,WAAW0P,EAAI/R,OAKtC,OAFAgS,EAAOnW,SAAWkW,EAAIlW,SAAW+V,EAAgBG,EAAIlW,SAAUgW,EAAUG,QAAU7W,EAE5E6W,CAAM,GAEjB,CAsBO,SAASC,EAAWC,EAAsBL,GAC/C,MAAOvG,GAAQsG,EAAgB,CAACM,GAAUL,GAE1C,OAvBK,SAAmBK,GACxB,IAAIrI,EAA2B,GAC3BC,EAAgC,GAChC1H,EAAuB,GAc3B,OAZA8P,EAAQrW,UAAU+Q,SAAStE,IACzBuB,EAAQkD,KAAKzE,GACbA,EAAOzM,UAAU+Q,SAAS9D,IACxBgB,EAAWiD,KAAKjE,GAChBA,EAASjN,UAAU+Q,SAASuF,IACpBA,EAAQ/N,GAAK,GAAK+N,EAAQ9N,GAAK,GACnCjC,EAAM2K,KAAKoF,EACb,GACA,GACF,IAGG,CAAEtI,UAASC,aAAY1H,QAChC,CAKSgQ,CAAU9G,EACnB,CAEO+G,eAAeC,EAAcC,EAAkBC,GAGpD,aAFuBC,MAAO,SAAQF,SAAgBC,MAEtCE,MAClB,CAuBA,SAASC,EAAqBjJ,EAAetQ,EAAiB2Q,GAC5D,MAAM6I,EAAWtI,KAAKuI,IAAInJ,EAAO9F,EAAAA,IACjC,MAAO,CACL8F,MAAOkJ,EACPlK,OAAQe,EAAAA,EAAAA,gBAAgCmJ,EAAUxZ,EAAM2Q,GAE5D,CAoCO,SAAS+I,EAAQnW,EAA6BvD,EAAiB2Q,GACpE,MAAMgJ,EAAgBC,SAASC,eAAe,kBAE9C,IAAKtW,EACH,MAAO,CAAE+M,MAAO,EAAGhB,OAAQ,GAI7B,MAAMwK,EAAQ,IAAI3B,gBAAgB3U,OAAO4U,SAASC,QAClD,GAAIyB,EAAMC,IAAI,SAAU,CACtB,MAAMzJ,EAAQoE,OAAOoF,EAAMxB,IAAI,UACzB0B,EAAcF,EAAMC,IAAI,SAAWE,WAAWH,EAAMxB,IAAI,eAAavW,EACrEiP,EAAQ0D,OAAOC,SAASqF,GAAeA,OAAcjY,EAC3D,MAAO,CACLuO,QACAhB,OAAQe,EAAAA,EAAAA,gBAAgCC,EAAOtQ,EAAM2Q,EAASK,GAElE,CAGA,OAAI4I,SAASM,KAAKC,UAAUC,SAAStR,EAAAA,IAnFvC,SAA+BvF,EAAsB8W,EAA6Bra,EAAiB2Q,GACjG0J,GAASC,MAAMC,eAAe,aAC9B,IAAIpF,EAAOoE,EAAqBhW,EAAQG,YAAa1D,EAAM2Q,GAC3D,MAAM6J,EAAgBtJ,KAAKuI,IAAIjW,OAAOiX,YAAc9P,EAAAA,GAAgB,GAAIF,EAAAA,IAGxE,GAAI0K,EAAK7F,OAASkL,EAAe,CAC/B,MAAME,EAAWrK,EAAAA,EAAAA,eAA+BmK,EAAexa,EAAM2Q,GACrEwE,EAAO,CACL7E,MAAOoK,EACPpL,OAAQe,EAAAA,EAAAA,gBAAgCqK,EAAU1a,EAAM2Q,GAE5D,CAMA,OAJI0J,IACFA,EAAQC,MAAMK,SAAY,GAAExF,EAAK7E,WAG5B6E,CACT,CAiEWyF,CAAsBrX,EAASoW,EAAe3Z,EAAM2Q,GAGzD3Q,IAASmK,EAAAA,GAAAA,YACJ,CAAEmF,OAAQ/L,EAAQsX,aAAcvK,MAAO/M,EAAQG,aA3D1D,SAA8BH,EAAsB8W,EAA6Bra,EAAiB2Q,GAE5F0J,GAASC,MAAMK,UACjBN,EAAQC,MAAMC,eAAe,aAG/B,IAAIpF,EAAOoE,EAAqBhW,EAAQG,YAAa1D,EAAM2Q,GAG3DpN,EAAQ+W,MAAMhL,OAAU,GAAE6F,EAAK7F,OAAS3E,EAAAA,OAGxC,MAAMmQ,EAAiBtX,OAAOC,WAAamW,SAASmB,gBAAgBrX,YAgBpE,OAdEF,OAAOC,WAAa,MACpBD,OAAOC,WAAa,OACnBmW,SAASM,KAAKC,UAAUC,SAAS,iBACjCR,SAASM,KAAKC,UAAUC,SAAS,iBACdU,EAAiB,EACrC3F,EAAOoE,EAAqBhW,EAAQG,YAAc,GAAI1D,EAAM2Q,GAGnDwE,EAAK7E,QAAU/M,EAAQG,cAChCyR,EAAOoE,EAAqBhW,EAAQG,YAAa1D,EAAM2Q,IAGzDpN,EAAQ+W,MAAMC,eAAe,UAEtBpF,CACT,CAiCS6F,CAAqBzX,EAASoW,EAAe3Z,EAAM2Q,EAC5D,CAKO,SAASsK,IACd,OAAIC,EAAAA,EAAAA,MACK,CAAC,EAAG,KAGT,iCAAiCzS,KAAK0S,UAAUC,WAC3C,CAAC,EAAG,IAAK,MAGX,CAAC,EAAG,IAAK,KAAM,EACxB,CAEO,SAASC,EAAoBnJ,GAClC,IAAKA,EAAM,OAEX,MAAMlJ,EAAgC,CAAC,EACjCC,EAAqC,CAAC,EAE5C,IAAK,MAAMiG,KAAUgD,EAAKzP,SACxB,IAAK,MAAMiN,KAAYR,EAAOzM,SAC5B,IAAK,MAAM2O,KAAQ1B,EAASjN,cACRV,IAAdqP,EAAKyC,OACP7K,EAAMoI,EAAKxK,MAAQwK,EAAKyC,WAEF9R,IAApBqP,EAAKnI,aACPA,EAAWmI,EAAKxK,MAAQwK,EAAKnI,YAMrC,MAAO,CACLD,QACAC,aACAC,QAASC,EAAAA,GAAAA,QACTmS,QAAS,EAEb,CASO,SAASC,EAAyBnK,GACvC,IAAKA,EAAM,MAAO,GAElB,MAAMoK,EAAkBpK,EAAKsC,OAAOjR,SAE9BgZ,EADUD,EAAgB1Z,OANJ,GADL,GADN,GAUX4Z,EAAcxK,KAAKyK,OAAOnY,OAAOiX,YAZZ,IAYiD,GAA0BgB,GAOtG,OANwBD,EACrBI,QACA5G,MAAK,CAACV,EAAGC,IAAMA,EAAEvJ,GAAKuJ,EAAEtJ,GAAKqJ,EAAEtJ,GAAKsJ,EAAErJ,KACtC2Q,MAAM,EAAG1K,KAAK9I,IAAIsT,EAjBA,MAkBlBhD,KAAKmD,GAAMA,EAAEjV,MAGlB,CAEO,SAASkV,EAAW/a,GAUxB,IAVyB,QAC1BmV,EAAO,KACP9E,EAAI,SACJ1B,EAAQ,OACRR,GAMDnO,EACC,GAAIqQ,EAEF,YADA5N,OAAOuY,KAAM,iBAAgB3K,EAAKxK,QAIpC,MAAMkT,EAAQ,IAAI3B,gBAIlB,GAHA2B,EAAMkC,IAAIC,EAAAA,GAAAA,KAAoBC,EAAAA,GAAAA,SAAAA,YAG1BhG,EAAQlW,OAASmK,EAAAA,GAAAA,IAAe,CAClC,IAAIgS,EAAoB,GAYxB,OAXIzM,EACFyM,EAAUzM,EAASjN,SAASiW,KAAKtH,GAASA,EAAKxK,OACtCsI,IACTiN,EAAUjN,EAAOzM,SAAS2Z,SAAS1M,GAAaA,EAASjN,SAASiW,KAAKtH,GAASA,EAAKxK,eAGnFuV,EAAQra,SACVgY,EAAMkC,IAAIC,EAAAA,GAAAA,QAAuBE,EAAQE,KAAK,MAC9C7Y,OAAOuY,KAAM,kBAAiBjC,MAIlC,CAEA,GAAIpK,EAAU,CACZ,MAAMrG,EAAKqG,EAAS9I,KAAK0V,QAAQ,aAAc,IAAIC,cAC7CrZ,EAASgT,EAAQlW,OAASmK,EAAAA,GAAAA,MAAkB,MAAQ,MAE1D2P,EAAMkC,IAAIC,EAAAA,GAAAA,QAAwB,GAAE/Y,KAAUmG,KAC9C7F,OAAOuY,KAAM,kBAAiBjC,IAChC,MAAO,GAAI5K,EAAQ,CACjB,MAAM7F,EAAK6F,EAAOtI,KAAK0V,QAAQ,aAAc,IAAIC,cAEjDzC,EAAMkC,IAAIC,EAAAA,GAAAA,QAAwB,OAAM5S,KACxC7F,OAAOuY,KAAM,kBAAiBjC,IAChC,CACF,CAAC,IAEI0C,EAAuB,SAAvBA,GAAuB,OAAvBA,EAAAA,EAAuB,kBAAvBA,EAAAA,EAAuB,mBAAvBA,EAAAA,EAAuB,6CAAvBA,CAAuB,EAAvBA,GAAuB,IAMrB,SAASC,IAI4C,IAJrB,KACrCC,EAAOF,EAAwBG,MAAK,QACpCC,EAAUJ,EAAwBK,mBAAkB,KACpDC,EAAON,EAAwBO,MACoBlb,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACvD,MAAMqG,EAAYlG,eAAevB,eACjC,IAAIuc,EAAwBN,EAO5B,OANKxU,GAEO+U,EAAAA,EAAAA,OACVD,EAAwBJ,GAFxBI,EAAwBF,EAKnBE,CACT,C,wDCzUO,MAAME,EAAoB,WAE5B,IADH7E,EAAMxW,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG2B,OAAO4U,SAASC,OAEzB,MAAM8E,EAAO9E,EAAO+E,UAAU,GAAGC,MAAM,KACjCC,EAAkB,CAAC,EAOzB,OANAH,EAAK3J,SAAS+J,IACZ,MAAMC,EAAeD,EAAKE,QAAQ,KAChClL,EAAMmL,mBAAmBH,EAAKH,UAAU,EAAGI,IAC3C1V,EAAQ4V,mBAAmBH,EAAKH,UAAUI,EAAe,IAC3DF,EAAI/K,GAAOzK,CAAK,IAEXwV,CACT,EAEaK,EAAoB,SAAU7T,GAAsD,IAAlC8T,EAA2B/b,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC3F,OAAOgI,OAAOgU,KAAK/T,GAAQgU,QAAO,CAACC,EAAMxL,KACvC,MAAMzK,EAAQgC,EAAOyI,GACrB,OAAK,CAAC,GAAI,UAAMxQ,GAAWX,SAAS0G,IAAU8V,EAAkBxc,SAAS0G,GAChEiW,GAAQA,EAAKjc,OAAS,EAAI,IAAM,IAAMkc,mBAAmBzL,GAAO,IAAMyL,mBAAmBlW,GAE3FiW,CAAI,GACV,GACL,C,iLCbA,MAAME,EAA4B,CAChC,CACErX,KAAM,OACNzG,MAAO,QAET,CACEyG,KAAM,SACNzG,MAAO,WAET,CACEyG,KAAM,UACNzG,MAAO,aAII,SAAS+d,EAAgB/b,GACtC,MAAMgc,EAAena,IAAAA,aACnB,CAACoa,EAAuCxX,KACtC,MAAMyX,EAAUD,EAAGxG,cAAcyG,QAE7BA,IAAYlc,EAAMmc,QAAQC,SAASpc,EAAMqc,WAAWF,IAAM,IAAWA,EAAQC,SAAS,MAC1Fpc,EAAM8B,UAAU8Z,IAAI,IAAWA,EAAM,CAACnX,GAAOyX,KAAW,GAE1D,CAAClc,IAGH,OACEjB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uBAAsBwB,SAClCwb,EAAOvF,KAAK+F,IACXvd,EAAAA,EAAAA,KAACwd,EAAAA,SAAQ,CAEP/N,SAAO,EACP0N,QAASlc,EAAMC,MAAMqc,EAAM7X,MAC3B+X,SAAWjH,GAAMyG,EAAazG,EAAG+G,EAAM7X,MAAMnE,SAE5Cgc,EAAMte,OALFse,EAAM7X,SAUrB,C,mCCxCO,SAASgY,EAAU7d,GAA6C,IAA5C,KAAE6F,EAAI,MAAEzG,KAAUgC,GAAwBpB,EACnE,MAAO8d,EAAUC,GAAe9a,EAAAA,SAAe7B,EAAMC,MAAMwE,IAAS,IAE9DmY,EAAa/a,EAAAA,aAChBoa,IACC,MAAMY,EAAQZ,EAAGxG,cAAcqH,cAE3BD,EAAQ,GAAK7c,EAAMmc,SAAS1X,IAAOzE,EAAMqc,WAAWF,IAAM,IAAWA,EAAQ,CAAC1X,IAAO,MACzFzE,EAAM8B,UAAU8Z,IAAI,IAAWA,EAAM,CAACnX,GAAOoY,KAAS,GAExD,CAACpY,EAAMzE,IAGH+c,EAAiB/c,EAAMmc,SAAS1X,GAAQ,sDAAmD7E,EAOjG,OALAiC,EAAAA,WAAgB,KACd,MAAMmb,EAAazK,OAA6B,KAAtBvS,EAAMC,MAAMwE,GAAezE,EAAMC,MAAMwE,QAAQ7E,GACpEqd,MAAMD,IAAaL,EAAYK,EAAWpY,WAAW,GACzD,CAACH,EAAMzE,EAAMC,SAGdlB,EAAAA,EAAAA,KAACme,EAAAA,aAAY,CACXC,sBAAsB,EACtB1Y,KAAMA,EACNzG,MAAOA,EACPof,mBAAmB,EACnBC,QAASN,EACTlf,KAAK,SACLiB,UAAWwe,IAAW,CAAE,WAAYtd,EAAMmc,SAAS1X,KACnDkB,MAAO+W,EACPF,SAAWP,GAAOU,EAAYV,EAAGxG,cAAc9P,OAC/C4X,OAAQX,EACRY,aAAa,MACbT,eAAgBA,EAChBU,eAAa,GAGnB,C,0BCnCA,MAAMC,EAAkC,CACtCC,OAAQ,GACRC,MAAM,EACNC,QAAQ,EACRC,SAAS,EACTC,WAAY,GACZC,WAAY,IASC,SAASC,EAAWrf,GAAkD,IAAjD,OAAE+e,EAAM,SAAEO,EAAQ,QAAEC,GAA2Bvf,EACjF,MAAOqB,EAAO6B,GAAYD,IAAAA,SAAe,IAAK6b,EAAeC,YACtDxB,EAAQE,GAAaxa,IAAAA,SAA2B,CAAC,IACjDuc,EAAUC,GAAexc,IAAAA,WAC1Byc,EAAUzc,IAAAA,OAA8B,OAE9C0c,EAAAA,EAAAA,GAAqBpC,GA0BrB,OACE/b,EAAAA,EAAAA,MAACoe,EAAAA,GAAmC,CAACC,yBAAuB,EAAAne,SAAA,EAC1DvB,EAAAA,EAAAA,KAAC2f,EAAAA,WAAU,CAAApe,UACTF,EAAAA,EAAAA,MAAA,QACE8G,GAAG,oBACHpI,UAAU,YACVmE,IAAKqb,EACLK,YAAU,EACVC,aAAa,MACbV,SAjCapH,UACnBwF,EAAMuC,iBAEN,MAAM,QAAEC,EAAO,OAAE3C,SCnCdrF,eAA6B7W,GAClC,MAAM8e,EAAyB,CAAC,EAEhC,QAAqBnf,IAAjBK,EAAM0d,QAAuD,IAA/B1d,EAAM0d,OAAOqB,OAAOrf,OACpDof,EAAWpB,QAAS,OACf,QAAqB/d,IAAjBK,EAAM0d,OAAsB,CACrC,MAAMsB,QAAyBC,EAAAA,EAAAA,IAAgB,CAACjf,EAAM0d,OAAOhZ,gBAC7Doa,EAAWpB,QAAiC,IAAxBsB,EAAiB,EACvC,CAEyB,KAArBhf,EAAM8d,YAAqBxL,OAAOtS,EAAM8d,aAAe,IACzDgB,EAAWhB,YAAa,GAGD,KAArB9d,EAAM+d,YAAqBzL,OAAOtS,EAAM+d,aAAe,IACzDe,EAAWf,YAAa,GAG1B,MAAMmB,EAAgB,IAAKlf,EAAO0d,YAAQ/d,GAI1C,cAHOuf,EAAcxB,OACrBoB,EAAW3C,QAAU1U,OAAOC,OAAOwX,GAAeC,OAAOC,GAAwB,IAAZA,IAAkBA,IAEhF,CAAEP,SAAUpX,OAAOC,OAAOoX,GAAYxL,KAAK+L,SAAUnD,OAAQ4C,EACtE,CDYsCQ,CAActf,GAGhD,GAFAoc,EAAUF,IAEL2C,EACH,OAGF,MAAMU,EAAQ9X,OAAO+J,OACnBxR,EAC4B,iBAArBA,EAAM8d,YAA2B,CAAEA,WAAY,MAC1B,iBAArB9d,EAAM+d,YAA2B,CAAEA,WAAY,OAGlDyB,QCvBH3I,eAAsB0I,GAC3B,IAEE,aADME,EAAAA,EAAAA,IAAmBF,GAClB,CAAEG,WAAW,EAYtB,CAXE,MAAOtC,GACP,MAAMoC,EAAS,CACbE,WAAW,EACXC,QAAS,uGAEX,GAAMvC,GAA0B,iBAAVA,GAAsB,SAAUA,EAAO,CAC3D,MAAMe,EAAWf,EACjBoC,EAAOG,QAAUxB,EAASrG,IAC5B,CAEA,OAAO0H,CACT,CACF,CDOyBI,CAAOL,GACvBC,EAAOE,UAGVzB,IAFAG,EAAYoB,EAAOG,QAGrB,EAY6Btf,SAAA,EAEvBvB,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAC9M,KAAK,QAAQlU,UAAU,eAAcwB,SAAC,6DAG/C8d,GAAYjC,EAAOC,WACnBrd,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAC9M,KAAK,QAAQlU,UAAU,iCAAgCwB,SAC/D8d,GAAY,4CAGjBrf,EAAAA,EAAAA,KAACghB,EAAAA,EAAgB,CAAC/hB,MAAM,SAASgiB,MAAO/f,EAAOkc,OAAQA,EAAQra,SAAUA,EAAUua,UAAWA,KAC9Ftd,EAAAA,EAAAA,KAACgd,EAAe,CAAC9b,MAAOA,EAAO6B,SAAUA,EAAUua,UAAWA,KAC9Dtd,EAAAA,EAAAA,KAAC0d,EAAU,CACThY,KAAK,aACLzG,MAAM,cACNiC,MAAOA,EACPkc,OAAQA,EACRra,SAAUA,EACVua,UAAWA,KAEbtd,EAAAA,EAAAA,KAAC0d,EAAU,CACThY,KAAK,aACLzG,MAAM,cACNiC,MAAOA,EACPkc,OAAQA,EACRra,SAAUA,EACVua,UAAWA,UAIjBjc,EAAAA,EAAAA,MAAC6f,EAAAA,aAAY,CAAA3f,SAAA,CACV6d,IACCpf,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACriB,KAAK,SAASsiB,QAAShC,EAAQ7d,SAAC,WAI1CvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACriB,KAAK,SAASuiB,KAAK,oBAAoBC,MAAM,OAAM/f,SAAC,cAMpE,CErGe,SAASggB,EAAc1hB,GAAmC,IAAlC,QAAEuf,GAA8Bvf,EACrE,OACEwB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAC2f,EAAAA,WAAU,CAAApe,UACTF,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,kBAAiBwB,SAAA,EAC9BvB,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAAxf,SAAC,iCACXvB,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAAxf,SAAC,4CAGfF,EAAAA,EAAAA,MAAC6f,EAAAA,aAAY,CAAA3f,SAAA,CACV6d,IAAWpf,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACC,QAAShC,EAAQ7d,SAAC,WACtCvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACK,GAAG,IAAIC,KAAK,eAAeH,MAAM,OAAM/f,SAAC,iBAMxD,CCfO,SAASmgB,EAAW7hB,GAAmD,IAAlD,OAAE+e,EAAM,QAAEQ,EAAO,UAAEuC,GAA6B9hB,EAC1E,MAAO+hB,EAAaC,GAAkB/e,IAAAA,UAAe,GAYrD,OACEzB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAC8hB,EAAAA,aAAY,CAACC,aAAc3C,EAAQ7d,SAAC,iBAEpCqgB,GACC5hB,EAAAA,EAAAA,KAACuhB,EAAc,CAACnC,QAASA,KAEzBpf,EAAAA,EAAAA,KAACkf,EAAW,CAACN,OAAQA,EAAQQ,QAASA,EAASD,SAjBzB6C,KACtBL,EAEFrf,OAAO4U,SAAW,eAIpB2K,GAAe,EAAK,MAcxB,C,sTCzBe,SAASI,EAAehhB,GACrC,MAAMgc,EAAena,IAAAA,aAClBoa,IACC,MAAMgF,EAAYhF,EAAGxG,cAAc9P,MAC/Bsb,EAAUjC,OAAOrf,QAAU,GAAKK,EAAMmc,QAAQ+E,eAChDlhB,EAAMqc,aAAaF,IAAM,IAAWA,EAAQ8E,WAAW,MAGzDjhB,EAAM8B,UAAU8Z,IAAI,IAAWA,EAAMsF,cAAeD,KAAa,GAEnE,CAACjhB,IAGGmhB,EAAetf,IAAAA,aAClBuf,IACCphB,EAAM8B,UAAU8Z,IAAI,IAAWA,EAAMyF,YAAaD,EAAOzb,UACzD3F,EAAMqc,aAAaF,IAAM,IAAWA,EAAQkF,aAAa,KAAS,GAEpE,CAACrhB,IAGG+c,EAAiB/c,EAAMmc,QAAQ+E,cAAgB,8BAA2BthB,EAEhF,OACEb,EAAAA,EAAAA,KAAAsB,EAAAA,SAAA,CAAAC,SACGN,EAAMshB,WAAW3hB,OAAS,GACzBS,EAAAA,EAAAA,MAAA,OAAAE,SAAA,EACEvB,EAAAA,EAAAA,KAAA,SAAO0F,KAAK,cAAc5G,KAAK,SAAS8H,MAAO3F,EAAMC,MAAMohB,eAC3DtiB,EAAAA,EAAAA,KAACwiB,EAAAA,OAAM,CACLvO,KAAK,QACLhV,MAAM,YACNwjB,mBAAiB,EACjBC,eAAe,wCACf3iB,UAAU,OACV4iB,UAAW,CAAE5iB,UAAW,YACxB,aAAW,YACX6G,MAAO3F,EAAMC,MAAMohB,YACnBM,MAAO3hB,EAAMshB,WACb9E,SAAU2E,EACVS,+BAA6B,EAAAthB,SAE5BN,EAAMshB,WAAW/K,KAAKsL,IACrB9iB,EAAAA,EAAAA,KAAC+iB,EAAAA,aAAY,CAAAxhB,SAAmBuhB,EAAK7jB,OAAlB6jB,EAAKlc,eAK9B5G,EAAAA,EAAAA,KAACme,EAAAA,aAAY,CACXC,sBAAsB,EACtB1Y,KAAK,YACLuO,KAAK,QACLhV,MAAM,YACNwjB,mBAAiB,EACjBC,eAAe,wCACf9b,MAAO3F,EAAMC,MAAMihB,cACnB1E,SAAUR,EACV+F,UAAW,GACX1E,MAAOrd,EAAMmc,QAAQ+E,cACrBpiB,UAAWwe,IAAW,OAAQ,CAAE,WAAYtd,EAAMmc,QAAQ+E,gBAC1DnE,eAAgBA,EAChBS,aAAa,SAKvB,C,eCrEO,MAAMwE,EAAqB,uBCclC,MAAMtE,EAAsC,CAC1C2D,YAAa,EACbH,cAAe,GACfvD,OAAQ,GACRsE,YAAaC,EAAAA,GAAAA,MACb9e,KAAM0C,EAAAA,EAAe,IAAIzC,KAAQ8e,EAAAA,IACjCC,OAAQ,EACRvF,MAAO,GAGHwF,EAAsB,CAC1BH,EAAAA,GAAAA,UACGI,EAAAA,EAAAA,IAA6BC,EAAAA,GAAAA,QAChChM,KAAK5Q,IAAK,CAAQ3H,MAAOwkB,EAAAA,GAAkB7c,GAAQA,YAQtC,SAASsY,EAAWrf,GAAkD,IAAjD,OAAE+e,EAAM,QAAEQ,EAAO,SAAED,GAA4Btf,EACjF,MAAOqB,EAAO6B,GAAYD,IAAAA,SAAe,IAAK6b,EAAeC,YACtDxB,EAAQE,GAAaxa,IAAAA,SAA2B,CAAC,IACjDyf,EAAYmB,GAAiB5gB,IAAAA,SAAiC,KAC9Duc,EAAUC,GAAexc,IAAAA,WAC1Byc,EAAUzc,IAAAA,OAA8B,OAE9C0c,EAAAA,EAAAA,GAAqBpC,GAGrBta,IAAAA,WAAgB,KAed,IAdwBiV,WACtB,MAAM4L,QAAiBC,EAAAA,EAAAA,MACnBD,GAAYA,EAASpB,WAAW3hB,OAAS,IAC3CmC,GAAU8Z,IAAI,IAAWA,EAAMyF,YAAaqB,EAASpB,WAAW,GAAGpa,OACnEub,EAAcC,EAASpB,WAAW/K,KAAKqM,IAAC,CAAQjd,MAAOid,EAAE1b,GAAIlJ,MAAO4kB,EAAEne,UACxE,EAUAoe,GACMlF,GATe7G,WACrB,MAAMgM,QAAkBC,EAAAA,EAAAA,IAAiBpF,GACrCmF,GACFhhB,GAAU8Z,IAAI,IAAWA,EAAMiB,OAAQiG,KACzC,EAMEE,EAEa,CAAf,MAAO3F,GAAQ,IAIhB,IAEH,MA2BM4F,EAAc,CAClBjD,MAAO/f,EACPkc,SACAra,WACAua,YACAmF,mBAAmB,EACnB1iB,UAAW,OACX2iB,eAAgB,wCAChBzO,KAAM,SAGR,OACE5S,EAAAA,EAAAA,MAACoe,EAAAA,GAAmC,CAACC,yBAAuB,EAAAne,SAAA,EAC1DvB,EAAAA,EAAAA,KAAC2f,EAAAA,WAAU,CAAApe,UACTF,EAAAA,EAAAA,MAAA,QACE8G,GAAG,yBACHpI,UAAU,YACVmE,IAAKqb,EACLK,YAAU,EACVC,aAAa,MACbV,SA/CapH,UACnBwF,EAAMuC,iBAEN,MAAM,QAAEC,EAAO,OAAE3C,SDxEdrF,eAA6B7W,GAClC,MACM8e,EAAyB,KADZmE,EAAAA,EAAAA,IAAgBjjB,EAAOkiB,EAAAA,IAA4B,GACvBhG,QAM/C,GAJ0B,IAAtBlc,EAAMohB,aAA2D,IAAtCphB,EAAMihB,cAAclC,OAAOrf,SACxDof,EAAWmC,eAAgB,GAGH,IAAtBjhB,EAAMohB,YAAmB,CAC3B,MAAM8B,QAAsBC,EAAAA,EAAAA,IAAsBnjB,EAAMohB,eACnD8B,GAAiBA,EAAcE,cAAgBF,EAAcG,qBAAmBvE,EAAWsC,aAAc,EAChH,CAEA,IAAKtC,EAAWpB,OAAQ,CACtB,MAAMsB,QAAyBC,EAAAA,EAAAA,IAAgB,CAACjf,EAAM0d,OAAOhZ,gBAC7Doa,EAAWpB,QAAiC,IAAxBsB,EAAiB,EACvC,CAEA,MAAO,CAAEH,SAAUpX,OAAOC,OAAOoX,GAAYxL,KAAK+L,SAAUnD,OAAQ4C,EACtE,CCqDsCQ,CAActf,GAGhD,GAFAoc,EAAUF,IAEL2C,EACH,OAGF,MAAMkB,EAAQ,IACT/f,KACCA,EAAMgiB,cAAgBC,EAAAA,GAAAA,OAA8B,CACtD9e,KAAMsa,EAActa,KACpBgf,OAAQ1E,EAAc0E,OACtBvF,MAAOa,EAAcb,QAInB4C,QDnEH3I,eAA0B7W,GAC/B,IAAIsjB,EAAMtjB,EAAMohB,YAEhB,IACE,GAAMphB,EAAMihB,cAAe,CACzB,MAAMsC,QAAiCC,EAAAA,EAAAA,IAAiB,CACtDzJ,QAAS/Z,EAAM0d,OACfuD,cAAejhB,EAAMihB,gBAGvB,IAAKsC,EAA0B,MAAM,IAAIE,MACzC,GAAIzjB,EAAMgiB,cAAgBC,EAAAA,GAAAA,MAA4B,MAAO,CAAEvC,WAAW,GAE1E4D,EAAMC,EAAyBnC,WACjC,CAGA,aADMsC,EAAAA,EAAAA,IAAe,CAAEJ,OAAO,OAAQtjB,GAC/B,CAAE0f,WAAW,EAatB,CAZE,MAAOtC,GACP,MAAMoC,EAAS,CACbG,QAAS,uGACTD,WAAW,GAGb,GAAMtC,GAA0B,iBAAVA,GAAsB,SAAUA,EAAO,CAC3D,MAAMe,EAAWf,EACjBoC,EAAOG,QAAUxB,EAASrG,KAAK6H,OACjC,CAEA,OAAOH,CACT,CACF,CCoCyBmE,CAAW5D,GAC3BP,EAAOE,UAGVzB,EAASje,EAAMohB,aAFfhD,EAAYoB,EAAOG,QAGrB,EAuB6Btf,SAAA,EAErB6b,EAAOkF,aAAejD,KACtBrf,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAC9M,KAAK,QAAQlU,UAAU,iCAAgCwB,SAC/D8d,GAAY,yDAGjBrf,EAAAA,EAAAA,KAACiiB,EAAc,CACbM,WAAYA,EACZrhB,MAAOA,EACP6B,SAAUA,EACVqa,OAAQA,EACRE,UAAWA,KAEbtd,EAAAA,EAAAA,KAACghB,EAAAA,EAAgB,IAAKkD,EAAajlB,MAAM,YACzCe,EAAAA,EAAAA,KAAC8kB,EAAAA,EAAqB,IAChBZ,EACJjlB,MAAM,cACN8lB,gBAAiB,CAAEhlB,UAAW,YAC9BukB,aAAchB,IAEfpiB,EAAMgiB,cAAgBC,EAAAA,GAAAA,QACrB9hB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACglB,EAAAA,EAAc,IAAKd,EAAajlB,MAAM,UACvCe,EAAAA,EAAAA,KAACilB,EAAAA,EAAgB,IAAKf,EAAajlB,MAAM,SAASimB,eAAe,eACjEllB,EAAAA,EAAAA,KAACmlB,EAAAA,EAAsB,IAAKjB,EAAajlB,MAAM,eAAeimB,eAAe,uBAKrF7jB,EAAAA,EAAAA,MAAC6f,EAAAA,aAAY,CAAA3f,SAAA,CACV6d,IACCpf,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACriB,KAAK,SAASsiB,QAAShC,EAAQ7d,SAAC,WAI1CvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACriB,KAAK,SAASuiB,KAAK,yBAAyBC,MAAM,OAAM/f,SAAC,cAMzE,CC5Je,SAASggB,EAAc1hB,GAAiD,IAAhD,aAAEulB,EAAY,QAAEhG,GAA8Bvf,EACnF,OACEwB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAC2f,EAAAA,WAAU,CAAApe,UACTF,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,kBAAiBwB,SAAA,EAC9BvB,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAAxf,SAAC,sCACXvB,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAAxf,SAAC,mDAGfF,EAAAA,EAAAA,MAAC6f,EAAAA,aAAY,CAAA3f,SAAA,CACV6d,IAAWpf,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACC,QAAShC,EAAQ7d,SAAC,WACtCvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACK,GAAG,IAAIC,KAAM2D,EAAc9D,MAAM,OAAM/f,SAAC,iBAMxD,CCfO,SAAS8jB,EAAexlB,GAAuD,IAAtD,OAAE+e,EAAM,QAAEQ,EAAO,UAAEuC,GAAiC9hB,EAClF,MAAO+hB,EAAaC,GAAkB/e,IAAAA,UAAe,IAC9CsiB,EAAcE,GAAmBxiB,IAAAA,SAAemgB,GAavD,OACE5hB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAC8hB,EAAAA,aAAY,CAACC,aAAc3C,EAAQ7d,SAAC,sBAEpCqgB,GACC5hB,EAAAA,EAAAA,KAACuhB,EAAc,CAAC6D,aAAcA,EAAchG,QAASA,KAErDpf,EAAAA,EAAAA,KAACkf,EAAW,CAACN,OAAQA,EAAQQ,QAASA,EAASD,SAlBxBmD,IACvBX,EAEFrf,OAAO4U,SAAW+L,EAAqBX,GAIzCgD,EAAgBrC,EAAqBX,GACrCT,GAAe,GAAK,MAcxB,C,sKCvCO,IAAK9G,EAAa,SAAbA,GAAa,OAAbA,EAAa,SAAbA,EAAa,WAAbA,EAAa,UAAbA,EAAa,YAAbA,EAAa,YAAbA,EAAa,eAAbA,EAAa,gBAAbA,CAAa,MAUbwK,EAAc,SAAdA,GAAc,OAAdA,EAAc,gBAAdA,EAAc,YAAdA,EAAc,aAAdA,EAAc,eAAdA,EAAc,0BAAdA,CAAc,MAQdC,EAAsB,SAAtBA,GAAsB,OAAtBA,EAAsB,mBAAtBA,CAAsB,MAItBxK,EAAY,SAAZA,GAAY,OAAZA,EAAAA,EAAY,wBAAZA,EAAAA,EAAY,gBAAZA,EAAAA,EAAY,sBAAZA,CAAY,MAMjB,SAASyK,EAAsBC,EAAiBC,EAAmBC,GAGxE,OAFAF,EAAG3hB,iBAAiB4hB,EAAWC,GAExB,KACLF,EAAGzhB,oBAAoB0hB,EAAWC,EAAQ,CAE9C,CAEO,SAASC,EAAYH,GAC1B,OAAOA,EAAGG,aAAeH,EAAGI,SAC9B,CAoBO,SAASC,EAA0BC,GACxC,MAAMhkB,EAASgkB,EAAOC,aAAa,eAC7BC,EAAgBxN,SAASC,eAAe,OAAS3W,GACvD,GAAIkkB,EAAe,CACjBF,EAAO5M,MAAM+M,QAAU,OACvBD,EAAc9M,MAAM+M,QAAU,QAC9B,MAAMC,EAAQ1N,SAASC,eAAe,QAAU3W,GAC1C+P,EAzBH,SAAgCiU,GACrC,MAAMjU,EAAUiU,EAAOC,aAAa,kBAAkB9J,MAAM,MAAQ,GAClEuE,EAAS,GACX,IAAK,IAAIjM,EAAI,EAAG4R,EAAMtU,EAAQnR,OAAQ6T,EAAI4R,EAAK5R,IAE7C,IADA,IAAI4N,EAAStQ,EAAQ0C,GACZ6R,EAAI,EAAGA,EAAIN,EAAOzkB,SAASX,OAAQ0lB,IAAK,CAC/C,IAAIC,EAAWP,EAAOzkB,SAAS+kB,GAC3BC,EAAS3f,QAAUyb,GACrB3B,EAAOjO,KAAK,CACVpB,IAAKgR,EACLzb,MAAOif,EAAYU,IAGzB,CAEF,OAAO7F,CACT,CASoB8F,CAAuBR,GACjCxU,EAAM,GACZ,IAAK,IAAIiD,EAAI,EAAG4R,EAAMtU,EAAQnR,OAAQ6T,EAAI4R,EAAK5R,IAC7CjD,EAAIiB,KAAKV,EAAQ0C,GAAG7N,OAEtBwf,EAAMxf,MAAQ4K,EAAI2J,KAAK,KACzB,CACF,CAEA,MAAMsL,EAAa,kCAEZ,SAASC,EAAqBrE,GACnC,IAAKA,EAAOniB,SAAS,KAAM,OAAO,EAElC,MAAOymB,EAAMC,GAAMvE,EAAOlG,MAAM,MACzB0K,EAAiBC,GAAiB,CAACH,EAAMC,GAAIpP,KAAK5Q,KACnD6f,EAAWlf,KAAKX,KACV4M,OAAO0K,MAAM,IAAI5Z,KAAKsC,EAAMwU,QAAQ,KAAM,MAAMrV,aAK5D,OAAO8gB,GAAmBC,CAC5B,CAEO,SAASC,EAAiCC,GAC/C,MAAMC,EAAcD,EAAetf,KAAKgf,GAExC,GAAIO,EACF,OAAOA,EAAY9K,MAAM,KAAK3E,KAAKnT,GAAUoiB,EAAWlf,KAAKlD,GAAQA,EAAK+W,QAAQ,KAAM,UAAOva,GAEnG,CAEO,SAASqmB,EAAuBrnB,GAA+C,IAA9C,KAAE8mB,EAAI,GAAEC,GAAoC/mB,EAClF,OAAO8mB,GAAQC,EAAM,GAAED,GAAQ,MAAMC,GAAM,KAAKxL,QAAQ,MAAO,KAAO,IACxE,CAKO,SAAS+L,EAAgBC,GAAuF,IAAlEC,EAAuB1mB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAI2mB,EAAS3mB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG2B,OAAO4U,SAASC,OAC7G,MAAMyB,EAAQ,IAAI3B,gBAAgBqQ,GAC5BC,EAAY,IAAIF,KAAkB1e,OAAOC,OAAOmS,IAOhD4B,EAAO/Y,MAAM+iB,KAAK/N,EAAM+D,QAE9BA,EAAKrK,SAASjB,IACPkW,EAAUrnB,SAASmR,IACtBuH,EAAM4O,OAAOnW,EACf,IAGF,MAAO,CAAEoW,EAAcpY,EAAW,GAAKuJ,EAAMxB,IAAI2D,EAAc2M,OAAOC,MAAM,gBAAkB,GAM9F,OAJIP,GAAQK,IACV7O,EAAMkC,IAAIC,EAAc2M,KAAO,GAAEN,GAAQK,IAAepY,KAGnDuJ,CACT,CAKO,SAASgP,IAAyD,IAApCN,EAAS3mB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG2B,OAAO4U,SAASC,OAC/D,MAAMyB,EAAQ,IAAI3B,gBAAgBqQ,GAC5BO,EAAgBjP,EAAMxB,IAAI2D,EAAc+M,SAE9C,OAAKD,EAEElf,OAAOof,YACZF,EAAc1L,MAAM,KAAK3E,KAAKwQ,IAC5B,MAAMC,EAAiBD,EAAEE,YAAY,KAGrC,MAAO,CAFKF,EAAE9L,UAAU,EAAG+L,GACbD,EAAE9L,UAAU+L,EAAiB,GACxB9L,MAAM,KAAK,KAPP,CAAC,CAU9B,CAKO,SAASgM,EAAyBC,GACvC,OAAOzf,OAAOjF,QAAQ0kB,GACnBpmB,QAAOqmB,IAAA,IAAE,CAAEzhB,GAAMyhB,EAAA,OAAKC,OAAO1hB,GAAOhG,OAAS,CAAC,IAC9C4W,KAAI+Q,IAAA,IAAElX,EAAKzK,GAAM2hB,EAAA,MAAM,GAAElX,KAAOzK,EAAMuU,KAAK,MAAM,IACjDA,KAAK,IACV,CAEO,SAASqN,EACdC,EAIAC,GAGA,IAFAC,EAAShoB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,IACZioB,EAAcjoB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KAEjB,OAAO8nB,EAAO7L,QAAO,CAAC5a,EAAQ6mB,EAAOC,KACnC,MAAM,KAAEnC,EAAI,GAAEC,GAAOiC,EAGrB,IAAIE,EAAgB/mB,EAEpB,OADI8mB,EAAQ,IAAGC,GAAiBJ,GACzBI,GAJUpC,GAAQC,EAAM,GAAED,IAAOiC,IAAiBhC,IAAK8B,IAAgBI,IAAU,KAAO,GAIhE,GAC9B,GACL,C,kFCrKO,IAAKE,EAA0B,SAA1BA,GAA0B,OAA1BA,EAA0B,kBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,wBAA1BA,EAA0B,sBAA1BA,EAA0B,sBAA1BA,EAA0B,0BAA1BA,EAA0B,wBAA1BA,CAA0B,MAyB/B,SAASC,EAAoBppB,GAWT,IAXU,MACnCuP,EAAQ,IAAG,OACXhB,EAAS,IAAG,OACZwQ,EAAM,UACNsK,EAAS,aACTC,EAAY,2BACZC,EAA6BJ,EAA2BK,QAAO,eAC/DC,EAAc,MACdhI,EAAK,OACLiI,EAASC,IAA4B,YACrCC,GAAc,GACS5pB,EACvB,MAAO,CACLyP,OAAQ,OACRF,QACAhB,SACAsb,SAAU,EACVC,UAAW,EACXC,YAAY,EACZC,UAAU,EACVT,6BACAE,iBACAhI,QACAiI,SACAO,OAAQ,CACN,CACE1b,SACA8a,YACAa,MAAO,SACPnL,OAAQA,EACRoL,WAAY,EACZC,WAAY,QACZR,cACAS,SAAS,EACTC,MAAO,CACL,CACE/b,SACAgc,SAAUjB,MAMtB,CAEO,SAASK,IACd,IACE,OAAOrY,KAAKG,OAAM+Y,EAAAA,EAAAA,IAAiB,gBAGrC,CAFE,MACA,MACF,CACF,C,+BCxFO,SAASA,EAAiBC,GAC/B,MAAMC,EAAe7R,SAAS8R,OAC3BrO,MAAM,KACN3E,KAAKiT,GAAiBA,EAAatO,MAAM,OACzCS,QACC,CAAC8N,EAAKC,KACJD,EAAIlO,mBAAmBmO,EAAE,GAAG1K,SAAWzD,mBAAmBmO,EAAE,GAAG1K,QACxDyK,IAET,CAAC,GAGL,OAAOJ,EAAaC,EAAaD,GAAcC,CACjD,CAEO,SAASK,EAAUllB,GACxB,IAAImlB,EAAK,IAAIC,OAAO,mBAAqBplB,EAAO,+BAChD,OAAOgT,SAAS8R,OAAOpP,QAAQyP,EAAI,KACrC,C,oJCZA,MAAME,EACJ,mIAEK,SAASC,EACdpM,GAIQ,IAHRqM,EAAgBtqB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAChBuoB,EAASvoB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,eAAeoqB,aAAaC,OAAOjC,UAC/CkC,EAASzqB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,eAAeoqB,aAAaC,OAAOC,UAE/C,MAAM9J,EAAQ5I,SAASmB,gBAAgBZ,UAAUC,SAAS,QAAU,SAAMrY,EACpEwqB,EAAWvqB,eAAevB,gBAAkBuB,eAAeoqB,aAAaC,OAAOG,SAAWP,EAAmB,GAC7GnS,GAAQ6D,EAAAA,EAAAA,GAAkB,CAC9B8O,GAAI,IACJC,EAAG5M,EACH6M,GAAIvC,GAAa,IACjBwC,GAAI,eACJC,EAAGP,EACHQ,GAAItK,IAGN,IAAIuK,EAAU,GAAE/qB,eAAegrB,+BAA+BlT,IAAQyS,IAMtE,OAJIJ,IAEFY,EAASA,EAAOzQ,QAAQ,MAAO,MAAMA,QAAQ,KAAM,OAE9CyQ,CACT,CAEA,SAASE,EAA+BC,GACtC,OAAQA,GACN,IAAK,KACL,IAAK,KACH,MAAO,KACT,IAAK,KACH,MAAO,KACT,IAAK,KACH,MAAO,KACT,IAAK,MACL,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,MACT,IAAK,IACL,IAAK,KACL,IAAK,KACH,MAAO,KACT,IAAK,IACH,MAAO,KACT,IAAK,IACH,MAAO,KACT,QAEE,MAAO,KAEb,CAEA,SAASC,EAAgBrN,GAAkE,IAAlDsK,EAAiBvoB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KAAMspB,EAAsBtpB,UAAAC,OAAA,EAAAD,UAAA,QAAAE,EACvF,MAAMqrB,EAAYH,EAA+B7C,GAEjD,OAAQe,GACN,KAAKkC,EAAAA,EAAAA,OACL,KAAKA,EAAAA,EAAAA,MACH,MAAQ,mBAAiBC,EAAAA,EAAAA,IAAYxN,GAAQvD,iBAAiB6Q,UAChE,QACA,KAAKC,EAAAA,EAAAA,QACH,MAAQ,oBAAkBC,EAAAA,EAAAA,IAAYxN,GAAQvD,iBAAiB6Q,UAErE,CAEO,SAASG,IACd,OAAQvrB,eAAeoqB,aAAaC,OAAOjC,WACzC,IAAK,KACL,IAAK,MACH,MAAO,CAAE9Z,MAAO,IAAKhB,OAAQ,KAC/B,IAAK,KACH,MAAO,CAAEgB,MAAO,IAAKhB,OAAQ,KAC/B,IAAK,IACH,OAAItN,eAAeoqB,aAAaC,OAAOG,SAAiB,CAAElc,MAAO,IAAKhB,OAAQ,KACvE,CAAEgB,MAAO,IAAKhB,OAAQ,KAC/B,QACE,MAAO,CAAEgB,MAAO,IAAKhB,OAAQ,KAEnC,CAEO,SAASke,IACd,MAAO,4BACT,CAEO,SAASC,EACd3N,GAKA,IAJAqM,EAAgBtqB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAChBuoB,EAASvoB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGG,eAAeoqB,aAAaC,OAAOjC,UAC/CkC,EAAkBzqB,UAAAC,OAAA,EAAAD,UAAA,QAAAE,EAClBopB,EAAsBtpB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGwrB,EAAAA,EAAAA,MAEzB,MAAMK,GAAgB1rB,eAAe2rB,iCAAmCxC,IAAekC,EAAAA,EAAAA,MACjFO,EAAYF,EAAe,CAAEpd,MAAO,IAAKhB,OAAQ,KAAQie,IACzDM,EAZC,6BAaDC,EAAMJ,EACRP,EAAgBrN,EAAQsK,EAAWe,GACnCe,EAAiBpM,EAAQqM,EAAS/B,EAAWkC,GAC3CyB,EAASL,EAAe,GAAKM,EAAUF,GACvCG,EAAeF,GAAQjsB,OAAU,YAAWisB,KAAY,GAE9D,MAAO,CACLG,IAAM,wBAAuBL,KAAkBI,UAAqBH,aAAeF,EAAUtd,kBAAkBsd,EAAUte,gBACtHse,EAEP,CAEO,SAASI,EAAUF,GAExB,OAAO9rB,eAAemsB,wBAA2B,GAAEL,SAAWA,iBAAgB/rB,CAChF,C,oFCxHA,MAAMqsB,EAAiBjT,UAAUC,UAAUyN,MAAM,YAC3CwF,EAAelT,UAAUC,UAAUyN,MAAM,UACzCyF,EAAgBnT,UAAUC,UAAUyN,MAAM,WAC1C0F,EAAcpT,UAAUC,UAAUyN,MAAM,SACxC2F,EAAcrT,UAAUC,UAAUyN,MAAM,SACxC4F,EAAoBtT,UAAUC,UAAUyN,MAAM,eAC9C6F,EAAsBvT,UAAUC,UAAUyN,MAAM,kBAChD8F,EAAiBxT,UAAUC,UAAUyN,MAAM,QAAU1N,UAAUyT,eAAiB,EAEhFC,EACJT,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,EAEK,SAASzT,IACd,QAAS2T,CACX,CAEO,SAASC,IACd,SAAUR,GAAkBC,EAC9B,CAEO,SAASQ,IACd,OAAQJ,IAAmBL,IAAkBE,GAAgBD,CAC/D,CAEO,SAASS,IACd,MAAO,iCAAiCvmB,KAAK0S,UAAUC,YAA2C,IAA7BD,UAAUyT,cACjF,CAEO,SAASK,IACd,OAAON,IAAmBK,GAC5B,C,+DC5BO,SAAS/R,IAA4F,IAAhEiS,IAAYrtB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAASstB,IAActtB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAASutB,EAAavtB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GACtG,MAAMwtB,EAAe,CAAE/mB,MAAO,EAAGgnB,QAAS,IACpCC,EAAa,CAAEjnB,MAAO,GAAIgnB,QAAS,GACnCjnB,EAAatH,IAAA,IAAC,MAAEuH,EAAK,QAAEgnB,GAA6CvuB,EAAA,OAAa,GAARuH,EAAagnB,CAAO,EAE7F/pB,GAAOtD,EAAAA,EAAAA,MACPkG,EAAY5C,EAAKc,SACjBmpB,EAAsC,GAAlBjqB,EAAKgD,WAAkBhD,EAAK8C,aAEhDonB,EAAmBP,EAAeQ,IAAmC,EACrEC,EAAqBR,EAAiBO,IAAmC,EAEzEE,EAA0B,IAAdznB,GAAiC,IAAdA,EAC/B0nB,EAASxnB,EAAWgnB,GAAgBI,EAAmBL,GAAiBI,EACxEM,EAAWznB,EAAWknB,GAAcI,EAAqBP,GAAiBI,EAChF,OAAQI,GAAaC,IAAWC,CAClC,C,+BCzBA,SAASC,EAAyBC,GAAkD,IAA/BC,EAAwBpuB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAC9E,OAAOmuB,EACJ1T,QAAQ,QAAS,KACjBe,MAAM,KACN3E,KAAKvL,GACA8iB,EAAe7uB,SAAS+L,EAAErG,eAAuBqG,EAC9CA,EAAEmP,QAAQ,mBAAoB,MAEtCpZ,QAAQiK,KAAQA,IAChBkP,KAAK,KACLvV,aACL,CAEO,SAASopB,EAAmBF,GAAmE,IAAhDG,EAAOtuB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAAUouB,EAAwBpuB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAChG,OAAIsuB,EACKH,EACJ1T,QAAQ,KAAM,KACde,MAAM,KACN3E,KAAKvL,GAAM4iB,EAAyB5iB,EAAG8iB,KACvC/sB,QAAQiK,KAAQA,IAChBkP,KAAK,KAGH0T,EAAyBC,EAAWC,EAC7C,C,mFCxBO,IAAKG,EAAW,SAAXA,GAAW,OAAXA,EAAAA,EAAW,eAAXA,EAAAA,EAAW,uCAAXA,EAAAA,EAAW,uBAAXA,CAAW,MAMhB,SAASC,IACd,OAAIruB,eAAevB,eAAuB2vB,EAAYvvB,KAEnB,IAA/BmB,eAAesuB,YACVF,EAAYG,SAGdH,EAAYI,gBACrB,CAKO,SAASC,EAActuB,GAC5B,MAAM,SAAEuuB,EAAWltB,OAAO4U,SAASsY,SAAQ,MAAE5W,EAAQtW,OAAO4U,SAASC,OAAM,iBAAEsY,GAAmB,GAASxuB,EAEzGqB,OAAOotB,OAAO,MAAO,YAAc,GAAEF,IAAW5W,EAAMhY,OAAS,IAAM,KAAKgY,EAAMwC,QAAQ,MAAO,OAC/F9Y,OAAOotB,OAAO,QAAS,aAEnBD,GAAoBN,MAAqBD,EAAYG,UACvD/sB,OAAOqtB,UAAUC,MAAMnd,MAAK,IAAMkd,SAASE,iBAE/C,C,sGCzBO,MAAMC,EAAwBzrB,GACnCA,EAAKkB,mBAAmB,QAAS,CAC/BiC,IAAK,UACL7B,MAAO,UACPoqB,KAAM,YAGJC,EAAiC,cAChC,SAASC,IACd,MAAqD,QAA9CrF,EAAAA,EAAAA,IAAUoF,EACnB,CA0BO,SAASE,EAA2BC,GACzC,IACE,MAAMC,EAAkB1X,SAASC,eAAewX,GAChD,OAAOhf,KAAKG,MAAM8e,EAAgBvK,YAIpC,CAHE,MAAOrP,GAEP,YADA6Z,OAAOC,iBAAiB9Z,EAE1B,CACF,CAEO,SAAS+Z,IACd,MAAMC,GAAY5F,EAAAA,EAAAA,IAAU,aAE5B,OADsB4F,GAAYxU,EAAAA,EAAAA,GAAwCwU,GAAa,OACjEC,cAAW5vB,CACnC,C,gHCpCO,SAAS6vB,EAAY7wB,GAA8E,IAA7E,MAAE+G,EAAK,SAAErF,EAAQ,UAAExB,EAAS,aAAE4wB,EAAY,WAAEC,GAA+B/wB,EACtG,MAAMgxB,EAAWjqB,GAAS4M,OAAOC,SAAS7M,GAE1C,OACEvF,EAAAA,EAAAA,MAAA,QACEtB,UAAWE,IAAWF,EAAW,sDAAuD,CACtF,qCAAsC8wB,GAAYjqB,EAAQ,EAC1D,iCAAkCiqB,GAAYjqB,EAAQ,IACrDrF,SAAA,CAEFA,GACDF,EAAAA,EAAAA,MAAA,QAAMtB,UAAWE,IAAW2wB,EAAY,yBAAyBrvB,SAAA,MAC7CV,IAAjB8vB,GAA8BE,GAAsB,IAAVjqB,GACzC5G,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAAC1hB,MAAO,GAAI1J,KAAMmrB,GAAYjqB,EAAQ,EAAI,eAAiB,iBAAkB7G,UAAU,UAC1F,KACH4wB,OAIT,CAMO,SAASI,EAAiB1I,GAAkE,IAAjE,UAAEtoB,EAAS,SAAEwB,KAAaN,GAAqConB,EAC/F,OACEroB,EAAAA,EAAAA,KAAA,UAASiB,EAAOlB,UAAWE,IAAWF,EAAW,gBAAgBwB,SAC9DuB,EAAAA,SAAAA,IAAmBvB,GAAWyvB,GACzBluB,EAAAA,eAAqBkuB,IAAUA,EAAMlyB,OAAS4xB,EACzC5tB,EAAAA,aAAmBkuB,EAAO,CAC/BjxB,UAAWE,IAAW+wB,EAAM/vB,MAAMlB,UAAW,aAC7C6wB,WAAY,4BAITI,KAIf,C,2MCtDO,MAAMC,EAAQnuB,EAAAA,YACnB,CAAC7B,EAAmEiD,KAClElE,EAAAA,EAAAA,KAAA,YACMiB,EACJiD,IAAKA,EACLnE,UAAWE,IACTgB,EAAMlB,UACN,gHAMD,SAASmxB,EAAUjwB,GACxB,OACEjB,EAAAA,EAAAA,KAAA,YAAWiB,EAAKM,UACdvB,EAAAA,EAAAA,KAAA,MAAAuB,SAAKN,EAAMM,YAGjB,CAMO,MAAM4vB,EAAYruB,EAAAA,YACvB,CAAAjD,EAEEqE,KAAgD,IADhD,QAAEktB,EAAU,UAAWnwB,GAAgDpB,EAAA,OAGvEG,EAAAA,EAAAA,KAAA,YACMiB,EACJiD,IAAKA,EACLnE,UAAWE,IAAWgB,EAAMlB,UAAW,CACrC,2BAAwC,SAAZqxB,EAC5B,cAA2B,YAAZA,EACf,YAAyB,UAAZA,KAEf,IAIC,SAASC,EAAYpwB,GAC1B,OACEjB,EAAAA,EAAAA,KAAA,YAAWiB,EAAKM,UACdvB,EAAAA,EAAAA,KAAA,MAAAuB,SAAKN,EAAMM,YAGjB,CCnDO,IAAK+vB,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,eAAVA,EAAAA,EAAU,mBAAVA,EAAAA,EAAU,iBAAVA,CAAU,MCYf,SAASC,EAAS1xB,GAOmB,IAPlB,QACxB2xB,EAAO,OACPC,EAAM,MACNC,EAAQJ,EAAWK,KAAI,WACvBC,GAAa,EAAI,UACjB7xB,KACGkB,GACqCpB,EACxC,OACEG,EAAAA,EAAAA,KAAA,SACMiB,EACJlB,UAAWE,IAAWF,EAAW,gBAAiB,CAChD,gBAAiByxB,EACjB,eAAgBC,EAChB,OAAQG,EACR,OAAQA,EACR,cAAeF,IAAUJ,EAAWO,OACpC,aAAcH,IAAUJ,EAAWQ,SAI3C,C,eCnBA,SAASC,EAAkBlyB,GAAkF,IAAjF,SAAEmyB,EAAQ,UAAEC,EAAS,UAAElyB,GAAwDF,EACzG,OACEG,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CACHprB,KAAK,cACL3F,UAAWE,IAAWF,EAAW,yBAA0B,CACzDmyB,WAAYF,EACZ,aAA4B,IAAdC,KAItB,CASO,SAASE,EAAW9J,GAQgC,IAPzD7G,GAAI4Q,EAAW,MACfV,EAAK,SACLnwB,EAAQ,SACRywB,EAAQ,WACRJ,GAAa,EAAI,SACjBS,KACGpxB,GACoDonB,EACvD,MAAMiK,EAAoBF,GAnCS,KAqCnC,OAAOtvB,EAAAA,cACLwvB,EACA,IACKrxB,EACHlB,UAAWE,IACTgB,EAAMlB,UACN,uFACA,CACE,kFACEsyB,IAAapxB,EAAMsxB,SACrB,mCAAoCtxB,EAAMsxB,SAC1C,oCAAqCP,IAAa/wB,EAAMsxB,SACxD,8CAA+CP,EAC/C,YAAaN,IAAUJ,EAAWK,KAClC,cAAeD,IAAUJ,EAAWO,OACpC,aAAcH,IAAUJ,EAAWQ,MACnC,OAAQF,EACR,OAAQA,KAIdrwB,EAEJ,CAEO,SAASixB,EAAmBjK,GAG6C,IAH6B,UAC3G0J,KACGhxB,GACyEsnB,EAC5E,MAAMkK,GAAgC,IAAnBxxB,EAAMsxB,SAEzB,OACEvyB,EAAAA,EAAAA,KAACmyB,EAAW,IACLlxB,EACLoxB,UAAU,EACVtyB,UAAWE,IAAWgB,EAAMlB,UAAW,CACrC,+CAAgDkB,EAAM+wB,WAAaS,EACnE,OAAQxxB,EAAMywB,QAAUJ,EAAWQ,MACnC,OAAQ7wB,EAAMywB,QAAUJ,EAAWQ,QAClCvwB,UAEHF,EAAAA,EAAAA,MAAA,OACEtB,UAAWE,IAAW,wBAAyB,CAC7C,kBAAmBgB,EAAMywB,QAAUJ,EAAWO,SAAW5wB,EAAM+wB,WAC9DzwB,SAAA,CAEFN,EAAMywB,QAAUJ,EAAWQ,QAC1B9xB,EAAAA,EAAAA,KAAC+xB,EAAkB,CAACC,SAAU/wB,EAAM+wB,SAAUC,UAAWA,EAAWlyB,UAAU,eAE/EkB,EAAMM,SACNN,EAAMywB,QAAUJ,EAAWQ,QAC1B9xB,EAAAA,EAAAA,KAAC+xB,EAAkB,CAACC,SAAU/wB,EAAM+wB,SAAUC,UAAWA,EAAWlyB,UAAU,kBAKxF,CC3FO,MAAM2yB,EAAW5vB,EAAAA,YACtB,CAAAjD,EAAmEqE,KAA4C,IAA9G,QAAEstB,EAAO,OAAEC,EAAM,YAAEkB,GAAc,KAAS1xB,GAAsBpB,EAAA,OAC/DG,EAAAA,EAAAA,KAAA,SACMiB,EACJiD,IAAKA,EACLnE,UAAWE,IAAWgB,EAAMlB,UAAW,QAAS,CAC9C,eAAgByxB,EAChB,cAAeC,EACf,eAAgBkB,KAElB,I,0BCZC,IAAKC,EAAa,SAAbA,GAAa,OAAbA,EAAAA,EAAa,yBAAbA,EAAAA,EAAa,4BAAbA,CAAa,MAalB,SAASC,EACdC,EACAC,GAEA,GAAoB,OAAhBA,EAAsB,MAAO,CAAEC,OAAQ,KAAoBf,UAAWW,EAAcK,WACxF,GAAIF,GAAsC,iBAAhBA,EAA0B,OAAOA,EAI3D,MAAO,CACLC,OAHkBF,EAAQprB,MAAMsrB,IAAWE,EAAAA,EAAAA,IAAcF,IAAWA,EAAO7qB,KAAO4qB,KAG1DA,GAAqDD,EAAQ,GACrFb,UAAWW,EAAcK,UAE7B,CAKO,SAASE,EACdL,EACAxf,GAEoE,IADpE8f,EAAuBzyB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KAE1B,GAAc,OAAV2S,EAAgB,MAAO,CAAE0f,OAAQ,KAA+Bf,UAAWW,EAAcK,WAE7F,MAAMI,EAAS/f,GAAOggB,WAAW,KAC3BC,EAAaF,EAAS/f,GAAO4I,UAAU,GAAK5I,EAC5C0f,EAASF,EAAQprB,MAAMsrB,GAAWA,EAAOI,KAAWG,IAE1D,OAAIP,EACK,CAAEA,SAAQf,UAAWoB,EAAST,EAAcY,WAAaZ,EAAcK,WAEvE,CAAED,OAAQF,EAAQ,GAAIb,UAAWW,EAAcK,UAE1D,CAoDO,SAASQ,EAAY5zB,GAM0F,IAApH,KAAEmR,EAAI,QAAE8hB,EAAO,YAAEC,EAAW,YAAEW,EAAW,QAAE3hB,GAAuElS,EAClH,MAAOiU,EAAM6f,GAAW7wB,EAAAA,SAAe+vB,EAAeC,EAASC,IAEzDa,EAAa9wB,EAAAA,aAAkB,CAAC+wB,EAAmB5B,KACvD0B,GAASG,GACHD,GAAW5B,EACN,CAAEe,OAAQa,EAAS5B,aAGxB4B,GAAWC,EAASd,QAAQ7qB,KAAO0rB,EAAQ1rB,GACtC,IAAK2rB,EAAU7B,WAAiC,EAAtB6B,EAAS7B,WAGrC,CAAEe,OAAQa,EAAS5B,UAAWW,EAAcK,YACnD,GACD,IAIH,MAAO,CACLjiB,MAHiB+iB,EAAAA,EAAAA,IAAY,CAAE/iB,OAAMihB,UAAWne,EAAKme,UAAW+B,OAAQlgB,EAAKkf,OAAQU,cAAa3hB,YAIlG+B,OACA8f,aAEJ,CAsBO,SAASK,EAAmB5L,GAcqC,IARtE,KACArX,EAAI,QACJ8hB,EAAO,YACPC,EAAW,YACXW,EAAW,cACXQ,EAAa,MACbd,EAAQ,KAAI,QACZrhB,GACoEsW,EACpE,MACErX,KAAMmjB,EACNP,WAAYQ,EAAe,KAC3BtgB,GACE2f,EAAa,CAAEziB,OAAM8hB,UAASC,cAAaW,cAAa3hB,aACrDsiB,EAAcC,IAAmBC,EAAAA,EAAAA,mBAClCC,EAAiB1xB,EAAAA,OACrBoxB,GAAwC,iBAAhBnB,EACpBI,EAAsBL,EAASuB,EAAajd,IAAI8c,IAAkBnB,EAAaK,GAC/EP,EAAeC,EAASC,IAGxBa,EAAa9wB,EAAAA,aAChB+wB,IACC,GAAIK,EAAe,CACjB,MAAMnB,EAAiCyB,EAAe52B,QAAQo1B,OAC9DsB,GACGzX,GAtIJ,SACLA,EACAqX,EACAL,GAGA,IAFAT,EAAuBzyB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KAC1BoyB,EAAoBpyB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KAEvB,MAAM8zB,EAAY,IAAIxd,gBAAgB4F,GAChC6X,EAAgBD,EAAUrd,IAAI8c,IAAkBnB,EAChD4B,EAAcD,GAAe7uB,WAAWytB,WAAW,KAQzD,OANgB,OAAZO,EACFY,EAAUjN,OAAO0M,GAEjBO,EAAU3Z,IAAIoZ,EAAgB,GAAGS,GAAeD,IAAkBb,EAAQT,GAAe,GAAN,MAAWS,EAAQT,MAGjGqB,CACT,CAqHYG,CAAc/X,EAAMqX,EAAeL,EAAST,EAAuB,OAAhBL,EAAuB,KAAOA,EAAYK,KAC/F,CACEyB,oBAAoB,GAG1B,CAEAT,EAAgBP,EAAQ,GAE1B,CAACT,EAAOkB,EAAiBJ,EAAeE,IAgB1C,OAVAtxB,EAAAA,WAAgB,KACd,IAAKoxB,EAAe,OAEpB,MAAML,EAAUQ,EAAajd,IAAI8c,GACjC,GAAIL,EAAS,CACX,MAAM/f,EAAOqf,EAAsBL,EAASe,EAAST,GACrDgB,EAAgBtgB,EAAKkf,OAAQlf,EAAKme,UACpC,IACC,CAACa,EAASM,EAAOiB,EAAcH,EAAeE,IAE1C,CACLpjB,KAAMmjB,EACNrgB,OACA8f,aAEJ,C,iHC1NO,IAAKkB,EAAW,SAAXA,GAAW,OAAXA,EAAW,QAAXA,EAAW,qBAAXA,CAAW,MAKXC,EAAQ,SAARA,GAAQ,OAARA,EAAQ,QAARA,EAAQ,8EAARA,EAAQ,0CAARA,CAAQ,MAWb,MAAMC,EAAMlyB,EAAAA,YAAiB,SAAYjD,EAE9CqE,GACA,IAFA,SAAE+wB,EAAW,UAAS,MAAE3T,EAAQ,WAAYrgB,GAAiBpB,EAG7D,OACEG,EAAAA,EAAAA,KAAA,UACMiB,EACJiD,IAAKA,EACLnE,UAAWE,IACT,sCACAgB,EAAMlB,UACN+0B,EAAYG,GACZF,EAASzT,IACT/f,SAEDN,EAAMM,UAGb,G,2IChCO,IAAK2zB,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,iBAAVA,EAAAA,EAAU,eAAVA,CAAU,MA6Df,SAASC,EAAWt1B,GAQN,IARO,UAC1BE,EAAS,SACTwB,EAAQ,MACR+f,EAAQ,QAAO,WACf8T,GAAa,EAAI,UACjBC,GAAY,EAAI,SAChBJ,EAAW,UAAS,eACpBK,GACiBz1B,EACjB,MAAM01B,EAAiBC,EAAAA,eAAeP,GAChCQ,EAAa3yB,EAAAA,SAAc,IAzBnC,SAAuBwe,GACrB,OAAQA,IACD4T,EAAWQ,KACP,CACLvc,QAAS,8BACTwc,QAAS,eAGJ,CACLxc,QAAS,iEACTwc,QAAS,+BAGjB,CAYyCC,CAAcV,EAAW5T,KAAS,CAACA,IAC1E,OACEthB,EAAAA,EAAAA,KAAA,OACE61B,KAAK,QACL91B,UAAWE,IACT,2CACA,CAAEgO,OAAQonB,GACVI,EAAWtc,QACXoc,EACAx1B,GACAwB,SAEDuB,EAAAA,SAAAA,IAAmBvB,GAAU,CAACyvB,EAAOlI,IAC/BhmB,EAAAA,eAAqBkuB,IAAW,CAAC7P,EAAAA,OAAQmU,GAAgBtzB,OAAOue,SAASrgB,SAAS8wB,EAAMlyB,OAK3FuC,EAAAA,EAAAA,MAACyB,EAAAA,SAAc,CAAAvB,SAAA,CACZ6zB,GAActM,EAAQ,IAAK9oB,EAAAA,EAAAA,KAAA,OAAKD,UAAWE,IAAW,WAAYw1B,EAAWE,WAC7E7yB,EAAAA,aAAmBkuB,EAAkE,CACpFiE,SAAUjE,EAAM/vB,MAAMg0B,UAAY,OAClC3T,MAAO0P,EAAM/vB,MAAMqgB,QAAU4T,EAAW5T,KAAW4T,EAAWQ,KAAO,eAAiB,gBAJrE5M,GAJdkI,KAejB,C,6WCnGO,MAAM8E,EAAyB,SAEzBC,EACX,6FACWC,EAA2B,0BAC3BC,EAAsB,wDAE5B,IAAKC,EAAU,SAAVA,GAAU,OAAVA,EAAU,QAAVA,EAAU,6BAAVA,EAAU,+BAAVA,EAAU,6BAAVA,EAAU,4BAAVA,CAAU,MASVC,EAAa,SAAbA,GAAa,OAAbA,EAAa,QAAbA,EAAa,eAAbA,EAAa,eAAbA,EAAa,gBAAbA,EAAa,aAAbA,CAAa,MAQbC,EAAW,SAAXA,GAAW,OAAXA,EAAW,QAAXA,EAAW,iBAAXA,EAAW,qBAAXA,EAAW,mBAAXA,CAAW,MASXC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,QAAhBA,EAAgB,gBAAhBA,EAAgB,kBAAhBA,EAAgB,iBAAhBA,EAAgB,gBAAhBA,CAAgB,MAQhBb,EAAc,SAAdA,GAAc,OAAdA,EAAc,QAAdA,EAAc,gBAAdA,EAAc,qBAAdA,EAAc,oBAAdA,CAAc,MASdc,EAAW,SAAXA,GAAW,OAAXA,EAAAA,EAAW,6BAAXA,EAAAA,EAAW,iBAAXA,EAAAA,EAAW,uCAAXA,EAAAA,EAAW,eAAXA,EAAAA,EAAW,eAAXA,EAAAA,EAAW,mBAAXA,EAAAA,EAAW,yBAAXA,EAAAA,EAAW,aAAXA,EAAAA,EAAW,2BAAXA,EAAAA,EAAW,uBAAXA,EAAAA,EAAW,gCAAXA,EAAAA,EAAW,sBAAXA,EAAAA,EAAW,sBAAXA,EAAAA,EAAW,sCAAXA,EAAAA,EAAW,gBAAXA,CAAW,MAuBhB,SAASC,EAAejV,GAAoC,IAAhBkV,EAAM71B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GACvD,OAAQ2gB,GACN,KAAKgV,EAAYG,MACf,MAAO,CACLC,OAAQz2B,IACN,4JACA,2JACA,CACE,qFAAsFu2B,EACtF,qCAAsCA,KAK9C,KAAKF,EAAYK,iBACf,MAAO,CACLD,OAAQz2B,IACN,4JACA,2JACA,CACE,qFAAsFu2B,EACtF,qCAAsCA,KAK9C,KAAKF,EAAYZ,KACf,MAAO,CACLgB,OAAQz2B,IACN,yKACA,CACE,uCAAwCu2B,EACxC,iBAAkBA,KAK1B,KAAKF,EAAYx4B,KACf,MAAO,CACL44B,OAAQz2B,IACN,yLACA,CACE,iCAAkCu2B,EAClC,cAAeA,KAKvB,KAAKF,EAAY73B,OACf,MAAO,CACLi4B,OAAQz2B,IACN,gJACA,CACE,qCAAsCu2B,EACtC,gBAAiBA,KAKzB,KAAKF,EAAYM,UACf,MAAO,CACLF,OAAQz2B,IACN,iNACA,CACE,6FAA8Fu2B,EAC9F,yBAA0BA,KAKlC,KAAKF,EAAYt4B,IACf,MAAO,CACL04B,OAAQz2B,IACN,2JACA,CACE,+BAAgCu2B,EAChC,aAAcA,KAKtB,KAAKF,EAAYO,WACf,MAAO,CACLH,OAAQz2B,IACN,uKAEF62B,KAAM,cAGV,KAAKR,EAAYS,SACf,MAAO,CACLL,OAAQz2B,IACN,6FACA,CACE,sGACGu2B,EACH,qCAAsCA,KAK9C,KAAKF,EAAYU,aACf,MAAO,CACLN,OAAQz2B,IAAW,0EAA2E,CAC5F,qBAAsBu2B,EACtB,cAAeA,KAIrB,KAAKF,EAAYW,QACf,MAAO,CACLP,OAAQz2B,IACN,6FACA,CACE,gCAAiCu2B,KAIzC,KAAKF,EAAYY,QACf,MAAO,CACLR,OAAQz2B,IAEN,0MAEA,sRACA,CACE,uCAAwCu2B,EACxC,oDAAqDA,KAI7D,KAAKF,EAAYa,KACf,MAAO,CACLT,OAAQz2B,IAAW,mEAAoE,CACrF,qGAAsGu2B,EACtG,oGAAqGA,KAG3G,KAAKF,EAAYc,gBACf,MAAO,CACLV,OAAQz2B,IACN,yIACA,CACE,mJACGu2B,EACH,+EAAgFA,KAIxF,QACE,MAAO,CAAC,EAEd,CA+EA,SAASa,EAAex3B,EAkBtBqE,GACA,IAjBEsd,GAAI4Q,EAAW,MACf9Q,EAAQ,QAAO,KACfrN,EAAO,UAAS,SAChBghB,EAAW,UAAS,UACpBqC,GAAY,EAAI,WAChBC,EAAa,UAAS,MACtB7F,EAAK,QACLjkB,EAAUwG,EAAI,OACduiB,EAAM,aACNgB,EAAY,YACZC,EAAW,aACX9G,EAAY,UACZ5wB,EAAS,SACTwB,KACGN,GAC2BpB,EAGhC,MAAM63B,EAA0B,WAAfH,EACXI,EAAc70B,EAAAA,SAAc,IAAMyzB,EAAeD,EAAYhV,GAAQkV,IAAS,CAAClV,EAAOkV,IACtFoB,EAAgB90B,EAAAA,SAAc,IAAO40B,EAAW,KAAOvB,EAAc1oB,IAAW,CAACiqB,EAAUjqB,IAC3FoqB,EAAaH,EAAWrB,EAAiBpiB,GAAQiiB,EAAWjiB,GAC5DshB,EAAiBC,EAAeP,GAChC6C,EAAWL,GAAe9G,EAEhC,OAAO7tB,EAAAA,cACLsvB,GAAe0D,EACf,IACK70B,EACHiD,MACAnE,UAAWE,IACT81B,EACA4B,EAAYjB,OACZkB,EACAC,EACAtC,EACA,CACE,CAACS,GAA2B0B,EAC5B,CAACzB,GAAsBqB,GAEzBv3B,KAGJsB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,CACGk2B,IACCz3B,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uCAAsCwB,UAClDw2B,EAAAA,EAAAA,iBAAgBN,IAAez3B,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAM+xB,EAAa13B,UAAW43B,EAAYb,OAAWW,IAG9Fl2B,IAAam2B,GACZ13B,EAAAA,EAAAA,KAAA,OACED,UAAWE,IAAWu3B,EAAc,OAAQ9F,GAASoG,EAAW1B,EAAYvoB,KAAOuoB,EAAY4B,OAAQ,CACrG,SAAUP,GAAe,CAACvB,EAAW+B,KAAM/B,EAAWgC,MAAOhC,EAAWiC,SAASj4B,SAASg2B,EAAWjiB,IACrG,OAAQwjB,GAAe,CAACvB,EAAWkC,OAAQlC,EAAWmC,OAAOn4B,SAASg2B,EAAWjiB,IACjF,SACE0c,GAAgB,CAACuF,EAAW+B,KAAM/B,EAAWgC,MAAOhC,EAAWiC,SAASj4B,SAASg2B,EAAWjiB,IAC9F,OAAQ0c,GAAgB,CAACuF,EAAWkC,OAAQlC,EAAWmC,OAAOn4B,SAASg2B,EAAWjiB,MACjF1S,SAEFA,IAGHA,EAEDovB,IACC3wB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uCAAsCwB,UAClDw2B,EAAAA,EAAAA,iBAAgBpH,IAAgB3wB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAMirB,EAAc5wB,UAAW43B,EAAYb,OAAWnG,OAKvG,CAMO,MAAMxP,EAASre,EAAAA,WAAiBu0B,E,uHCtXvC,SAASiB,EAAiBz4B,EAExBqE,GACA,IAFA,UAAEnE,EAAS,MAAEd,EAAK,QAAEwQ,EAAO,SAAElO,KAAaN,GAAyCpB,EAGnF,MAAMsd,EAAUlc,EAAMkc,SAAWlc,EAAMs3B,eAEvC,OACEl3B,EAAAA,EAAAA,MAAA,SACEtB,UAAWE,IAAWF,EAAW,0BAA2B,CAC1D,mCAAoCkB,EAAMsxB,SAC1C,mBAAoB9iB,EACpB,mBAAoBA,IACnBlO,SAAA,EAEHF,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,qBAAoBwB,SAAA,EACjCvB,EAAAA,EAAAA,KAAA,YACMiB,EACJiD,IAAKA,EACLpF,KAAK,WACLiB,UAAWE,IACT,iHACA,iEACA,8BACA,iNACA,6PAGHkd,IAAWnd,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,OAAO3F,UAAU,yCAAyCqP,MAAO,QAEzFnQ,GAASsC,IAGhB,CAEO,MAAMic,GAAWgb,EAAAA,EAAAA,YAAWF,E,gxBCtCnC,SAASG,EAAMC,GAA+B,IAAlBxxB,EAAGvG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAAG4X,EAAG5X,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EACzC,OAAO+3B,EAAMngB,EAAMA,EAAMmgB,EAAMxxB,EAAMA,EAAMwxB,CAC7C,CAKA,SAASC,EAAQpb,GACf,MAAO,YAAaA,CACtB,CAKA,SAASqb,EAAoB1oB,EAAsBqN,GACjD,MAAM9G,EAAOvG,EAAKyG,wBAGZkiB,EAAUF,EAAQpb,GAASA,EAAMub,QAAQ,GAAMvb,EAErD,MAAO,CACL1P,KAAM4qB,GAAOI,EAAQE,OAAStiB,EAAK5I,KAAOvL,OAAO02B,cAAgBviB,EAAKrH,OACtE1B,IAAK+qB,GAAOI,EAAQI,OAASxiB,EAAK/I,IAAMpL,OAAO42B,cAAgBziB,EAAKrI,QAExE,CAOA,SAAS+qB,EAAmB5b,IACzBob,EAAQpb,IAAUA,EAAMuC,gBAC3B,CAOA,SAASsZ,EAAwBv5B,GAKwB,IALvB,OAChCw5B,EAAM,MACNC,EAAK,UACLv5B,KACGkB,GACkDpB,EACrD,MAAM05B,GAAYC,EAAAA,EAAAA,QAAuB,MACnCC,GAAaD,EAAAA,EAAAA,SAAO,IACnBE,EAAYC,IAAeC,EAAAA,EAAAA,WAAS,GAMrC7Z,GAAUyZ,EAAAA,EAAAA,SAAQjc,KAClBkc,EAAW77B,UAAY+6B,EAAQpb,MAC9Bkc,EAAW77B,UAAS67B,EAAW77B,QAAU+6B,EAAQpb,KAC/C,KAGHsc,GAAaC,EAAAA,EAAAA,cAChBvc,IACC4b,EAAmB5b,IAOJob,EAAQpb,GAASA,EAAMub,QAAQl4B,OAAS,EAAI2c,EAAMwc,QAAU,IAE7DR,EAAU37B,QACtBy7B,EAAOT,EAAoBW,EAAU37B,QAAS2f,IAE9Coc,GAAY,EACd,GAEF,CAACN,IAGGW,GAAkBF,EAAAA,EAAAA,cACtBzR,IAA0D,IAAzD,YAAE4R,GAAkD5R,EACnD8Q,EAAmBc,GAEdla,EAAQniB,QAAQq8B,KAIrBZ,EAAOT,EAAoBW,EAAU37B,QAAUq8B,IAC/CN,GAAY,GAAK,GAEnB,CAACN,IAGGa,GAAgBJ,EAAAA,EAAAA,cACnBvc,IACC,MAAM4c,EAAU5c,EAAM6c,OAAS7c,EAAM4c,QAGjCA,EAAU,IAAMA,EAAU,KAE9B5c,EAAMuC,iBAINwZ,EAAM,CACJzrB,KAAkB,KAAZssB,EAAiB,IAAmB,KAAZA,GAAkB,IAAO,EACvDzsB,IAAiB,KAAZysB,EAAiB,IAAmB,KAAZA,GAAkB,IAAO,IACtD,GAEJ,CAACb,IAGGe,GAAgBP,EAAAA,EAAAA,cAAY,IAAMH,GAAY,IAAQ,IAEtDW,GAAuBR,EAAAA,EAAAA,cAC1B54B,IAEC,MAAMq5B,EAAcr5B,EAAQoB,OAAOyB,iBAAmBzB,OAAO2B,oBAC7Ds2B,EAAYd,EAAW77B,QAAU,YAAc,YAAai8B,GAC5DU,EAAYd,EAAW77B,QAAU,WAAa,UAAWy8B,EAAc,GAEzE,CAACR,EAAYQ,IAUf,OAPAG,EAAAA,EAAAA,kBAAgB,KACdF,EAAqBZ,GACd,KACLA,GAAcY,GAAqB,EAAM,IAE1C,CAACZ,EAAYY,KAGdt6B,EAAAA,EAAAA,KAAA,UACMiB,EACJiD,IAAKq1B,EACLx5B,UAAWE,IAAWF,EAAW,yBACjC06B,aAAcT,EACdU,YAAaV,EACbW,UAAWT,EACXU,SAAU,GAGhB,CAEO,MAAMC,GAAkBC,EAAAA,EAAAA,MAAK1B,GCrJ7B,SAAS2B,EAAOl7B,GAA2C,IAA1C,MAAEsO,EAAK,KAAEN,EAAI,IAAEH,EAAM,IAAmB7N,EAC9D,OACEG,EAAAA,EAAAA,KAAA,OACED,UAAU,oGACVqZ,MAAO,CACL1L,IAAc,IAANA,EAAF,IACNG,KAAgB,IAAPA,EAAF,KACPtM,UAEFvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,mDAAmDqZ,MAAO,CAAE4hB,gBAAiB7sB,MAGlG,CCcO,SAAS8sB,EAAgBC,GAC9B,MAAMC,EAAWC,EAAiBF,GAClC,IAAIvP,EAAqB,EACrB0P,EAAqB,EACrBhoB,EAAqB,EACrBD,EAAqB,IAmBzB,OAhBwB,IAApB+nB,EAASv6B,QAAoC,IAApBu6B,EAASv6B,QACpC+qB,EAAI,KAAOwP,EAAS,GAAKA,EAAS,GAClCE,EAAI,KAAOF,EAAS,GAAKA,EAAS,GAClC9nB,EAAI,KAAO8nB,EAAS,GAAKA,EAAS,GAElC/nB,EAAwB,IAApB+nB,EAASv6B,OAAe,KAAOu6B,EAAS,GAAKA,EAAS,GAAK/nB,GAGlC,IAApB+nB,EAASv6B,QAAoC,IAApBu6B,EAASv6B,SAC3C+qB,EAAI,KAAOwP,EAAS,GAAKA,EAAS,GAClCE,EAAI,KAAOF,EAAS,GAAKA,EAAS,GAClC9nB,EAAI,KAAO8nB,EAAS,GAAKA,EAAS,GAElC/nB,EAAwB,IAApB+nB,EAASv6B,OAAe,KAAOu6B,EAAS,GAAKA,EAAS,GAAK/nB,GAG1D,CAAEuY,EAAGnY,OAAOmY,GAAI0P,EAAG7nB,OAAO6nB,GAAIhoB,EAAGG,OAAOH,GAAID,EAAGpD,KAAK9I,IAAI8I,KAAKC,MAAOuD,OAAOJ,GAAK,IAAO,KAAO,IAAK,GAC5G,CASO,SAASkoB,EAAgBJ,GAC9B,OAAOK,EAAWN,EAAgBC,GACpC,CASO,SAASM,EAAgBN,GAC9B,OAAOO,EAAWR,EAAgBC,GACpC,CASO,SAASQ,EAAWC,GACzB,OAAO3rB,KAAKuI,IAAIvI,KAAK9I,IAAI8I,KAAKC,MAAc,IAAR0rB,GAAc,KAAM,GACrD91B,SAAS,IACTC,SAAS,EAAG,IACjB,CASO,SAAS81B,EAAgBztB,GAA4B,IAAfwtB,EAAKh7B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAChD,MAAMgrB,EAAIxd,EAAMwd,EAAE9lB,SAAS,IACrBw1B,EAAIltB,EAAMktB,EAAEx1B,SAAS,IACrBwN,EAAIlF,EAAMkF,EAAExN,SAAS,IACrBq1B,EAAY,IAAMvP,EAAE7lB,SAAS,EAAG,KAAOu1B,EAAEv1B,SAAS,EAAG,KAAOuN,EAAEvN,SAAS,EAAG,KAEhF,OAAK61B,GAAqB,IAAZxtB,EAAMiF,EAIZ,GAAE8nB,IAAYQ,EAAWvtB,EAAMiF,KAH9B8nB,CAIX,CAWO,SAASW,EAAgB1tB,GAA4B,IAAfwtB,EAAKh7B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAChD,MAAMm7B,EAAYC,EAAW5tB,GAE7B,OAAOytB,EAAgBE,EAAWH,EACpC,CAWO,SAASK,EAAgB7tB,GAA4B,IAAfwtB,EAAKh7B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAChD,MAAMm7B,EAAYG,EAAW9tB,GAE7B,OAAOytB,EAAgBE,EAAWH,EACpC,CAUO,SAASJ,EAAWptB,GACzB,MAAMwd,EAAIxd,EAAMwd,EAAI,IACd0P,EAAIltB,EAAMktB,EAAI,IACdhoB,EAAIlF,EAAMkF,EAAI,IAEdsX,EAAI3a,KAAKuI,IAAIoT,EAAG0P,EAAGhoB,GACnB6oB,EAAIvR,EAAI3a,KAAK9I,IAAIykB,EAAG0P,EAAGhoB,GACvB8oB,EAAID,IAAMvR,IAAMgB,GAAK0P,EAAIhoB,GAAK6oB,EAAIvR,IAAM0Q,EAAI,GAAKhoB,EAAIsY,GAAKuQ,EAAI,GAAKvQ,EAAI0P,GAAKa,GAElF,MAAO,CACLC,EAAG,IAAMA,EAAI,EAAIA,EAAI,EAAIA,GACzBxnB,EAAGgW,EAAIuR,EAAIvR,EAAI,EACfA,EAAGA,EACHvX,EAAGjF,EAAMiF,EAEb,CAUO,SAASqoB,EAAWttB,GACzB,MAAMwd,EAAIxd,EAAMwd,EAAI,IACd0P,EAAIltB,EAAMktB,EAAI,IACdhoB,EAAIlF,EAAMkF,EAAI,IAEdsX,EAAI3a,KAAKuI,IAAIoT,EAAG0P,EAAGhoB,GACnB6oB,EAAIvR,EAAI3a,KAAK9I,IAAIykB,EAAG0P,EAAGhoB,GACvB2U,EAAI,EAAIhY,KAAKosB,IAAIzR,EAAIA,EAAIuR,EAAI,GAC7BC,EAAID,IAAMvR,IAAMgB,GAAK0P,EAAIhoB,GAAK6oB,EAAIvR,IAAM0Q,EAAI,GAAKhoB,EAAIsY,GAAKuQ,EAAI,GAAKvQ,EAAI0P,GAAKa,GAElF,MAAO,CACLC,EAAG,IAAMA,EAAI,EAAIA,EAAI,EAAIA,GACzBxnB,EAAGqT,EAAIkU,EAAIlU,EAAI,EACfqU,GAAI1R,EAAIA,EAAIuR,GAAK,EACjB9oB,EAAGjF,EAAMiF,EAEb,CAUO,SAAS2oB,EAAW5tB,GACzB,MAAM6Z,EAAI,SAACrN,GAAS,IAAE2hB,EAAC37B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,IAAIga,EAAIxM,EAAMguB,EAAI,IAAM,EAAC,OAAKhuB,EAAMwc,EAAIxc,EAAMwc,EAAIxc,EAAMwG,EAAI3E,KAAKuI,IAAIvI,KAAK9I,IAAIo1B,EAAG,EAAIA,EAAG,GAAI,EAAE,EAErH,MAAO,CACL3Q,EAAG3b,KAAKC,MAAa,IAAP+X,EAAE,IAChBqT,EAAGrrB,KAAKC,MAAa,IAAP+X,EAAE,IAChB3U,EAAGrD,KAAKC,MAAa,IAAP+X,EAAE,IAChB5U,EAAGpD,KAAKC,MAAgB,IAAV9B,EAAMiF,GAAW,IAEnC,CAUO,SAAS6oB,EAAW9tB,GACzB,MAAMiF,EAAIjF,EAAMwG,EAAI3E,KAAK9I,IAAIiH,EAAMkuB,EAAG,EAAIluB,EAAMkuB,GAC1CrU,EAAI,SAACrN,GAAS,IAAE2hB,EAAC37B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,IAAIga,EAAIxM,EAAMguB,EAAI,IAAM,GAAE,OAAKhuB,EAAMkuB,EAAIjpB,EAAIpD,KAAKuI,IAAIvI,KAAK9I,IAAIo1B,EAAI,EAAG,EAAIA,EAAG,IAAK,EAAE,EAE3G,MAAO,CACL3Q,EAAG3b,KAAKC,MAAa,IAAP+X,EAAE,IAChBqT,EAAGrrB,KAAKC,MAAa,IAAP+X,EAAE,IAChB3U,EAAGrD,KAAKC,MAAa,IAAP+X,EAAE,IAChB5U,EAAGjF,EAAMiF,EAEb,CASO,SAASmpB,EAAiBpuB,GAC/B,MAAQ,QAAOA,EAAMwd,MAAMxd,EAAMktB,MAAMltB,EAAMkF,MAAMlF,EAAMiF,IAC3D,CASO,SAASopB,EAAmBruB,GACjC,MAAMsuB,EAAa,gFAAgFC,KAAKvuB,IACjGnQ,EAAKM,EAAOR,EAAM69B,EAAQ,KAAOc,GAAY/hB,MAAM,IAAM,CAAC,EAAG,EAAG,EAAG,GAAGlD,IAAI8Q,QACjF,MAAO,CACLqD,EAAGnY,OAAOmpB,SAAS3+B,GACnBq9B,EAAG7nB,OAAOmpB,SAASr+B,GACnB+U,EAAGG,OAAOmpB,SAAS7+B,GACnBsV,EAAGI,OAAOuF,WAAW4iB,GAEzB,CASO,SAASiB,EAAiBzuB,GAC/B,MAAQ,QAAO6B,KAAKC,MAAM9B,EAAMguB,OAAOnsB,KAAKC,MAAgB,IAAV9B,EAAMwG,GAAa,SAAS3E,KAAKC,MAAgB,IAAV9B,EAAMkuB,GAAa,SAC1GluB,EAAMiF,IAEV,CAEO,SAASgoB,EAAiByB,GAC/B,OAAOA,EAASzhB,QAAQ,KAAM,GAChC,CAKO,SAAS0hB,EAAaD,GAC3B,MAAME,EAAQF,EAASvJ,WAAW,QAC5B3e,GAAI,IAAIqoB,QAAS5jB,MAIvB,OAFAzE,EAAExG,MAAQ4uB,EAAQF,EAAY,IAAGzB,EAAiByB,KAE/B,KAAZloB,EAAExG,KACX,CAKO,SAAS8uB,EAAkBJ,GAGhC,OAFcK,EAASL,GAGdjB,EAAgBY,EAAmBK,IAAW,GAGhDA,CACT,CAKO,SAASK,EAASL,GAAyC,IAAvBM,IAAcx8B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GACvD,MAAMy8B,EAAU,CAAC,OAIjB,OAHID,GACFC,EAAQ3qB,KAAK,QAER2qB,EAAQ5oB,MAAM8e,GAAeuJ,EAASvJ,WAAWA,IAC1D,CAKO,SAAS+J,EAAiBR,GAC/B,OAAIK,EAASL,GACJtB,EAAWiB,EAAmBK,IAGhCvB,EAAgBuB,EACzB,CAKO,SAASS,EAAmBnvB,EAAaovB,EAAwBC,GACtE,MACO,SADCD,EAEGhB,EAAiBR,EAAW5tB,IAE5B0tB,EAAgB1tB,EAAOqvB,EAEpC,CAQO,SAASC,EAAgBtvB,GAC9B,MAAO,MAASA,EAAMwd,EAAI,MAASxd,EAAMktB,EAAI,MAASltB,EAAMkF,CAC9D,CAKO,SAASqqB,EAAgCvvB,GAC9C,OAAOsvB,EAAgBtvB,IAAU,KAAOA,EAAMiF,EAAI,EACpD,CAKO,SAASuqB,EAAwBxvB,GAA0B,IAAXwtB,EAAKh7B,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,EAC7D,MAAMm7B,EAAYb,EAAgB9sB,GAClC,OAAOytB,EAAgB,IAAKE,EAAW1oB,EAAGuoB,IAAS,EACrD,CAKO,SAASiC,EAAiCh3B,GAC/C,OAAIs2B,EAASt2B,GAAe21B,EAAiBC,EAAmB51B,IACzD21B,EAAiBtB,EAAgBr0B,GAC1C,CCxWO,SAASi3B,EAAKh+B,GAAsC,IAArC,MAAEsO,EAAK,SAAEsP,GAA0B5d,EACvD,MAAMi+B,GAAkBhE,EAAAA,EAAAA,cAAaiE,GAAqBtgB,EAAS,IAAKtP,EAAOiF,EAAG,EAAI2qB,EAAIlwB,QAAS,CAAC4P,EAAUtP,IAExG6vB,GAAkBC,EAAAA,EAAAA,UAAQ,IAItB,0BAHapC,EAAgB,IAAK1tB,EAAOiF,EAAG,QACjCyoB,EAAgB,IAAK1tB,EAAOiF,EAAG,IAAK,OAKtD,CAACjF,EAAMguB,EAAGhuB,EAAMwG,EAAGxG,EAAMwc,IAE5B,OACEtpB,EAAAA,EAAAA,MAACw5B,EAAe,CAACxB,OAAQyE,EAAiBxE,MAAOwE,EAAiB,aAAW,QAAOv8B,SAAA,EAClFvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,wEAAuEwB,UACpFvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,OAAOqZ,MAAO,CAAE8kB,gBAAiBF,QAElDh+B,EAAAA,EAAAA,KAAC+6B,EAAO,CAACrtB,IAAK,GAAKG,KAAM,EAAIM,EAAMiF,EAAGjF,MAAO0tB,EAAgB1tB,GAAO,OAG1E,C,eC5BA,MAAMgwB,EAAiB,CACrB,CAAEC,MAAO,OAAQx3B,MAAO,WACxB,CAAEw3B,MAAO,OAAQx3B,MAAO,WACxB,CAAEw3B,MAAO,UAAWx3B,MAAO,WAC3B,CAAEw3B,MAAO,SAAUx3B,MAAO,WAC1B,CAAEw3B,MAAO,SAAUx3B,MAAO,WAC1B,CAAEw3B,MAAO,SAAUx3B,MAAO,WAC1B,CAAEw3B,MAAO,OAAQx3B,MAAO,WACxB,CAAEw3B,MAAO,aAAcx3B,MAAO,WAC9B,CAAEw3B,MAAO,OAAQx3B,MAAO,WACxB,CAAEw3B,MAAO,OAAQx3B,MAAO,WACxB,CAAEw3B,MAAO,UAAWx3B,MAAO,WAC3B,CAAEw3B,MAAO,QAASx3B,MAAO,WACzB,CAAEw3B,MAAO,OAAQx3B,MAAO,WACxB,CAAEw3B,MAAO,SAAUx3B,MAAO,WAC1B,CAAEw3B,MAAO,QAASx3B,MAAO,WACzB,CAAEw3B,MAAO,MAAOx3B,MAAO,YAkClB,SAASy3B,EAAYx+B,GAAkE,IAAjE,MAAEsO,EAAK,OAAEob,EAAS4U,EAAc,SAAE1gB,GAA6B5d,EAC1F,MAAMy+B,EAAiBnwB,EAAMkN,cAE7B,OACErb,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yBAAyB,cAAY,gBAAewB,SAChEgoB,EAAO/R,KAAK+mB,IACX,MAAMC,EAAaF,EAAehL,WAAWiL,EAAS33B,OACtD,OACE5G,EAAAA,EAAAA,KAAA,OAEED,UAAU,sDACVq+B,MAAOG,EAASH,MAChBhlB,MAAO,CAAE4hB,gBAAiBuD,EAAS33B,OACnCwa,QAASA,IAAM3D,EAAS8gB,EAAS33B,MAAO00B,EAAgBiD,EAAS33B,QAAQrF,SAExEi9B,IAAcx+B,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,OAAO3F,UAAU,kBANtCw+B,EAAS33B,MAOV,KAKhB,CCxDO,SAAS63B,EAAa5+B,GAA0C,IAAzC,MAAEsO,EAAK,SAAEsP,GAA8B5d,EACnE,MAAM6+B,GAAWT,EAAAA,EAAAA,UAAQ,IAR3B,SAA6B9vB,GAC3B,MAAO,CACLN,KAAMM,EAAMguB,EAAI,IAChBzuB,IAAK,EAAIS,EAAMwG,EAEnB,CAGiCgqB,CAAoBxwB,IAAQ,CAACA,IAEtDywB,GAAeX,EAAAA,EAAAA,UAAQ,IAAMpC,EAAgB,CAAEM,EAAGhuB,EAAMguB,EAAGxnB,EAAGxG,EAAMwG,EAAGgW,EAAG,EAAGvX,EAAG,KAAM,CAACjF,EAAMguB,EAAGhuB,EAAMwG,IAEtGkqB,GAAmB/E,EAAAA,EAAAA,cACtBiE,GACCtgB,EAAS,CACP0e,EAAGnsB,KAAKC,MAAiB,IAAX8tB,EAAIlwB,MAClB8G,EAAG,EAAIopB,EAAIrwB,IACXid,EAAG,EACHvX,EAAGjF,EAAMiF,KAEb,CAACjF,EAAMiF,EAAGqK,IAGZ,OACEpc,EAAAA,EAAAA,MAACw5B,EAAe,CACdxB,OAAQwF,EACRvF,MAAOuF,EACP,aAAW,QACX9+B,UAAU,qBAAoBwB,SAAA,EAE9BvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,yEAAwEwB,UACrFvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,sCAEjBC,EAAAA,EAAAA,KAAC+6B,EAAO,CAACrtB,IAAKgxB,EAAShxB,IAAKG,KAAM6wB,EAAS7wB,KAAMM,MAAOywB,MAG9D,CCpCO,SAASE,EAASj/B,GAAsC,IAArC,MAAEsO,EAAK,SAAEsP,GAA0B5d,EAC3D,MAAMi+B,GAAkBhE,EAAAA,EAAAA,cAAaiE,GAAqBtgB,EAAS,IAAKtP,EAAOwc,EAAG,EAAIoT,EAAIlwB,QAAS,CAAC4P,EAAUtP,IAExGywB,GAAeX,EAAAA,EAAAA,UACnB,IAAMpC,EAAgB,CAAEM,EAAGhuB,EAAMguB,EAAGxnB,EAAGxG,EAAMwG,EAAGgW,EAAGxc,EAAMwc,EAAGvX,EAAG,KAC/D,CAACjF,EAAMguB,EAAGhuB,EAAMwG,EAAGxG,EAAMwc,IAGrBqT,GAAkBC,EAAAA,EAAAA,UAAQ,IAItB,0BAHapC,EAAgB,CAAEM,EAAGhuB,EAAMguB,EAAGxnB,EAAGxG,EAAMwG,EAAGgW,EAAG,EAAGvX,EAAG,QACrDyoB,EAAgB,CAAEM,EAAGhuB,EAAMguB,EAAGxnB,EAAGxG,EAAMwG,EAAGgW,EAAG,EAAGvX,EAAG,QAGrE,CAACjF,EAAMguB,EAAGhuB,EAAMwG,IAEnB,OACEtT,EAAAA,EAAAA,MAACw5B,EAAe,CAACxB,OAAQyE,EAAiBxE,MAAOwE,EAAiB,aAAW,YAAWv8B,SAAA,EACtFvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,sBAAsBqZ,MAAO,CAAE8kB,gBAAiBF,MAC/Dh+B,EAAAA,EAAAA,KAAC+6B,EAAO,CAACrtB,IAAK,GAAKG,KAAM,EAAIM,EAAMwc,EAAGxc,MAAOywB,MAGnD,C,eCTO,SAASG,EAAYl/B,GAAgD,IAA/C,KAAEi3B,EAAI,MAAE3oB,EAAK,UAAEpO,GAA8BF,EACxE,MAAM0pB,EAAS3lB,MAAMC,QAAQsK,GAASA,EAAQ,CAACA,GACzC6wB,EAAatB,EAAgCzC,EAAgB1R,EAAO,KAC1E,OACEloB,EAAAA,EAAAA,MAAA,OACEtB,UAAWE,IACT,mHACAF,GACAwB,SAAA,CAEDu1B,IACC92B,EAAAA,EAAAA,KAAA,OAAKD,UAAU,gFAA+EwB,UAC3Fw2B,EAAAA,EAAAA,iBAAgBjB,IACf92B,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAMoxB,EAAM/2B,UAAU,WAAWoO,MAAO6wB,EAAa,QAAU,QAAS5vB,MAAM,OAAOhB,OAAO,SAElG0oB,IAILvN,EAAO/R,KAAI,CAACrJ,EAAO2a,KAElB9oB,EAAAA,EAAAA,KAAA,OAAiBD,UAAU,gBAAgBqZ,MAAO,CAAE4hB,gBAAiB7sB,GAAQ5M,SAAC,KAApEunB,OAMlB,CC/BO,MAAMmW,EAAcn8B,IAAAA,YACzB,CAAAjD,EAEEqE,KACG,IAFH,MAAEiK,EAAK,WAAE+wB,EAAU,gBAAEC,GAAkB,EAAI,SAAE1hB,KAAaxc,GAAyBpB,EAGnF,MAAOu/B,EAAYC,IAAiBzF,EAAAA,EAAAA,UAAS0F,EAA2BnxB,IAClEoxB,EAASD,EAAmBF,IAElCI,EAAAA,EAAAA,YAAU,KACRH,EAAcC,EAA2BnxB,GAAO,GAC/C,CAACA,IAEJ,MAAMsxB,GAAyB3F,EAAAA,EAAAA,cAC5Bvc,IACC,MAAM3W,EAAQ04B,EAA2B/hB,EAAM7G,cAAc9P,OACvD24B,EAAS34B,EAAM0sB,WAAW,QAC1BoM,EAAaH,EAAS34B,EAAS,IAAGA,IAExCy4B,EAAcz4B,IACTA,EAAMhG,QAAU,GAAM2+B,GAAU34B,EAAMhG,QAAU,KAAQ0+B,EAAuBI,IAClFjiB,EAASiiB,EAAYJ,EAA0BI,GACjD,GAEF,CAACjiB,IAEH,OACEzd,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,IACA1+B,EACJiD,IAAKA,EACL0C,MAAOw4B,EACPF,WAAYj/B,IACV,YACA,CACE,UAAWk/B,IAAoBI,EAC/B,QAASJ,GAAmBI,EAC5B,QAASJ,IAAoBI,EAC7B,OAAQJ,GAAmBI,GAE7BL,GAEFzH,aACEp2B,EAAAA,EAAAA,MAAA,OAAKtB,UAAWE,IAAW,oBAAqB,CAAE,YAAak/B,IAAmB59B,SAAA,CAC/E49B,IACCn/B,EAAAA,EAAAA,KAAA,OAAKD,UAAU,UAASwB,UACtBvB,EAAAA,EAAAA,KAAC++B,EAAY,CAAC5wB,MAAOA,EAAOpO,UAAU,eAGxCw/B,IAAUv/B,EAAAA,EAAAA,KAAA,QAAMD,UAAWE,IAAW,CAAE,OAAQk/B,IAAmB59B,SAAC,SAG1Ekc,SAAUgiB,GACV,ICjBD,SAASG,EAAW//B,GAON,IAPO,MAC1BsO,EAAK,gBACL0xB,GAAkB,EAAI,eACtBrC,GAAiB,EAAI,aACrB12B,EAAe,MAAK,SACpB2W,EAAQ,mBACRqiB,GACiBjgC,EACjB,MAAMkgC,GAAcvG,EAAAA,EAAAA,QAAOrrB,IACpB6xB,EAAWC,IAAYrG,EAAAA,EAAAA,UAAS0F,EAA2BnxB,KAKlEqxB,EAAAA,EAAAA,YAAU,KACR,MAAMU,EAAeZ,EAA2BS,EAAYniC,SACtDuiC,EAAWb,EAA2BnxB,GAExC+xB,IAAiBC,GAAab,EAAuBa,KAEzDJ,EAAYniC,QAAUuQ,EACtB8xB,EAASX,EAA2BnxB,IAAO,GAC1C,CAACA,IAQJ,MAAMiyB,GAAmBtG,EAAAA,EAAAA,cACtB3rB,IACC,MAAMkyB,EAAcf,EAA6BnxB,EAAOrH,EAAc02B,GACtEuC,EAAYniC,QAAUyiC,EACtB5iB,EAAS4iB,EAAalyB,GACtB8xB,EAAS9xB,EAAM,GAEjB,CAACsP,EAAU+f,EAAgB12B,IAGvBw5B,GAAuBxG,EAAAA,EAAAA,cAAY,KACvC,MAAMlzB,EAAQ25B,OAAO,uBAAuBtgB,OAE5C,IAAKrZ,EAAO,OAIZ,IAFgB04B,EAAuB14B,GAGrC,OAAO6Z,MAAM,iCAGf2f,EAAiBd,EAA2B14B,GAAO,GAClD,CAACw5B,IAEJ,OACE/+B,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,qDAAoDwB,SAAA,CAChEs+B,IACCx+B,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACGyY,EAAAA,EAAAA,QACCha,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACC,QAASkf,EAAsBvgC,UAAU,gBAAgBy3B,aAAa,cAAaj2B,SAAC,sBAI9FvB,EAAAA,EAAAA,KAACy+B,EAAa,CAACtwB,MAAO6xB,EAAWviB,SAAU2iB,KAC3CpgC,EAAAA,EAAAA,KAAC8+B,EAAS,CAAC3wB,MAAO6xB,EAAWviB,SAAU2iB,IAEtC5C,IAAkBx9B,EAAAA,EAAAA,KAAC69B,EAAK,CAAC1vB,MAAO6xB,EAAWviB,SAAU2iB,QAI1DpgC,EAAAA,EAAAA,KAAA,OACED,UAAWE,IAAW,CACpB,wEAAyE4/B,IACxEt+B,UAEHvB,EAAAA,EAAAA,KAACq+B,EAAY,CACXlwB,MAAOA,EACPsP,SAAUA,CAAC+iB,EAAMC,KACfX,MACAM,EAAiB,IAAKK,EAAcrtB,EAAG4sB,EAAU5sB,GAAI,QAMjE,CAUO,SAASstB,EAAgBrY,GAAwE,IAAvE,MAAEppB,EAAK,gBAAE0hC,EAAe,SAAEljB,KAAaxc,GAA8BonB,EACpG,MAAMuY,GAAeC,EAAAA,EAAAA,mBACfhB,GAA4C,IAA1B5+B,EAAM4+B,gBACxBlS,GAAiB3T,EAAAA,EAAAA,MAEvB,OACE3Y,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAC8gC,EAAAA,eAAc,CACb5/B,MAAO0/B,EACPpf,GAAIyd,EACJhgC,MAAOA,EAEPH,KAAM6uB,IAAmBkS,EAAkB,SAAW,OACtD1xB,MAAOlN,EAAMkN,MACb,cAAawyB,EAEbljB,SAAUA,KAEZzd,EAAAA,EAAAA,KAAC+gC,EAAAA,QAAO,CAAC7/B,MAAO0/B,EAAc,aAAW,eAAeI,aAAa,EAAMz/B,UACzEvB,EAAAA,EAAAA,KAAA,OACED,UAAWE,IACT,WACA4/B,GAAmB,CACjB,OAAQlS,EACR,QAASA,IAEXpsB,UAEFvB,EAAAA,EAAAA,KAAC4/B,EAAW,IACN3+B,EACJwc,SAAUA,EACVqiB,mBAAoBA,KACdD,GACJe,EAAaK,MAAM,UAOjC,C,eCtKO,SAASC,GAAgBrhC,GAKN,IALO,gBAC/BshC,EAAe,SACf1jB,EAAQ,gBACRoiB,GAAkB,KACf5+B,GACmBpB,EACtB,MAAM8tB,GAAiB3T,EAAAA,EAAAA,MAEvB,OACE3Y,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,CACGs+B,IAAoBlS,IACnB3tB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,WAAUwB,UACvBvB,EAAAA,EAAAA,KAACi/B,EAAW,CACV,cAAY,qBACZhgC,MAAOkiC,EACPhzB,MAAOlN,EAAMkN,MACbgxB,iBAAiB,EACjB1hB,SAAUA,OAIhBzd,EAAAA,EAAAA,KAAA,OACED,UAAWE,IACT,sBACA4/B,GAAmB,CACjB,OAAQlS,EACR,QAASA,IAEXpsB,UAEFvB,EAAAA,EAAAA,KAAC4/B,EAAW,IAAK3+B,EAAO4+B,gBAAiBA,EAAiBpiB,SAAUA,EAAUqiB,mBAAoBA,aAI1G,CASO,SAASsB,GAAc/Y,GAAqD,IAApD,MAAEla,EAAK,SAAE5M,KAAaN,GAA4BonB,EAC/E,OACEroB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CACLsW,aAAaz3B,EAAAA,EAAAA,KAAC++B,EAAY,CAAC5wB,MAAOA,EAAOpO,UAAWE,IAAW,UAAWu1B,EAAAA,eAAAA,YACtEv0B,EAAKM,SAERA,GAGP,CAuEO,SAAS8/B,GAAiB9Y,GAUK,IAVqC,KACzEtU,EAAI,KACJ6iB,EAAI,OACJvN,EAAM,UACNxpB,EAAS,SACT0d,EAAQ,uBACR6jB,EAAsB,mBACtBC,GAAqB,EAAI,eACzBC,KACGvgC,GAC+BsnB,EAClC,MAAMqY,GAAeC,EAAAA,EAAAA,mBACfY,IAAkBxgC,EAAMwgC,eAAiBlY,EAAO3oB,OAAS,GACxD8gC,EAAkBC,GAAuB7+B,IAAAA,SAAe,GACzD8+B,EAAoB9+B,IAAAA,aACxB,CAACqL,EAAe0zB,KACdpkB,EACE8L,EAAO/R,KAAI,CAACsqB,EAAahZ,IAAWA,IAAU4Y,EAAmB,IAAKI,EAAa3zB,SAAU2zB,IAC7FD,EACD,GAEH,CAACH,EAAkBnY,EAAQ9L,IAE7B,OACEpc,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CACLjgB,MAAO0/B,EACPpf,GAAIsf,EAAAA,eACJ,cAAaQ,EACbhgB,MAAM,UACNvhB,UAAWE,IAAW,QAASF,GAC/Bk1B,SAAS,UACTsC,WAAW,SACXtjB,KAAMA,EACNuiB,OAAQoK,EAAamB,QAAQxgC,UAE7BvB,EAAAA,EAAAA,KAAC++B,EAAY,CACXjI,KAAMA,EACN3oB,MAAOob,EAAO/R,KAAIwqB,IAAA,IAAC,MAAE7zB,GAAO6zB,EAAA,OAAK7zB,CAAK,IACtCpO,UAAWE,IAAW,gBAAiBu1B,EAAAA,eAAAA,YAG3Cn0B,EAAAA,EAAAA,MAAC0/B,EAAAA,QAAO,CACN7/B,MAAO0/B,EACP,aAAW,eACXI,aAAa,EACbO,mBAAoBA,EACpBC,eAAgBA,EAAejgC,SAAA,CAE9BkgC,IACCzhC,EAAAA,EAAAA,KAAA,OAAKD,UAAU,+BAA8BwB,UAC3CvB,EAAAA,EAAAA,KAACm1B,EAAAA,YAAW,CAACG,eAAgB8L,GAAgBhM,YAAY,EAAM7zB,SAC5DgoB,EAAO/R,KAAI,CAAAyqB,EAAmBnZ,KAAK,IAAvB,MAAE3a,EAAK,MAAElP,GAAOgjC,EAAA,OAC3BjiC,EAAAA,EAAAA,KAACohC,GAAc,CAEbjzB,MAAOA,EACPqoB,OAAQkL,IAAqB5Y,EAC7B1H,QAASA,IAAMugB,EAAoB7Y,GAAOvnB,SAEzCtC,GALI6pB,EAMU,SAKzB9oB,EAAAA,EAAAA,KAACkhC,GAAgB,IAEXjgC,EACJkN,MAAOob,EAAOmY,GAAkBvzB,MAChCsP,SAAUmkB,GAHLF,QAQf,C,gDCxNO,MAAMQ,EAA+B,G,kJCSrC,MAAMC,EAAmCtiC,IAAmD,IAAlD,UAAEE,EAAS,MAAEd,EAAK,KAAEmjC,EAAI,kBAAEC,GAAmBxiC,EAC5F,MAAOyiC,EAAUC,GAAez/B,IAAAA,UAAe,GAEzC0/B,EAAwB1/B,IAAAA,aAAkB,KAC9Cy/B,GAAY,GACZE,IAAKL,EAAK,GACT,CAACA,IAoBJ,OAlBAt/B,IAAAA,WAAgB,KACd,IAAI4/B,EACJ,MAAMC,EAAaA,KACZD,GACLE,aAAaF,EAAQ,EASvB,OAPIJ,IACFK,IACAD,EAAUG,YAAW,KACnBN,GAAY,EAAM,GACjB,MAGE,KACLI,GAAY,CACb,GACA,CAACL,KAGFjhC,EAAAA,EAAAA,MAAA,OAAKtB,UAAWA,EAAUwB,SAAA,EACxBvB,EAAAA,EAAAA,KAAC8iC,EAAAA,SAAQ,CACP7jC,MAAOA,EACP8jC,UAAQ,EACR3hB,QAAU5K,GAAMA,EAAEE,cAAcsP,SAChCkZ,WAAW,OACX,cAAY,6BACZt4B,MAAOw7B,KAET/gC,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,sBAAqBwB,SAAA,CACjC8gC,IAAqBriC,EAAAA,EAAAA,KAAA,OAAAuB,SAAM8gC,KAC5BriC,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CACLphB,UAAU,oBACVuhB,MAAM,OACNF,QAASohB,EACTjQ,SAAU+P,EACV7K,YAAa6K,EAAW,YAASzhC,EACjC,cAAY,gCAA+BU,SAE1C+gC,EAAW,SAAW,cAGvB,C,gKCrDV,MAAMU,EAAsBlgC,EAAAA,MAAW,IAAM,kCAgBtC,SAASmgC,EAAmBpjC,GAKkD,IALjD,MAClCqB,EAAK,SACLK,EAAQ,OACR2hC,KACGjiC,GAC8EpB,EACjF,MAAM,cAAEsjC,IAAkBC,EAAAA,EAAAA,wBAAuBliC,GACjD,OACEG,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAC8gC,EAAAA,eAAc,CAAC5/B,MAAOA,EAAMK,SACzB8hC,GACAvgC,EAAAA,SAAAA,IAAmBvB,GAAWyvB,IAC5B,GAAIluB,EAAAA,eAAqBkuB,GACvB,OAAOluB,EAAAA,aAAmBkuB,EAAO,IAAKqS,KAAkBrS,EAAM/vB,OAAgB,OAIpFkiC,IACAnjC,EAAAA,EAAAA,KAACsjC,EAAAA,cAAAA,SAAsB,CAAC18B,MAAOs8B,GAAU,WAAW3hC,UAClDvB,EAAAA,EAAAA,KAAC+gC,EAAAA,QAAO,CAAC7/B,MAAOA,EAAO8/B,aAAa,EAAO1f,MAAM,OAAO,aAAW,cAAa/f,UAC9EvB,EAAAA,EAAAA,KAAC8C,EAAAA,SAAc,CACbygC,UACEvjC,EAAAA,EAAAA,KAACg1B,EAAAA,GAAG,CAACC,SAAS,OAAOl1B,UAAU,uDAAsDwB,UACnFvB,EAAAA,EAAAA,KAACwjC,EAAAA,QAAO,CAACp0B,MAAO,OAEnB7N,UAEDvB,EAAAA,EAAAA,KAACgjC,EAAmB,IACd/hC,EACJwiC,OAAO,QACPC,UAAU,OACVjmB,SAAUA,CAAC7W,EAAYsW,KACrBhc,EAAM+/B,OACNhgC,EAAMwc,WAAW7W,EAAOsW,EAAG,YAS7C,CAEO,SAASymB,EAAW1iC,GACzB,MAAM2iC,GAAU/C,EAAAA,EAAAA,mBAEhB,OAAO7gC,EAAAA,EAAAA,KAACijC,EAAmB,IAAKhiC,EAAOC,MAAO0iC,GAChD,C,uFCjCO,SAASC,EAAOhkC,GAON,IAPO,MACtBikC,EAAQ,IAAG,QACXpB,EAAU,EAAC,eACXqB,GAAiB,EAAK,eACtBC,EAAc,iBACdC,EAAgB,SAChB1iC,GACa1B,EACb,MAAOkiC,EAASmC,GAAcphC,EAAAA,UAAe,IACtCqhC,EAAaC,GAAkBthC,EAAAA,UAAe,GAmBrD,OAjBAA,EAAAA,WAAgB,KACd,MAAMuhC,EAAoB/hC,OAAOugC,YAAW,IAAMqB,GAAW,IAAOJ,GAEpE,IAAIQ,EAQJ,OAPI5B,EAAU,IACZ4B,EAAgBhiC,OAAOugC,YAAW,KAEhC,GADAuB,GAAe,GACXL,EAAgB,MAAM,IAAIpf,KAAO,GACpC+d,IAGE,KACLE,aAAayB,GACbzB,aAAa0B,EAAc,CAC5B,GACA,CAACR,EAAOpB,EAASqB,IAEfhC,EAEDoC,GACKnkC,EAAAA,EAAAA,KAAAsB,EAAAA,SAAA,CAAAC,SAAG0iC,KAGLjkC,EAAAA,EAAAA,KAAAsB,EAAAA,SAAA,CAAAC,SAAGA,KANWvB,EAAAA,EAAAA,KAAAsB,EAAAA,SAAA,CAAAC,SAAGyiC,GAO1B,C,kbCpEO,MAAMV,EAAgBxgC,EAAAA,cAAoB,QAE1C,SAASyhC,IACd,OAAOzhC,EAAAA,WAAiBwgC,EAC1B,CAMO,SAASkB,EAAen1B,GAC7B,OAAOo1B,EAAAA,EAAsB,IAAKp1B,EAAUq1B,SAAUxC,EAAAA,GACxD,CAEO,MAAMyC,EAAoB7hC,EAAAA,cAM9B,CACD8hC,SAAS,EACTC,eAAWhkC,EACXikC,YAAa,CAAE74B,EAAG,EAAGC,EAAG,GACxB64B,iBAAkBA,OAClBC,eAAgBA,SAMX,SAASC,EAAQL,GACtB,MAAMM,EAAWpiC,EAAAA,QAAa,GACxB+hC,EAAY/hC,EAAAA,OAA6B,MACzCqiC,EAAgBN,EAAUjnC,SAMzBknC,EAAaE,GAAkBliC,EAAAA,SAAe,CAAEmJ,EAAG,EAAGC,EAAG,IAC1Dk5B,EAAiBtiC,EAAAA,OAAa,CAAEmJ,EAAG,EAAGC,EAAG,IACzCm5B,EAAWviC,EAAAA,OAAa,CAAEmJ,EAAG,EAAGC,EAAG,KAEjCtO,QAASmnC,GAAqBjiC,EAAAA,QAAa,KACjDkiC,EAAe,CAAE/4B,EAAG,EAAGC,EAAG,GAAI,IA6ChC,OA1CApJ,EAAAA,WAAgB,KACdsiC,EAAexnC,QAAU,IAAKknC,EAAa,GAC1C,CAACA,IAEJhiC,EAAAA,WAAgB,KACd,IAAK8hC,IAAYO,IAAiBnrB,EAAAA,EAAAA,MAAY,OAE9C,MAAM0gB,EAAexd,IACnBgoB,EAAStnC,SAAU,EAEnBynC,EAASznC,QAAU,CACjBqO,EAAGiR,EAAG6b,MAAQqM,EAAexnC,QAAQqO,EAAI3J,OAAOgjC,QAChDp5B,EAAGgR,EAAG+b,MAAQmM,EAAexnC,QAAQsO,EAAI5J,OAAOijC,QACjD,EAGGC,EAAYA,KAChBN,EAAStnC,SAAU,CAAK,EAGpB6nC,EAAevoB,IACnB,IAAKgoB,EAAStnC,QAAS,OAEvB,MAAMqO,EAAIiR,EAAG6b,MAAQsM,EAASznC,QAAQqO,EAAI3J,OAAOgjC,QAC3Cp5B,EAAIgR,EAAG+b,MAAQoM,EAASznC,QAAQsO,EAAI5J,OAAOijC,QAEjDP,EAAe,CAAE/4B,IAAGC,KAAI,EAQ1B,OALAi5B,EAAcphC,iBAAiB,cAAe22B,GAC9CyK,EAAcphC,iBAAiB,WAAYghC,GAC3CziC,OAAOyB,iBAAiB,YAAayhC,GACrC9sB,SAASM,KAAKjV,iBAAiB,cAAe0hC,GAEvC,KACLN,EAAclhC,oBAAoB,cAAey2B,GACjDyK,EAAclhC,oBAAoB,WAAY8gC,GAC9CziC,OAAO2B,oBAAoB,YAAauhC,GACxC9sB,SAASM,KAAK/U,oBAAoB,cAAewhC,EAAY,CAC9D,GACA,CAACb,EAASO,EAAeJ,IAErB,CACLH,UACAC,YACAC,cACAE,iBACAD,mBAEJ,C,eC/EO,SAASW,EAAS7lC,GAA6E,IAA5E,UAAE8lC,EAAS,MAAEvsB,KAAUnY,GAAmDpB,EAClG,MAAM+lC,EAAa9iC,EAAAA,OAAoC,OACjD,cAAE+iC,EAAa,cAAEvsB,IAAkBwsB,EAAAA,EAAAA,KACnCC,EAAajjC,EAAAA,WAAiB6hC,GAEpC7hC,EAAAA,WAAgB,KACd,MAAMkjC,EAAWA,KACf,MAAM,IAAEt4B,EAAM,EAAC,OAAEE,EAAS,EAAC,KAAEC,EAAO,EAAC,MAAEF,EAAQ,GAAMo4B,EAAWlB,WAAWjnC,SAAS+Y,yBAA2B,CAAC,GAC1G,aAAEgD,EAAY,YAAEnX,GAAgBF,OAAOoW,SAASmB,iBAClDnM,EAAM,GAAKE,EAAS+L,GAAgB9L,EAAO,GAAKF,EAAQnL,IAC1DujC,EAAWhB,kBACb,EAMF,OAHAziC,OAAOyB,iBAAiB,SAAUiiC,GAClCA,IAEO,KACL1jC,OAAO2B,oBAAoB,SAAU+hC,GACrCL,KAAa,CACd,GAGA,IAEH7iC,EAAAA,WAAgB,KACd+iC,EAAcD,EAAWhoC,QAAQ,GAChC,CAACioC,IAEJ/iC,EAAAA,WAAgB,KACdijC,EAAWf,gBAAgBiB,IACzB,MAAM,IAAEv4B,EAAM,GAAMq4B,EAAWlB,WAAWjnC,SAAS+Y,yBAA2B,CAAC,EAC/E,MAAO,IAAKsvB,EAAc/5B,EAAG+5B,EAAa/5B,EAAI8D,KAAK9I,IAAIwG,EAAK,GAAI,GAChE,GAGD,CAAC4L,IAEJ,MAAM4sB,EAAiBpjC,EAAAA,SAAc,IAC/BijC,EAAWnB,QACN,IAAKxrB,EAAO+sB,UAAY,eAAcJ,EAAWjB,YAAY74B,QAAQ85B,EAAWjB,YAAY54B,WAE9FkN,GACN,CAACA,EAAO2sB,IAEX,OACE/lC,EAAAA,EAAAA,KAACg1B,EAAAA,GAAG,IACE/zB,EACJiD,IAAK0hC,EACL7lC,UAAWE,IAAW,oDAAqDgB,EAAMlB,WACjFqZ,MAAO8sB,EAAe3kC,SAErBN,EAAMM,UAGb,CCzEO,SAAS6kC,EAAcnlC,GAC5B,OACEjB,EAAAA,EAAAA,KAAA,UACMiB,EACJ,iBACA,cAAY,iBACZlB,UAAWE,IAAWgB,EAAMlB,UAAW,6DAG7C,CCfO,SAASqjC,EAAuBliC,GACrC,MAAO,CACLmlC,cAAenlC,EAAM6gC,UAAY7gC,EAAMolC,UACvCnD,eAAgBjiC,EAAM6gC,UAAY7gC,EAAMolC,UAE5C,CCMO,IAAKC,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,iBAAVA,EAAAA,EAAU,mBAAVA,CAAU,MA0DtB,MAAMC,EAAgC,0BAEhCR,EAAWA,KAEfttB,SAASM,KAAKI,MAAMqtB,YAAYD,EAAgC,GAAE9tB,SAASmB,gBAAgBrX,gBAAgB,EAOtG,SAASkkC,EAAM7mC,GAemB,IAflB,MACrBqB,EAAK,cACLylC,EAAa,OACbC,EAAM,eACNpF,EAAc,SACdjgC,EAAQ,KACR0/B,EAAI,UACJ4F,EAAS,YACTC,GAAc,EAAK,SACnBpI,EAAW,SAAQ,mBACnBqI,GAAqB,EAAK,KAC1BjoC,EAAO,QAAO,aACdkoC,EACA,aAAcC,KACXhmC,GACkCpB,EACrC,MAAMkmC,EAAad,EAAQ6B,IACrB,cAAE3D,GAAkBC,EAAuBliC,GAejD,GAbA4B,EAAAA,WAAgB,KACd,IAAIqgC,EAOJ,OAHA7gC,OAAOyB,iBAAiB,SAAUiiC,GAClCA,IAEO,KACL1jC,OAAO2B,oBAAoB,SAAU+hC,EAAS,CAC/C,GACA,CAAC7C,IAEAA,EACF,OAAO,KAGT,MAAM+D,EAAgBhmC,EAAMimC,MAAQrkC,EAAAA,SAAiBskC,EAAAA,EACrD,OACEpnC,EAAAA,EAAAA,KAACknC,EAAa,CAAA3lC,UACZvB,EAAAA,EAAAA,KAACykC,EAAAA,EAAa,IACRvjC,EACJqgC,oBAAoB,EACpBsF,UAAWA,EACX5F,KAAMA,GAAQ//B,EAAM+/B,KACpB,aAAYgG,EACZI,uBAAwBV,EAAcplC,SAErC8mB,IAAA,IAAC,gBAAEif,EAAe,eAAEC,KAAmBC,GAAYnf,EAAA,OAClDroB,EAAAA,EAAAA,KAAA,UACMwnC,EACJznC,UAAWE,IAAW,2CAA4C,CAChE,eAAgBsmC,EAAWznC,KAAUynC,EAAWY,MAChD,gBAAiBZ,EAAWznC,KAAUynC,EAAWkB,OACjD,sBAAuBV,IACtBxlC,UAEHF,EAAAA,EAAAA,MAAA,OACEimC,gBAAiBA,EACjBC,eAAgBA,EAChBxnC,UAAWE,IACT,qFACAsmC,EAAWznC,KAAUynC,EAAWY,QAASO,EAAAA,EAAAA,IAAoBC,EAAAA,GAAcjJ,IAC3E,CACE,sBAAuB6H,EAAWznC,KAAUynC,EAAWY,MACvD,cAAeZ,EAAWznC,KAAUynC,EAAWkB,SAGnDruB,MAAO,CAAEhK,MAAQ,gCAAyC7N,SAAA,EAExDwlC,IACA/mC,EAAAA,EAAAA,KAAComC,EAAa,CAACrmC,UAAWinC,EAAc5lB,QAASogB,GAAkBP,GAAQ//B,EAAM+/B,QAEnFjhC,EAAAA,EAAAA,KAAC2kC,EAAkBiD,SAAQ,CAAChhC,MAAOm/B,EAAWxkC,UAC5CvB,EAAAA,EAAAA,KAACsjC,EAAcsE,SAAQ,CAAChhC,MAAM,WAAUrF,UACtCvB,EAAAA,EAAAA,KAAC0lC,EAAS,IACJzkC,EACJlB,UAAWE,IAAWgB,EAAMlB,UAAW,CACrC,sBAAuBgnC,IAEzBpB,UAAWA,KACTiB,MACAb,EAAWhB,kBAAkB,EAC7BxjC,SAEDA,YAKL,KAKhB,C,eC5JO,SAASoe,EAAU9f,GAA4E,IAA3E,WAAE+xB,GAAa,KAAS3wB,GAAiDpB,EAClG,MAAMgoC,EAAe/kC,EAAAA,OAA6B,MAYlD,OAVAA,EAAAA,WAAgB,KACd,MAAMglC,EAAYD,EAAajqC,QAE/B,IAAIoc,EAAAA,EAAAA,OAAc8tB,EAGhB,OAFAC,EAAAA,EAAAA,IAAkBD,GAEX,KAAME,EAAAA,EAAAA,IAAiBF,EAChC,GACC,KAGD9nC,EAAAA,EAAAA,KAAA,OACEkE,IAAK2jC,KACD5mC,EACJlB,UAAWE,IAAWgB,EAAMlB,UAAW,kBAAmB,CACxD,MAAO6xB,IACNrwB,SAEFN,EAAMM,UAGb,CC3BO,SAAS0mC,EAAkBpoC,GAA2E,IAA1E,SAAE6+B,KAAaz9B,GAAyDpB,EACzG,OACEG,EAAAA,EAAAA,KAAC0mC,EAAM,CACLxlC,MAAOD,EAAMC,MACb,aAAYD,EAAM,cAClBlB,UAAU,OACVinC,aAAa,4BACbtI,SAAUA,EAASn9B,UAEnBF,EAAAA,EAAAA,MAACse,EAAU,CAAApe,SAAA,EACTvB,EAAAA,EAAAA,KAAC0B,EAAAA,QAAO,CAACC,MAAO,EAAG5B,UAAU,wBAAuBwB,SACjDN,EAAMm9B,SAETp+B,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAC9M,KAAK,QAAO1S,SAAEN,EAAMM,YAC/BvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,2CAA0CwB,SAAEN,EAAMinC,cAIzE,C,0BCrBO,MAAMC,EAAgBrlC,EAAAA,YAC3B,CAAAjD,EAAyCqE,KAA+C,IAAvF,MAAEhD,KAAUD,GAA0BpB,EACrC,MAAMuoC,EAAkBtlC,EAAAA,WAAiBulC,EAAAA,iBAEzC,OACEroC,EAAAA,EAAAA,KAACykC,EAAAA,EAAuB,CACtBvgC,IAAKA,KACDjD,KACAC,EACJkgB,QAAUlE,IAERkrB,GAAiBryB,KAAKkrB,OACtBhgC,EAAMmgB,UAAUlE,EAAG,EACnB3b,SAEDN,EAAMM,UACiB,IClBzB,SAAS2f,EAAYrhB,GAA2E,IAA1E,QAAE4N,GAAU,KAASxM,GAAmDpB,EACnG,OACEG,EAAAA,EAAAA,KAAA,UACMiB,EACJlB,UAAWE,IACTgB,EAAMlB,UACN,oFACA,CAAE,MAAO0N,IACTlM,SAEDN,EAAMM,UAGb,C,0BCqBO,SAASugB,EAAYjiB,GAOmB,IAPlB,aAC3BkiB,EAAY,SACZxgB,EAAQ,UACRxB,EAAS,qBACTuoC,GAAuB,EAAI,aAC3BC,GAAe,EAAI,UACnBC,GAAY,GAC+B3oC,EAC3C,MAAMkmC,EAAajjC,EAAAA,WAAiB6hC,GAEpC,OACEtjC,EAAAA,EAAAA,MAAA,OACE6C,IAAK6hC,EAAWlB,UAChB,cAAY,gBACZ9kC,UAAWE,IACTF,EACA,uGACA,CACE,qCAAsCgmC,EAAWnB,QACjD,WAAY2D,EACZ,OAAQD,IAEV/mC,SAAA,CAEDA,IACEinC,GACCxoC,EAAAA,EAAAA,KAAC0B,EAAAA,QAAO,CAACC,MAAO,EAAG5B,UAAU,OAAMwB,SAChCA,IAGHA,GAEHwgB,IACC/hB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CACLphB,UAAU,OACVuhB,MAAM,UACNiW,WAAW,SACXnW,QAASW,EACT,cAAY,sBAAqBxgB,UAEjCvB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,QAAQ0J,MAAO,SAKpC,C,2TClFO,MAAMi5B,EAAkBvlC,EAAAA,cAGrB,MAEH,SAAS2lC,EAAiBp5B,GAC/B,MAAMq5B,EAAU5lC,EAAAA,WAAiBulC,GAEjC,OAAO5D,EAAAA,EAAoB,IACtBp1B,EACHs5B,MAAM,EACNjE,SAAUxC,EAAAA,EACV0G,kBAAkB,EAClBC,gBAAiBH,GAAS3yB,KAAO,EAAE,EAAG,GAAK,CAAC,EAAG,GAC/CoxB,OAAO,GAEX,C,eC6BA,SAAS2B,EAAiBjpC,EAYxBqE,GACA,IAZA,MACEjF,EAAK,aACLokC,EAAY,MACZniC,EACA,aAAc+lC,EAAS,SACvB1lC,EAAQ,SACRwnC,EAAQ,SACR9T,EAAQ,SACR+T,KACG/nC,GACoCpB,EAGzC,MAAMqjC,GAASqB,EAAAA,EAAAA,aACTmE,EAAU5lC,EAAAA,WAAiBulC,GAE3BY,EAAgB/nC,GAChB,cAAEiiC,IAAkBC,EAAAA,EAAAA,wBAAuBliC,GAAS,CAAE6gC,SAAS,EAAOuE,WAAW,IAEvF,IAAKyC,IAAaE,EAChB,MAAM,IAAItkB,MAAM,gEAGlB,MAAMukB,EAAmBpmC,EAAAA,OAAaimC,GAAYC,EAAWlmC,EAAAA,SAAiBskC,EAAAA,GAAQxpC,QAEtF,OACEyD,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACykC,EAAAA,EAAiB,CAACvgC,IAAKA,KAAS+kC,KAAmB5F,EAAY9hC,SAC5D4nC,GACArmC,EAAAA,aAAmB7D,EAAO,IACrBkqC,KACAlqC,EAAMgC,MACTg0B,WACAuB,OAAQv3B,EAAMgC,MAAMu1B,QAAUyS,EAAclH,aAIhDoB,IACAnjC,EAAAA,EAAAA,KAACkpC,EAAgB,CAAA3nC,UACfvB,EAAAA,EAAAA,KAACykC,EAAAA,EAAW,IAAKwE,EAAe,aAAYhC,EAAU1lC,SACnD8mB,IAAA,IAAC,gBAAEif,EAAe,eAAEC,KAAmBC,GAAYnf,EAAA,OAClDroB,EAAAA,EAAAA,KAAA,UACMwnC,EACJznC,UAAWE,IAAWijC,EAAQ,+BAC9B9pB,MAAO4vB,OAAWnoC,EAAY2mC,EAAWpuB,MAAM7X,UAE/CvB,EAAAA,EAAAA,KAACqoC,EAAgBT,SAAQ,CAAChhC,MAAO,CAAE4L,OAAQy2B,EAAelzB,KAAM2yB,GAAS3yB,MAAQkzB,GAAgB1nC,UAC/FvB,EAAAA,EAAAA,KAACg1B,EAAAA,GAAG,IACE/zB,EACJg0B,SAAUA,EACVqS,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgB0B,EAAc7nC,UAC9BrB,UAAWE,IAAWgB,EAAMlB,UAAW,yBAA0B,CAC/D,uBAAsD,aAA9BkpC,EAAcG,YACtC,aAA4C,eAA9BH,EAAcG,cAC3B7nC,SAEFuB,EAAAA,SAAAA,IAAmBvB,GAAWyvB,GACxBluB,EAAAA,eAAqBkuB,GAEtBA,EAAMlyB,OAASuqC,GACVrpC,EAAAA,EAAAA,KAACspC,EAAqB,CAACC,YAAaN,EAAc1nC,SAAEyvB,IAGtDluB,EAAAA,aAAmBkuB,EAAO,IAC5BA,EAAM/vB,MACTg0B,aARuCjE,SAa3C,QAOpB,CAEO,MAAMqY,EAAWvmC,EAAAA,WAAiBgmC,GAoBzC,SAASQ,EAAqB/gB,GAAwD,IAAvD,YAAEghB,EAAW,SAAEhoC,GAAsCgnB,EAClF,MAAMrnB,EAAQunC,IAEd,OACEzoC,EAAAA,EAAAA,KAACykC,EAAAA,EAAe,IAAK8E,EAAWhoC,SAC5BioC,GAAc1mC,EAAAA,aAAmBvB,EAAU,IAAKA,EAASN,MAAOoiC,aAAcmG,EAAWtoC,WAGjG,C,0BC3JO,SAASuoC,EAAW5pC,GAAuD,IAAtD,SAAE0B,KAAaN,GAAqCpB,EAC9E,MAAMqB,EAAQujC,EAAAA,IAEd,OACEzkC,EAAAA,EAAAA,KAACykC,EAAAA,EAAc,IAAKvjC,KAAWD,EAAKM,SACjCuB,EAAAA,SAAAA,IAAmBvB,GAAWyvB,GACxBluB,EAAAA,eAAqBkuB,IAGxBhxB,EAAAA,EAAAA,KAACykC,EAAAA,EAAe,IAAKvjC,KAAW8vB,EAAM/vB,MAAKM,SACvCioC,GAAc1mC,EAAAA,aAAmBkuB,EAAOwY,KAJLxY,KAUjD,C,0BCAA,SAAS0Y,EAAqB7pC,EAW5BqE,GACA,IAVEsd,GAAI4Q,EAAW,MACflxB,EAAK,SACLyoC,EAAQ,aACRC,GAAe,EAAI,SACnBroC,EAAQ,SACR0zB,EAAQ,KACRhhB,KACGhT,GACsCpB,EAG3C,MAAM6oC,EAAU5lC,EAAAA,WAAiBulC,GAEjC,OACEroC,EAAAA,EAAAA,KAACykC,EAAAA,EAAe,CAACvgC,IAAKA,KAASwkC,GAASl2B,UAAYvR,EAAKM,SACrDioC,IACA,MAAMhT,EAASgT,EAAU,mBAAqBd,GAASl2B,OAAO8zB,UACxDuD,EAAatpB,QAAQipB,EAAU,kBAE/BM,EAAY,CAChB,iBAAkBtT,EAClB,kCAAmCA,GAGrC,OACEn1B,EAAAA,EAAAA,MAAC8f,EAAAA,OAAM,IACAqoB,EACLhoB,GAAI4Q,EACJlxB,MAAOA,EACPogB,MAAOkV,EAAS,WAAa,cAC7BA,OAAQA,EACRvB,SAAUA,GAAY,QACtBl1B,UAAWE,IAAWgB,EAAMlB,UAAW,CACrC,qBAAsB4pC,EACtB,6BAA8BnT,IAEhCgB,aAAcv3B,IAAWgB,EAAMu2B,aAAc,eAC7CvjB,KAAMA,IAAS01B,EAAW,OAAS,WACnCjY,MAAM,OACN+F,aACEM,EAAAA,EAAAA,iBAAgB92B,EAAMw2B,cACpBz3B,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CACHprB,KAAMzE,EAAMw2B,YACZ13B,UAAWE,IAAW6pC,EAAW,OAAQ,CAAE,mBAAoBH,MAGjE1oC,EAAMw2B,YAGV9G,cACEoH,EAAAA,EAAAA,iBAAgB92B,EAAM0vB,eACpB3wB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAMzE,EAAM0vB,aAAc5wB,UAAWE,IAAW6pC,EAAW,UAEjE7oC,EAAM0vB,aAGVvP,QAAUlE,IAEJ0sB,IAAiBC,GACnBnB,GAAS3yB,KAAKkrB,OAGhBuI,EAAUpoB,UAAUlE,EAAG,EACvB3b,SAAA,CAEDA,EACAooC,IAAY3pC,EAAAA,EAAAA,KAAA,OAAKD,UAAU,kDAAiDwB,SAAEooC,MACxE,GAKnB,CAMO,MAAMI,EAAejnC,EAAAA,WAAiB4mC,G,0BCnGtC,SAASM,EAAkB/oC,GAChC,OACEI,EAAAA,EAAAA,MAACojC,EAAAA,EAAoB,IAAKxjC,EAAOugB,GAAG,MAAMzhB,UAAU,QAAOwB,SAAA,EACzDvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,0EACdkB,EAAMM,WACLvB,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAC9M,KAAK,QAAQlU,UAAU,qBAAoBwB,SACnDN,EAAMM,aAKjB,C,eCUO,SAAS0oC,EAAkBpqC,GAMmB,IANlB,MACjCZ,EAAK,SACLsC,EAAQ,QACR6f,EACA,aAAc6lB,KACXhmC,GAC8CpB,EACjD,MAAMqB,EAAQunC,EAAiB,CAAErnC,UAAW,eAE5C,OACEC,EAAAA,EAAAA,MAAC8zB,EAAAA,YAAW,CAACC,YAAY,EAAOC,WAAW,EAAM9zB,SAAA,EAC/CvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACphB,UAAU,aAAauhB,MAAM,QAAQF,QAASA,KAAangB,EAAKM,SACrEtC,KAEHe,EAAAA,EAAAA,KAACqpC,EAAQ,CACPnoC,MAAOA,EACP,aAAY+lC,EACZhoC,OACEe,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,IACDlgB,EACJ0vB,kBAAc9vB,EACdd,UAAU,iBACVw3B,WAAW,SACXz4B,KAAK,SACLmV,KAAMhT,EAAMgT,KAAK1S,UAEjBvB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,WAEdnE,SAEAA,MAIT,C,kICzCO,SAASuvB,EAAIjxB,GAAiD,IAAhD,KAAE6F,EAAM8b,GAAI4Q,KAAgBnxB,GAAkBpB,EACjE,MAAMqqC,EAAYxkC,GAAQykC,EAASzkC,GAAQykC,EAASzkC,GAAQ0sB,EAE5D,GAAI1sB,GAAQ0sB,EACV,MAAM,IAAIzN,MAAM,sEAGlB,IAAKulB,EACH,MAAM,IAAIvlB,MAAM,sBAGlB,OAAO3kB,EAAAA,EAAAA,KAACkqC,EAAS,IAAKjpC,GACxB,CCwFO,SAAS82B,EAAgBryB,GAC9B,SAAKA,GAAwB,iBAATA,MAEXykC,EAASzkC,EACpB,CAKO,MAAMykC,EAAW,CACtBC,IC9HK,SAAiBnpC,GACtB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,+KAGd,EDyHE44B,eE/HK,SAA4BtpC,GACjC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,qOAGd,EF0HE64B,aGhIK,SAA0BvpC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uOAGd,EH2HE84B,aIjIK,SAA0BxpC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,oOAGd,EJ4HE+4B,UKlIK,SAAuBzpC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,iOAIV,EL0HEi5B,SMnIK,SAAsB3pC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,geAGd,EN8HEk5B,eOpIK,SAA4B5pC,GACjC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,4CAGd,EP+HEm5B,oBQrIK,SAAiC7pC,GACtC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2qC,SAAS,UAAUh5B,EAAE,8CAGjC,ERgIEo5B,gBStIK,SAA6B9pC,GAClC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2qC,SAAS,UAAUh5B,EAAE,sDAGjC,ETiIEq5B,UUvIK,SAAuB/pC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,gHAGd,EVkIEs5B,UWxIK,SAAuBhqC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,+GAGd,EXmIEu5B,WYzIK,SAAwBjqC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,6HAGd,EZoIEw5B,Qa1IK,SAAqBlqC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,mHAGd,EbqIEy5B,cc3IK,SAA2BnqC,GAChC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,yOAGd,EdsIE05B,Se5IK,SAAsBpqC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,yNAGd,EfuIE25B,YgB7IK,SAAyBrqC,GAC9B,OACEI,EAAAA,EAAAA,MAACgpC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,SAAA,EACjCvB,EAAAA,EAAAA,KAAA,UAAQurC,GAAG,MAAMC,GAAG,OAAO7f,EAAE,SAC7B3rB,EAAAA,EAAAA,KAAA,UAAQurC,GAAG,OAAOC,GAAG,OAAO7f,EAAE,UAGpC,EhBuIE8f,SiB9IK,SAAsBxqC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,wIAGd,EjByIE+5B,WkB/IK,SAAwBzqC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,8JAIV,ElBuIEg6B,amBhJK,SAA0B1qC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,yNAGd,EnB2IEi6B,YoBjJK,SAAyB3qC,GAC9B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAASrpC,EAAMqpC,SAAW,YAAY/oC,UACpDvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,+IAGd,EpB4IEk6B,aqBlJK,SAA0B5qC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAASrpC,EAAMqpC,SAAW,YAAY/oC,UACpDvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,qJAGd,ErB6IEm6B,MsBnJK,SAAuB7qC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,2NAGd,EtB8IEo6B,SuBpJK,SAAsB9qC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,4KAGd,EvB+IEq6B,gBwBrJK,SAA6B/qC,GAClC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,yRAIV,ExB6IEs6B,KyBtJK,SAAkBhrC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uLAGd,EzBiJEu6B,K0BvJK,SAAkBjrC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,gNAGd,E1BkJEw6B,K2BxJK,SAAkBlrC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTyB,SAAS,UACTz6B,EAAE,sUAIV,E3B+IE06B,oB4BzJK,SAAiCprC,GACtC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,uaAIV,E5BiJE26B,0B6B1JK,SAAuCrrC,GAC5C,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,yYAIV,E7BkJE46B,yB8B3JK,SAAsCtrC,GAC3C,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,6UAIV,E9BmJE66B,6B+B5JK,SAA0CvrC,GAC/C,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,4LAIV,E/BoJE86B,0BgC7JK,SAAuCxrC,GAC5C,OACEI,EAAAA,EAAAA,MAACgpC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,SAAA,EACjCvB,EAAAA,EAAAA,KAAA,QACED,UAAU,gBACV4R,EAAE,+MAEJ3R,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,yMAIV,EhCiJE+6B,gCiC9JK,SAA6CzrC,GAClD,OACEI,EAAAA,EAAAA,MAACgpC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,SAAA,EACjCvB,EAAAA,EAAAA,KAAA,QACED,UAAU,gBACV4R,EAAE,+MAEJ3R,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,wMAEJ3R,EAAAA,EAAAA,KAAA,UAAQD,UAAU,iBAAiBwrC,GAAG,KAAKC,GAAG,KAAK7f,EAAE,OACrD3rB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACT5qC,UAAU,aACV4R,EAAE,6HAIV,EjC4IEg7B,mBkC/JK,SAAgC1rC,GACrC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,ikBAIV,ElCuJEi7B,mBmChKK,SAAgC3rC,GACrC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,mbAIV,EnCwJEk7B,+BoCjKK,SAA4C5rC,GACjD,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,2QAGd,EpC4JEm7B,qCqClKK,SAAkD7rC,GACvD,OACEI,EAAAA,EAAAA,MAACgpC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,SAAA,EACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,yTACR3R,EAAAA,EAAAA,KAAA,UAAQD,UAAU,iBAAiBwrC,GAAG,KAAKC,GAAG,KAAK7f,EAAE,OACrD3rB,EAAAA,EAAAA,KAAA,QACED,UAAU,aACV4R,EAAE,6HAIV,ErCwJEo7B,mBsCnKK,SAAgC9rC,GACrC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,2pBAIV,EtC2JEq7B,qBuCpKK,SAAkC/rC,GACvC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,obAIV,EvC4JEs7B,MAAQhsC,IAAoBjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,IACrCisC,ewCtKK,SAA4BjsC,GACjC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,sZAGd,ExCiKEw7B,MyCvKK,SAAmBlsC,GACxB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,qMAGd,EzCkKEy7B,W0CxKK,SAAwBnsC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uZAGd,E1CmKE07B,Q2CzKK,SAAqBpsC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,smBAGd,E3CoKE27B,K4C1KK,SAAkBrsC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,iWAIV,E5CkKE47B,U6C3KK,SAAuBtsC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,qPAGd,E7CsKE67B,K8C5KK,SAAkBvsC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,wWAIV,E9CoKE87B,K+C7KK,SAAkBxsC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,0UAIV,E/CqKE+7B,SgD9KK,SAAsBzsC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,kNAGd,EhDyKEg8B,SiD/KK,SAAsB1sC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uNAGd,EjD0KEi8B,KkDhLK,SAAkB3sC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,8OAIV,ElDwKEzO,SmDjLK,SAAsBjC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,mIAGd,EnD4KEk8B,WoDlLK,SAAwB5sC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,0EAGd,EpD6KEm8B,WqDnLK,SAAwB7sC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,gJAGd,ErD8KEo8B,WsDpLK,SAAwB9sC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uJAGd,EtD+KEq8B,WuDrLK,SAAwB/sC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,kNAGd,EvDgLEs8B,WwDtLK,SAAwBhtC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,mNAGd,ExDiLEu8B,WyDvLK,SAAwBjtC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,6IAGd,EzDkLEw8B,W0DxLK,SAAwBltC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,wRAGd,E1DmLEy8B,W2DzLK,SAAwBntC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,iNAGd,E3DoLE08B,W4D1LK,SAAwBptC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,kaAGd,E5DqLE28B,U6D3LK,SAAuBrtC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,wuBAGd,E7DsLE48B,c8D5LK,SAA2BttC,GAChC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uEAGd,E9DuLE68B,K+D7LK,SAAkBvtC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,+LAIV,E/DqLE88B,UgE9LK,SAAmBxtC,GACxB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,sQAGd,EhEyLE+8B,MiE/LK,SAAmBztC,GACxB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uFAGd,EjE0LEg9B,KkEhMK,SAAkB1tC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,+FAGd,ElE2LEi9B,KmEjMK,SAAkB3tC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,kTAIV,EnEyLEk9B,coElMK,SAA2B5tC,GAChC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,yCAGd,EpE6LEm9B,QqEnMK,SAAqB7tC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTyB,SAAS,UACTz6B,EAAE,2WAIV,ErE0LEo9B,QsEpMK,SAAqB9tC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,sLAIV,EtE4LEq9B,QuErMK,SAAqB/tC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,wLAGd,EvEgMEs9B,QwEtMK,SAAqBhuC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,ueAGd,ExEiMEu9B,OyEvMK,SAAoBjuC,GACzB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,4FAGd,EzEkMEw9B,Q0ExMK,SAAqBluC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,8SAGd,E1EmMEwF,O2EzMK,SAAoBlW,GACzB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,6JAGd,E3EoMEtC,S4E1MK,SAAsBpO,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,iWAIV,E5EkMEy9B,c6E3MK,SAA2BnuC,GAChC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,ssBAGd,E7EsME09B,M8E5MK,SAAmBpuC,GACxB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,8MAGd,E9EuME29B,Q+E7MK,SAAqBruC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,sSAGd,E/EwME49B,KgF9MK,SAAkBtuC,GACvB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,4UAGd,EhFyME69B,aiF/MK,SAA0BvuC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTyB,SAAS,UACTz6B,EAAE,wdAIV,EjFsME89B,iBkFhNK,SAA8BxuC,GACnC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,4NAGd,ElF2ME+9B,emFjNK,SAA4BzuC,GACjC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,wNAGd,EnF4MEg+B,OoFlNK,SAAoB1uC,GACzB,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,+TAGd,EpF6MEi+B,SqFnNK,SAAsB3uC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,2KAIV,ErF2MEk+B,UsFpNK,SAAuB5uC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,0GAGd,EtF+MEm+B,UuFrNK,SAAuB7uC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,iwBAIV,EvF6MEo+B,YwFtNK,SAAyB9uC,GAC9B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,8aAGd,ExFiNEq+B,UyFvNK,SAAuB/uC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,4QAIV,EzF+MEs+B,gB0FxNK,SAA6BhvC,GAClC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,oZAIV,E1FgNEu+B,Y2FzNK,SAAyBjvC,GAC9B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,6RAIV,E3FiNEw+B,W4F1NK,SAAwBlvC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,2IAIV,E5FkNEy+B,c6F3NK,SAA2BnvC,GAChC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,q0BAGd,E7FsNE0+B,S8F5NK,SAAsBpvC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqvC,KAAK,OAAOC,OAAQtvC,EAAMqvC,KAAMhG,QAAQ,YAAW/oC,UACjEvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,6IAGd,E9FuNE6+B,Y+F7NK,SAAyBvvC,GAC9B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,yQAGd,E/FwNE8+B,agG9NK,SAA0BxvC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,kLAIV,EhGsNE++B,aiG/NK,SAA0BzvC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,+KAIV,EjGuNEg/B,UkGhOK,SAAuB1vC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,qIAGd,ElG2NEi/B,cmGjOK,SAA2B3vC,GAChC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,mZAGd,EnG4NEk/B,YoGlOK,SAAyB5vC,GAC9B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,gaAIV,EpG0NEm/B,aqGnOK,SAA0B7vC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,qdAIV,ErG2NEo/B,SsGpOK,SAAsB9vC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,uVAIV,EtG4NEq/B,gBuGrOK,SAA6B/vC,GAClC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,mXAIV,EvG6NEs/B,SwGtOK,SAAsBhwC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,kpBAGd,ExGiOEu/B,ayGvOK,SAA0BjwC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,4QAIV,EzG+NEw/B,U0GxOK,SAAuBlwC,GAC5B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,mpBAIV,E1GgOEy/B,S2GzOK,SAAsBnwC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,uMAIV,E3GiOE0/B,a4G1OK,SAA0BpwC,GAC/B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,8QAGd,E5GqOE2/B,W6G3OK,SAAwBrwC,GAC7B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,8QAGd,E7GsOE4/B,S8G5OK,SAAsBtwC,GAC3B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QAAM2R,EAAE,uLAGd,E9GuOE6/B,oB+G7OK,SAAiCvwC,GACtC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,wKAIV,E/GqOE8/B,kBgH9OK,SAA+BxwC,GACpC,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,uKAIV,EhHsOE+/B,QiH/OK,SAAqBzwC,GAC1B,OACEjB,EAAAA,EAAAA,KAACqqC,EAAAA,EAAG,IAAKppC,EAAOqpC,QAAQ,YAAW/oC,UACjCvB,EAAAA,EAAAA,KAAA,QACE2qC,SAAS,UACTh5B,EAAE,yTAIV,E,8FCNO,SAAS04B,EAAGxqC,GAAgE,IAA/D,UAAEE,EAAS,MAAEqP,EAAQ,GAAE,OAAEhB,EAASgB,KAAUnO,GAAiBpB,EAC/E,OACEG,EAAAA,EAAAA,KAAA,UACMiB,EACJ0wC,MAAM,6BACN5xC,UAAWE,IAAW,kDAAmDF,GACzEqP,MAAOA,EACPhB,OAAQA,GAGd,C,8MCRO,IAAKwjC,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,eAAVA,EAAAA,EAAU,iBAAVA,EAAAA,EAAU,eAAVA,EAAAA,EAAU,iCAAVA,CAAU,MAOVC,EAAa,SAAbA,GAAa,OAAbA,EAAa,QAAbA,EAAa,qBAAbA,CAAa,MAQbC,EAAS,SAATA,GAAS,OAATA,EAAS,qBAATA,EAAS,uBAATA,EAAS,qBAATA,EAAS,oBAATA,CAAS,MAOrB,SAASC,EAAczwB,GAAoC,IAAjB0wB,EAAOrxC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAC/C,OAAQ2gB,GACN,KAAKswB,EAAW3Z,KACd,MAAO,CAAC,EACV,KAAK2Z,EAAWlc,KACd,MAAO,CACLtP,MAAOnmB,IAAW,8EAA+E,CAC/F,oHACG+xC,EACH,iBAAkBA,IAEpBlb,KAAM72B,IAAW,CACf,kDAAmD+xC,EACnD,eAAgBA,KAGtB,KAAKJ,EAAWK,cACd,MAAO,CACL7rB,MAAOnmB,IACL,6FACA,CACE,wEACG+xC,IAAYlxC,eAAevB,eAC9B,gCAAiCyyC,GAAWlxC,eAAevB,eAC3D,iBAAkByyC,IAGtBlb,KAAM72B,IAAW,CACf,iBAAkB+xC,EAClB,eAAgBA,KAGtB,QACE,MAAO,CACL5rB,MAAOnmB,IACL,SACA,sDACA,yEACA,CACE,oQACG+xC,EACH,iBAAkBA,IAGtBlb,KAAM72B,IAAW,CACf,qEAAsE+xC,EACtE,eAAgBA,KAI1B,CAkFA,SAASE,EAAcryC,EAmBrBqE,GACA,IAnBA,MACEjF,EAAK,kBACLwjB,EAAiB,eACjBC,EAAc,KACdzO,EAAO,UAAS,MAChBqN,EAAQ,QAAO,SACf2T,EAAW,UAAS,KACpBn2B,EAAI,kBACJuf,EAA6B,WAATvf,EAAiB,YACrC24B,EAAW,aACX9G,EAAY,WACZuO,EAAU,MACV5gB,EAAK,QACL6zB,EAAO,UACPpyC,EAAS,qBACTqe,GAAuB,KACpBnd,GACiBpB,EAGtB,MAAMuyC,GAAanU,EAAAA,EAAAA,UAAQ,IAAM8T,EAAcH,EAAWtwB,KAAUhD,IAAQ,CAACgD,EAAOhD,IAC9E+zB,GAAmBta,EAAAA,EAAAA,iBAAgBN,GACnC6a,GAAoBva,EAAAA,EAAAA,iBAAgBpH,GACpC4hB,EAAYT,EAAU79B,GAEtBu+B,GAA8BvU,EAAAA,EAAAA,UAClC,KAAM,CACJ,iDAAiD,EACjD,mCAA8C,UAAV3c,EACpC,gBAA2B,SAAVA,KAEnB,CAACA,IAGH,OACEjgB,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,SAAQwB,SAAA,EACrBvB,EAAAA,EAAAA,KAACyyC,EAAAA,MAAK,CAACrU,MAAOn/B,EAAOyzC,aAAcjwB,EAAmB1iB,UAAW2iB,EAAenhB,UAC9EF,EAAAA,EAAAA,MAAA,OAAKtB,UAAWE,IAAWF,EAAW,uBAAuBwB,SAAA,CAC1Dk2B,IACCz3B,EAAAA,EAAAA,KAAA,QACED,UAAWE,IAAW,mCAAoCuyC,EAA6B,CACrF,WAAYD,IAAcT,EAAU5Z,MACpC,SAAUqa,IAAcT,EAAU3Z,QAClC,WAAYoa,IAAcT,EAAU1Z,OACpC,SAAUma,IAAcT,EAAUzZ,QACjC92B,SAEF8wC,GACCryC,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAM+xB,EAA6BroB,MAAO,GAAIrP,UAAWqyC,EAAWtb,OAE1EW,KAINz3B,EAAAA,EAAAA,KAAA,YACMiB,EACJiD,IAAKA,EACLpF,KAAMA,EACNiB,UAAWE,IACTmyC,EAAWhsB,MACXmsB,EACAV,EAAc5c,GACdiK,EACA,uDACA,CACE,8BAA+B9gB,EAC/B,eAAyB,WAATtf,IAA2C,IAAtBuf,EAErC,CAAC8X,EAAAA,cAAAA,OAAsBoc,IAAcT,EAAU5Z,MAC/C,CAAC/B,EAAAA,cAAAA,SAAwBoc,IAAcT,EAAU3Z,QACjD,CAAChC,EAAAA,cAAAA,QAAuBoc,IAAcT,EAAU1Z,OAChD,CAACjC,EAAAA,cAAAA,OAAsBoc,IAAcT,EAAUzZ,OAEjDga,GAAoB,CAClB,OAAQE,IAAcT,EAAU5Z,MAChC,SAAUqa,IAAcT,EAAU3Z,QAClC,SAAUoa,IAAcT,EAAU1Z,OAClC,OAAQma,IAAcT,EAAUzZ,QAEjCha,GACCi0B,GAAqB,CACnB,OAAQC,IAAcT,EAAU5Z,MAChC,SAAUqa,IAAcT,EAAU3Z,QAClC,SAAUoa,IAAcT,EAAU1Z,OAClC,OAAQma,IAAcT,EAAUzZ,OAEpCha,GAAqB,CACnB,SAAUk0B,IAAcT,EAAU5Z,MAClC,OAAQqa,IAAcT,EAAU3Z,QAChC,SAAUoa,IAAcT,EAAU1Z,OAClC,OAAQma,IAAcT,EAAUzZ,UAIrCha,IACCre,EAAAA,EAAAA,KAAA,OACED,UAAWE,IACT,oHACAuyC,EACA,CACE,YAAaD,IAAcT,EAAU5Z,MACrC,UAAWqa,IAAcT,EAAU3Z,QACnC,YAAaoa,IAAcT,EAAU1Z,OACrC,UAAWma,IAAcT,EAAUzZ,QAErC92B,UAEFvB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,gBAAgB0J,MAAO,GAAIrP,UAAU,uCAGnD4wB,IAAiBtS,IAChBre,EAAAA,EAAAA,KAAA,QACED,UAAWE,IAAW,uBAAwBuyC,EAA6B,CACzE,YAAaD,IAAcT,EAAU5Z,MACrC,UAAWqa,IAAcT,EAAU3Z,QACnC,YAAaoa,IAAcT,EAAU1Z,OACrC,UAAWma,IAAcT,EAAUzZ,QAClC92B,SAEF+wC,GACCtyC,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAMirB,EAA8BvhB,MAAO,GAAIrP,UAAWqyC,EAAWtb,OAE3EnG,SAMTwhB,GAA8B,kBAAZA,IACjBnyC,EAAAA,EAAAA,KAAC2yC,EAAY,CAAC5yC,UAAU,wCAAuCwB,SAAE4wC,IAElE7zB,GAA0B,kBAAVA,IAAuBte,EAAAA,EAAAA,KAAC2yC,EAAY,CAAC5yC,UAAU,oBAAmBwB,SAAE+c,MAG3F,CAMA,SAASq0B,EAAYtqB,GAAuE,IAAtE,KAAEpU,EAAO,aAAchT,GAA6ConB,EACxF,OACEroB,EAAAA,EAAAA,KAAA,UACMiB,EACJlB,UAAWE,IAAWgB,EAAMlB,UAAW,CACrC,WAAY,CAAC,QAAS,WAAWG,SAAS+T,GAC1C,UAAW,CAAC,SAAU,SAAS/T,SAAS+T,MAIhD,CAIA,SAAS2+B,EAAiBrqB,EAExBrkB,GACA,IAFA,MAAEjF,EAAK,MAAEqiB,EAAQ,QAAO,SAAE2T,EAAW,UAAS,WAAEiK,EAAU,MAAE5gB,EAAK,QAAE6zB,EAAO,UAAEpyC,KAAckB,GAAsBsnB,EAGhH,MAAMsqB,GAAgB5U,EAAAA,EAAAA,UAAQ,IAAM8T,EAAcH,EAAWtwB,KAAUhD,IAAQ,CAACgD,EAAOhD,IAEvF,OACEjd,EAAAA,EAAAA,MAAA,OAAAE,SAAA,EACEvB,EAAAA,EAAAA,KAACyyC,EAAAA,MAAK,CAACrU,MAAOn/B,EAAMsC,UAClBvB,EAAAA,EAAAA,KAAA,OAAKD,UAAWE,IAAWF,EAAW,eAAewB,UACnDvB,EAAAA,EAAAA,KAAA,eACMiB,EACJiD,IAAKA,EACLnE,UAAWE,IACT4yC,EAAczsB,MACd8Y,EACA2S,EAAc5c,GACd,2FAKPkd,GAA8B,kBAAZA,IACjBnyC,EAAAA,EAAAA,KAAC2yC,EAAY,CAAC5yC,UAAU,wCAAuCwB,SAAE4wC,IAElE7zB,GAA0B,kBAAVA,IAAuBte,EAAAA,EAAAA,KAAC2yC,EAAY,CAAC5yC,UAAU,oBAAmBwB,SAAE+c,MAG3F,CAEO,MAAMqhB,GAAQnH,EAAAA,EAAAA,YAAW0Z,GACnBpP,GAAWtK,EAAAA,EAAAA,YAAWoa,E,uKCxV5B,MAAME,EAAchwC,EAAAA,cAAwD,MAE5E,SAASiwC,EAAahhC,GAC3B,OAAO0yB,EAAAA,EAAyB,IAAK1yB,EAAS42B,MAAM,EAAMC,kBAAkB,GAC9E,C,qCCkBO,SAASoK,EAAQnzC,GAUmD,IAViB,GAC1F2hB,EAAE,YACFyxB,EAAc,OAAM,aACpBC,EAAY,QACZ9xB,EAAO,WACP+xB,EAAU,UACVpzC,EAAS,cACTqzC,GAAgB,EAAI,SACpB7xC,KACGN,GACoEpB,EACvE,MAAMqB,EAAQ4B,EAAAA,WAAiBgwC,GAE/B,OACE9yC,EAAAA,EAAAA,KAACykC,EAAAA,EAAoB,IACfvjC,KACAD,EACJmgB,QAAUlE,IACRkE,IAAUlE,GACVg2B,IAAeh2B,EAAGxG,cAAcvO,GAAIirC,EAAc,EAEpDD,WAAaj2B,IACXi2B,IAAaj2B,GACbg2B,IAAeh2B,EAAGxG,cAAcvO,GAAIirC,EAAc,EAClD7xC,SAEAioC,IACA,MAAMhT,EAASjW,QAAQipB,EAAU,kBAEjC,OACExpC,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,IACDqoB,EACJhoB,GAAIA,EACJqU,KAAK,WACL/2B,KAAK,SACL4yB,MAAM,OACNpQ,MAAOkV,EAASyc,EAAc,WAC9Bzb,aAAa,uBACbz3B,UAAWE,IAAW,WAAYF,GAAWwB,SAE5CA,GACM,GAKnB,CCzCO,SAAS8xC,EAAIxzC,GAA8F,IAA7F,MAAEqB,EAAK,cAAEoyC,EAAa,kBAAEC,GAAoB,EAAI,SAAE91B,EAAQ,SAAElc,KAAaN,GAAkBpB,EAC9G,MAAM2zC,EAAe1wC,EAAAA,OAA4B,MAGjDA,EAAAA,WAAgB,UAEMjC,IAAlByyC,GACAA,GAAiB,GACjBE,EAAa51C,UAAY01C,GACzBpyC,EAAM0hB,MAAMhiB,OAAS0yC,IAErBpyC,EAAMuyC,KAAKvyC,EAAM0hB,MAAM0wB,GAAenrC,IACtCqrC,EAAa51C,QAAU01C,EACzB,GACC,CAACA,EAAepyC,EAAOA,EAAM0hB,MAAMhiB,SAEtC,MAAMsyC,EAAepwC,EAAAA,aACnB,CAACqF,EAAYurC,KACXj2B,IACEvc,EAAM0hB,MAAM+wB,WAAW7wB,GAASA,EAAK3a,KAAOA,IAC5CurC,EACD,GAEH,CAACj2B,EAAUvc,EAAM0hB,QAGnB,OACE5iB,EAAAA,EAAAA,KAAC8yC,EAAYlL,SAAQ,CAAChhC,MAAO1F,EAAMK,UACjCvB,EAAAA,EAAAA,KAACykC,EAAAA,EAAgB,IACXvjC,KACAD,EACJ40B,KAAK,OACL91B,UAAWE,IAAW,eAAgBgB,EAAMlB,UAAW,CACrD,yCAA0CwzC,IACzChyC,SAEFuB,EAAAA,SAAAA,IAAmBvB,GAAWyvB,GACxBluB,EAAAA,eAAqBkuB,IAEtBA,EAAMlyB,OAASk0C,EACVlwC,EAAAA,aAAmBkuB,EAAO,IAAKA,EAAM/vB,MAAOiyC,aAAcA,IAH1BliB,OAWnD,C,iFC1EO,IAAK4iB,EAAoB,SAApBA,GAAoB,OAApBA,EAAAA,EAAoB,qBAApBA,EAAAA,EAAoB,uBAApBA,EAAAA,EAAoB,2BAApBA,EAAAA,EAAoB,6BAApBA,CAAoB,MAYzB,MAAMC,EAAsB/wC,EAAAA,cAGhC,CACDgxC,KAAMA,OACN7S,KAAMA,SAGD,SAAS8S,IACd,OAAOjxC,EAAAA,WAAiB+wC,EAC1B,C,kVCXA,SAASG,EAAYC,GACnB,MAAM7kC,EAAQ6kC,GAAgB7kC,OAAS9M,OAAOC,WACxC6L,EAAS6lC,GAAgB7lC,QAAU9L,OAAOiX,YAC1CwQ,EAAQkqB,GAAgBlqB,OAAS,EAEvC,MAAO,CACLrc,IAAKumC,GAAgBC,WAAa,EAClCrmC,KAAMomC,GAAgBE,YAAc,EACpCpqB,MAAO/Z,KAAKC,MAAO,EAAI8Z,EAAS,KAAO,IACvC3a,MAAOY,KAAKC,MAAMb,EAAQ2a,GAC1B3b,OAAQ4B,KAAKC,MAAM7B,EAAS2b,GAEhC,CAEO,SAASqqB,EAAoBnzC,GAClC,MAAMC,GAAQsjC,EAAAA,EAAAA,GAAe,CAAE2C,OAAO,EAAOzC,SAAUxC,EAAAA,KAChDmS,EAAcC,GAAmBxxC,EAAAA,SAAyC,OAC3E,cAAEqgC,EAAa,cAAEkD,IAAkBjD,EAAAA,EAAAA,wBAAuBliC,IACzDqzC,EAAUC,GAAe1xC,EAAAA,SAAekxC,EAAY1xC,OAAO2xC,iBAElEnxC,EAAAA,WAAgB,KACd,IAAKuxC,EAAc,OAEnB,MAAM/wC,EAAeC,KAAU2Z,IAC7B,MAAMq3B,EAAWr3B,EAAGxG,cAChB69B,GACFC,GAAY,IAAMR,EAAYO,IAChC,GACC,IAKH,OAHAjyC,OAAO2xC,gBAAgBlwC,iBAAiB,SAAUT,GAClDhB,OAAO2xC,gBAAgBlwC,iBAAiB,SAAUT,GAE3C,KACLhB,OAAO2xC,gBAAgBhwC,oBAAoB,SAAUX,GACrDhB,OAAO2xC,gBAAgBhwC,oBAAoB,SAAUX,EAAa,CACnE,GACA,CAAC+wC,IAEJ,MAAM3L,EAAU5lC,EAAAA,OAAa,CAC3BgxC,KAAM,SAACzxC,GAAqE,IAA/C0P,EAAqCpR,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpE6zC,GAAY,IAAMR,EAAY1xC,OAAO2xC,kBACrCK,EAAgB,CAAEjyC,UAAS0P,YAC3B7Q,EAAM4yC,MACR,EACA7S,KAAM//B,EAAM+/B,OAGRwT,EAAgB3xC,EAAAA,SAAc,KAClC,MAAM,SAAE47B,EAAWkV,EAAAA,GAAAA,YAAoCS,GAActiC,SAAW,CAAC,EACjF,MAAO,CACL,4CAA6C,CAC3C6hC,EAAAA,GAAAA,QACAA,EAAAA,GAAAA,UACA1zC,SAASw+B,GACX,kEAAmE,CACjEkV,EAAAA,GAAAA,SACAA,EAAAA,GAAAA,aACA1zC,SAASw+B,GACX,6CAA8C,CAC5CkV,EAAAA,GAAAA,WACAA,EAAAA,GAAAA,aACA1zC,SAASw+B,GACX,iEAAkE,CAChEkV,EAAAA,GAAAA,QACAA,EAAAA,GAAAA,YACA1zC,SAASw+B,GACZ,GACA,CAAC2V,GAActiC,UAEZ2iC,EAAmB5xC,EAAAA,SACvB,IAAOuxC,GAActiC,QAAQ4iC,OAAS7xC,EAAAA,SAAiBskC,EAAAA,GACvD,CAACiN,GAActiC,QAAQ4iC,SAGzB,OACEtzC,EAAAA,EAAAA,MAACwyC,EAAAA,GAAAA,SAA4B,CAACjtC,MAAO8hC,EAAQ9qC,QAAQ2D,SAAA,CAClDN,EAAMM,UACL4hC,IACAnjC,EAAAA,EAAAA,KAAC00C,EAAgB,CAAAnzC,UACfvB,EAAAA,EAAAA,KAAC0mC,EAAAA,EAAM,IACDxlC,EACJ,aAAW,eACX2lC,WAAW,EACXtF,oBAAoB,EACpBqT,0BAA0B,EAAMrzC,SAE/B1B,IAAA,IAAC,gBAAEynC,EAAe,eAAEC,KAAmBC,GAAY3nC,EAAA,OAClDG,EAAAA,EAAAA,KAAA,UACMwnC,EACJ3R,KAAK,QACL91B,UAAU,kFACVqZ,MAAO,CACL+sB,UAAY,aAAYoO,EAAS1mC,WAAW0mC,EAAS7mC,UACrDnM,UAEFvB,EAAAA,EAAAA,KAAA,OACEsnC,gBAAiBA,EACjBC,eAAgBA,EAChBxnC,UAAWE,IAAWw0C,EAAe,6CAA8C,CACjF,mBAAoBpO,IAEtBjtB,MAAO,CACLhK,MAAOmlC,EAASnlC,MAChBhB,OAAQmmC,EAASnmC,OACjB+3B,UAAY,SAAQoO,EAASxqB,SAC7B8qB,WAAY,QACZtzC,SAED8yC,GAAchyC,WAEb,QAOpB,C,eCjIO,SAASyyC,EACdC,GAEA,MAAMC,EAAcD,EAAiBC,aAAeD,EAAiBrvC,MAAQ,YACvEuvC,EAA2Bh0C,IAC/B,MAAMozC,GAAeN,EAAAA,EAAAA,MACrB,OAAO/zC,EAAAA,EAAAA,KAAC+0C,EAAgB,CAACG,oBAAqBb,KAAmBpzC,GAAe,EAKlF,OAFAg0C,EAAwBD,YAAe,2BAA0BA,KAE1DC,CACT,C,mHCJO,SAASE,EAAal0C,GAC3B,MAAMozC,GAAeN,EAAAA,EAAAA,MAiBrB,OAfAjxC,EAAAA,WAAgB,KACd,IAAIsyC,EAOJ,OANIn0C,EAAMo0C,cACRD,EAAYvS,YAAW,KACrBwR,EAAapT,MAAM,GAClBhgC,EAAMo0C,cAGJ,KACDD,GACFxS,aAAawS,EACf,CACD,GACA,CAACf,EAAcpzC,EAAMo0C,eAGtBh0C,EAAAA,EAAAA,MAAA,OACEtB,UAAWE,IACTgB,EAAMlB,UACN,0JACAwB,SAAA,EAEFvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,uBAAsBwB,SAAEN,EAAMM,YAC7CvB,EAAAA,EAAAA,KAAA,OAAAuB,SAAMN,EAAMinC,UAAWloC,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACC,QAASizB,EAAapT,KAAK1/B,SAAC,cAGjE,C,mQCqDO,SAASw/B,EAAOlhC,GAkBN,IAlBO,MACtBqB,EAAK,SACLK,EAAQ,YACRy/B,GAAc,EAAI,YAClBsU,GAAc,EAAI,cAClB3O,EACA,aAAcM,EAAS,KACvBhG,EAAI,mBACJM,GAAqB,EAAI,SACzBgU,GAAW,EAAK,YAChBC,GAAc,EAAI,eAClBhU,EAAc,oBACdiU,EAAmB,iBACnBC,EAAmBliC,OAAOmiC,iBAAgB,MAC1Cr0B,EAAQ,QAAO,uBACfs0B,GAAyB,EAAK,oBAC9BC,GAAsB,KACnB50C,GACUpB,EACb,MAAMqjC,GAASqB,EAAAA,EAAAA,cACT,cAAEpB,IAAkBC,EAAAA,EAAAA,wBAAuBliC,IAC3C,YAAEqY,IAAgBu8B,EAAAA,EAAAA,GAAc,CAAEC,YAAa5S,IAE/C6S,EAAgB90C,EAAM+0C,sBAAsBr4C,QAC5Cs4C,GAAiBC,EAAAA,EAAAA,GAAoB,CACzCC,eAAgBV,EAChBE,yBACAS,QAASn1C,EAAMm1C,QACfn1C,UAyBF,OAtBA4B,EAAAA,WAAgB,KACd,IAAKkzC,IAAkB90C,EAAM6gC,UAAa6T,IAA0BC,EAAsB,OAE1F,MAAMS,EAAaN,EAAcr/B,wBAC3B4/B,EAAYP,EAAc/vB,aAAa,iBACvCuwB,EAAiBD,EAAY79B,SAASC,eAAe49B,GAAa,KAGpEV,GACFW,GAAgBp9B,MAAMqtB,YAAY,YAAc,GAAE6P,EAAWlnC,UAC/D,GACC,CACDlO,EAAM6gC,QACN7gC,EAAMm1C,QACNL,EACAJ,EACAC,EACAt8B,EACArY,EAAME,UACNs0C,IAGEvS,EAAsB,MAGxBnjC,EAAAA,EAAAA,KAAConC,EAAAA,EAAM,CAAA7lC,UACLvB,EAAAA,EAAAA,KAACykC,EAAAA,EAAc,IACTvjC,EACJ+/B,KAAMA,GAAQ//B,EAAM+/B,KACpBM,mBAAoBA,EACpBqT,yBAA0B5T,EAC1B,aAAYiG,EACZwP,yBAA0BnB,EAC1BjO,uBAAwBV,EAAcplC,SAErC8mB,IAAA,IAAC,gBAAEif,EAAe,eAAEC,KAAmBC,GAAYnf,EAAA,OAClDhnB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAA,OACED,UAAWE,IAAWijC,EAAQ,sCAAuC,CACnE,uBAAwBsS,IAE1Bp0B,SAA4B,IAAnBogB,EAA2BP,GAAQ//B,EAAM+/B,KAAOO,EACzD9G,YAAcnd,IAEZA,EAAMuC,gBAAgB,KAG1B9f,EAAAA,EAAAA,KAAA,UACMwnC,EACJznC,UAAWE,IAAWijC,EAAQ,mDAC9B9pB,MAAO,IAAKouB,EAAWpuB,SAAUq8B,GAAsBl0C,UAEvDF,EAAAA,EAAAA,MAAC2zB,EAAAA,GAAG,CACFsS,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgBrmC,EAAME,UACtBkgB,MAAOA,KACHrgB,EACJlB,UAAWE,IAAW,sBAAuBgB,EAAMlB,WACnDqZ,MAAOw8B,EAAyB,IAAKM,KAAmBj1C,EAAMmY,OAAUnY,EAAMmY,MAAM7X,SAAA,CAEnFg0C,IACCv1C,EAAAA,EAAAA,KAACykC,EAAAA,EAAmB,IAAKvjC,EAAO+S,KAAM,GAAG1S,UACvCvB,EAAAA,EAAAA,KAAC02C,EAAAA,EAAY,CACXt1C,UAAWF,EAAME,UACjBrB,UAAWE,IAAW,CACpB,qEACE80B,EAAAA,GAASzT,KAAWyT,EAAAA,GAAAA,MACtB,gCAAiCA,EAAAA,GAASzT,KAAWyT,EAAAA,GAAAA,WAK5DxzB,SAGJ,KAKb,C,0BCvMA,MAAMo1C,EAAmC,CAAC,EAAG,GAGvC72B,EAAkB5C,IACtBA,EAAG4C,gBAAgB,EAMd,SAAS+gB,EAAgBxxB,GAC9B,MAAMgnC,EAAWhnC,GAAUw5B,iBAAmB8N,EAS9C,MAAO,IARSlS,EAAAA,EAAuB,IAClCp1B,EACHjO,UAAWiO,GAAUjO,WAAa,eAClCynC,gBAAiBwN,EACjB3R,SAAUxC,EAAAA,EACViF,OAAO,IAGYkP,UACvB,CAEO,SAASO,EAAgBvnC,GAC9B,MAAMu0B,EAAU/C,EAAgBxxB,GAC1BwnC,EAAc/zC,EAAAA,OAA4B,MAC1Cg0C,EAAch0C,EAAAA,OAA4B,MAE1Ci0C,EAAgBj0C,EAAAA,QAAa,KACL,OAAxB+zC,EAAYj5C,SACd0E,OAAOsgC,aAAaiU,EAAYj5C,SAEN,OAAxBk5C,EAAYl5C,SACd0E,OAAOsgC,aAAakU,EAAYl5C,QAClC,IAGIo5C,EAAcl0C,EAAAA,QAAa,KAC/Bi0C,EAAcn5C,UACdi5C,EAAYj5C,QAAU0E,OAAOugC,YAAW,KACtCe,EAAQkQ,MAAM,GAvCE,IAwCD,IAGbmD,EAAcn0C,EAAAA,QAAa,KAC/Bi0C,EAAcn5C,UACdk5C,EAAYl5C,QAAU0E,OAAOugC,YAAW,KACtCe,EAAQ3C,MAAM,GA9CE,IA+CD,IAMnB,OAFAn+B,EAAAA,WAAgB,IAAM,IAAMi0C,EAAcn5C,WAAW,IAE9C,IACFgmC,EACHkQ,KAAMkD,EAAYp5C,QAClBqjC,KAAMgW,EAAYr5C,QAClBs5C,YAAaF,EAAYp5C,QACzBu5C,WAAYF,EAAYr5C,QACxB88B,YAAa5a,EAEjB,C,eCzDO,MAAMghB,EAAiBh+B,EAAAA,YAC5B,CAAAjD,EAA0CqE,KAA+C,IAAxF,MAAEhD,KAAUD,GAA2BpB,EACtC,MAAMqjC,GAASqB,EAAAA,EAAAA,aAEf,OACEvkC,EAAAA,EAAAA,KAACykC,EAAAA,EAAwB,CACvBvgC,IAAKA,KACDjD,KACAC,EACJnB,UAAWE,IAAWgB,EAAMlB,UAAW,CACrC,CAACmjC,GAAShiC,EAAM6gC,UACfxgC,SAEFN,EAAMM,UACkB,G,2OCF1B,SAAS61C,EAAYv3C,GAKiB,IAJ3C2hB,GAAI4Q,EAAW,MACflxB,EAAK,SACLK,KACGN,GACsCpB,EACzC,OACEG,EAAAA,EAAAA,KAACykC,EAAAA,EAA8B,IAAKvjC,KAAWD,EAAKM,SAChDioC,IACA,MAAM6N,EAAWn2C,GAAOo2C,YAAc9N,EAAUrhC,GAEhD,OACEnI,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,IACAqoB,EACLhoB,GAAI4Q,GA5BQ,SA6BZoE,OAAQ6gB,EACR/1B,MAAM,WACNxiB,KAAK,SACL4yB,MAAM,OACN8F,aAAcv3B,IAAWgB,EAAMu2B,aAAc,eAAej2B,SAE3DA,GACM,GAKnB,CCXO,SAASg2C,EAAQ13C,GASmB,IATlB,MACvBqB,EAAK,SACLK,EAAQ,WACRi2C,EAAU,aACVC,EAAY,SACZh6B,EAAQ,YACRi6B,EACA,aAAczQ,KACXhmC,GACoCpB,EACvC,MAAM,cAAEsjC,IAAkBC,EAAAA,EAAAA,wBAAuBliC,GAC3CgiC,GAASqB,EAAAA,EAAAA,aAUf,OARAzhC,EAAAA,WAAgB,KACV00C,GAAYG,WACdz2C,EAAM+0C,sBAAsBr4C,SAASg6C,MAAM,CAAEC,eAAe,GAC9D,GAGC,KAGDx2C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACykC,EAAAA,EAAwB,IACnBvjC,KACAs2C,EAEJ7O,UAAM9nC,EACN2gB,GAAIme,EAAAA,MACJgY,WAAW,EACX,aAAY1Q,EACZtM,UAAYzd,IACK,UAAXA,EAAG7L,KACLoM,EAASvc,EAAM42C,YAEjBN,GAAY7c,YAAYzd,EAAG,EAE7B,cAAaw6B,KAEbvU,IACAnjC,EAAAA,EAAAA,KAAConC,EAAAA,EAAM,CAAA7lC,UACLvB,EAAAA,EAAAA,KAACykC,EAAAA,EAA+B,IAAKvjC,KAAWu2C,EAAc,aAAYxQ,EAAU1lC,SACjF8mB,IAAA,IAAC,gBAAEif,EAAe,eAAEC,KAAmBC,GAAYnf,EAAA,OAClDroB,EAAAA,EAAAA,KAAA,UAASwnC,EAAYznC,UAAWE,IAAWunC,EAAWznC,UAAWmjC,EAAQ,+BAA+B3hC,UACtGvB,EAAAA,EAAAA,KAACg1B,EAAAA,GAAG,IACE/zB,EACJqmC,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgBrmC,EAAME,UACtBrB,UAAWE,IAAWgB,EAAMlB,UAAW,8CAA8CwB,SAEpFuB,EAAAA,SAAAA,IAAmBvB,GAAWyvB,GACxBluB,EAAAA,eAAqBkuB,IAEtBA,EAAMlyB,OAASs4C,EACVt0C,EAAAA,aACLkuB,EACA,CACE9vB,QACAskC,UAAWA,KACT/nB,EAASuT,EAAM/vB,MAAM2F,MAAM,IARMoqB,OAiBzC,QAOpB,C,oDClHO,MAAM+mB,EAAwB,CACnC,CAAEryC,KAAM,MAAOukB,gBAAYppB,GAC3B,CAAE6E,KAAM,SAAUukB,WAAYkC,EAAAA,EAAAA,OAC9B,CAAEzmB,KAAM,UAAWukB,WAAYkC,EAAAA,EAAAA,SAC/B,CAAEzmB,KAAM,QAASukB,WAAYkC,EAAAA,EAAAA,OAC7B,CAAEzmB,KAAM,SAAUukB,WAAYkC,EAAAA,EAAAA,S,eCJzB,SAAS6rB,EAAS/2C,GACvB,OAAOjB,EAAAA,EAAAA,KAAA,UAASiB,EAAOlB,UAAWE,IAAWgB,EAAMlB,UAAW,0CAChE,C,0BCGO,SAASk4C,EAAYh3C,GAC1B,OACEI,EAAAA,EAAAA,MAAC22C,EAAQ,CAACj4C,UAAU,uBAAsBwB,SAAA,EACxCvB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAAC1hB,MAAO,GAAI1J,KAAK,UAAU3F,UAAU,mBAC1CC,EAAAA,EAAAA,KAAC0B,EAAAA,QAAO,CAACC,MAAO,EAAG5B,UAAU,OAAMwB,SAAC,gCAGpCF,EAAAA,EAAAA,MAAC0f,EAAAA,UAAS,CAAC9M,KAAK,QAAQlU,UAAU,oDAAmDwB,SAAA,CAAC,mEACnB,KACjEvB,EAAAA,EAAAA,KAAA,KAAGyhB,KAAMy2B,EAAAA,EAAAA,YAAkBn4C,UAAU,gBAAewB,SAAC,oBAEjD,QAGNvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACphB,UAAU,OAAOuhB,MAAM,YAAYF,QAASA,IAAMngB,EAAMk3C,qBAAqB52C,SAAC,YAK5F,C,qCCdO,SAAS62C,EAASv4C,GAAsC,IAArC,UAAEw4C,EAAS,KAAEjW,GAAsBviC,EAC3D,MAAMipB,EAAQsZ,EAAK/mB,cAAckB,QAAQ87B,EAAUh9B,eAE7Ci9B,GAAgBra,EAAAA,EAAAA,UACpB,KAAM,CACJsa,OAAQnW,EAAKlmB,UAAU,EAAG4M,GAC1BuvB,UAAWjW,EAAKlmB,UAAU4M,EAAOA,EAAQuvB,EAAUz3C,QACnD43C,MAAOpW,EAAKlmB,UAAU4M,EAAQuvB,EAAUz3C,WAE1C,CAACy3C,EAAUz3C,OAAQkoB,EAAOsZ,IAG5B,OAAItZ,EAAQ,GAAKuvB,EAAUz3C,OAAS,GAAUZ,EAAAA,EAAAA,KAAA,QAAAuB,SAAO6gC,KAGnD/gC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAA,QAAMD,UAAU,gBAAewB,SAAE+2C,EAAcC,WAC5CD,EAAcD,UAAUz3C,SACzBZ,EAAAA,EAAAA,KAAA,QAAMD,UAAU,oFAAmFwB,SAChG+2C,EAAcD,aAGnBr4C,EAAAA,EAAAA,KAAA,QAAMD,UAAU,gBAAewB,SAAE+2C,EAAcE,UAGrD,CCzBO,SAASC,EAAWx3C,GACzB,OACEI,EAAAA,EAAAA,MAAC+1C,EAAY,IACPn2C,EAAMuoC,UACVtoC,MAAOD,EAAMC,MACb0F,MAAO3F,EAAM6hB,KAAKlE,OAClB7e,UAAU,mEACVy3B,aAAa,kCACb,mBACuB32B,IAArBI,EAAMy3C,WACD,SAAQz3C,EAAMy3C,kCAAkCz3C,EAAM6hB,KAAKlE,cAC5D/d,EACLU,SAAA,EAEDvB,EAAAA,EAAAA,KAAA,QAAMD,UAAU,OAAMwB,UACpBvB,EAAAA,EAAAA,KAACo4C,EAAS,CAAChW,KAAMnhC,EAAM6hB,KAAKlE,OAAQy5B,UAAWp3C,EAAMC,MAAO42C,gBAE9D93C,EAAAA,EAAAA,KAAA,QAAMD,UAAU,uEAAsEwB,UACpFvB,EAAAA,EAAAA,KAACo4C,EAAS,CAAChW,KAAMnhC,EAAM6hB,KAAKjL,QAASwgC,UAAWp3C,EAAMC,MAAO42C,gBAE/D93C,EAAAA,EAAAA,KAAA,QAAMD,UAAU,+BAA8BwB,SAAEN,EAAM6hB,KAAK61B,aAGjE,C,eC/BO,SAASC,EAAqBC,GACnC,MAAMj6B,GAASoQ,EAAAA,EAAAA,GAAmB6pB,GAAW,GAE7C,IAAIC,EAAe,GAEnB,QAHmB1sB,EAAAA,EAAAA,IAAYxN,IAAUm6B,EAAAA,EAAAA,IAAuBn6B,GAAU,MAIxE,KAAKuN,EAAAA,EAAAA,MACH2sB,EAAeZ,EAAAA,EAAAA,QAAat5B,GAC5B,MACF,KAAKuN,EAAAA,EAAAA,MACH2sB,EAAeZ,EAAAA,EAAAA,mBAAwBt5B,GACvC,MACF,KAAKuN,EAAAA,EAAAA,QACH2sB,EAAeZ,EAAAA,EAAAA,qBAA0Bt5B,GACzC,MACF,KAAKuN,EAAAA,EAAAA,OACH2sB,EAAeZ,EAAAA,EAAAA,oBAAyBt5B,GACxC,MACF,QACE,OAAOs5B,EAAAA,EAAAA,SAAct5B,GAGzB,OAAOk6B,GAAgBh4C,eAAek4C,gBAAkB,GAC1D,CCLO,SAASC,EAAWh4C,GACzB,MAAM,KAAE+P,EAAI,UAAEkoC,IAAcC,EAAAA,EAAAA,GAC1B,CAAC,SAAUl4C,EAAMC,MAAM42C,WAAY72C,EAAMgpB,aACzC,KAAMmvB,EAAAA,EAAAA,IAAiBn4C,EAAMC,MAAM42C,WAAY72C,EAAMgpB,aACrD,CAAE2a,QAAS3jC,EAAMC,MAAM42C,WAAWl3C,OAAS,EAAGy4C,kBAAkB,EAAMC,UAAWh5C,IAAUi5C,UAAWj5C,OAElG,YAAEk5C,EAAW,KAAEvY,EAAI,SAAEyD,GAAazjC,EAAMC,MAW9C,OATA4B,IAAAA,WAAgB,KACTo2C,GAAcloC,GAAMpQ,QAAWK,EAAMw4C,iBAG/B/U,IAAaxC,EAAAA,GACtBsX,EAAYtX,EAAAA,IAHZsX,EAAY,GACZvY,IAGF,GACC,CAACiY,EAAWloC,EAAMwoC,EAAavY,EAAMhgC,EAAMw4C,iBAAkB/U,IAE5DwU,GAEAl5C,EAAAA,EAAAA,KAACg4C,EAAQ,CAACj4C,UAAU,cAAawB,UAC/BvB,EAAAA,EAAAA,KAACwjC,EAAAA,QAAO,OAMZniC,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,iDAAgDwB,SAAA,CAC5DyP,GAAwB,IAAhBA,EAAKpQ,SACZZ,EAAAA,EAAAA,KAAA,OAAKD,UAAU,mCAAkCwB,SAC9CyP,EAAKwG,KAAKsL,IACT9iB,EAAAA,EAAAA,KAACy4C,EAAU,CACTv3C,MAAOD,EAAMC,MAEb4hB,KAAMA,EACN41B,WAAYz3C,EAAMy3C,WAClBlP,UACEvoC,EAAMy4C,iBACF,CACEl4B,GAAI,IACJC,KAAMm3B,EAAqB91B,EAAKlE,SAElC,CACEwC,QAAUlE,IACRA,EAAG4C,iBACH7e,EAAM04C,mBAAmB72B,EAAKlE,QAC9B3d,EAAMC,OAAO04C,cAAc,GAAG,IAbnC92B,EAAKlE,YAqBjB3d,EAAMw4C,mBACLz5C,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CACLK,GAAG,IACHzhB,UAAU,8BACVy3B,aAAa,cACb/V,KAAMy2B,EAAAA,EAAAA,SAAcp7B,mBAAmB7b,EAAMC,MAAM24C,cAAgB54C,EAAMC,MAAM42C,aAAav2C,SAC7F,uBAMT,CCpDO,SAASu4C,EAAMj6C,GAKN,IALO,aACrBk6C,GAAe,EAAI,iBACnBN,GAAmB,EAAI,iBACvBC,GAAmB,KAChBz4C,GACSpB,EACZ,MAAM,MAAEm6C,IAAUC,EAAAA,EAAAA,KACZ/4C,GCvCyB6Q,EDuCA,CAC7BmoC,eAAgB,EAChBpC,WAAY72C,EAAMk5C,aAClB/4C,UAAWH,EAAMm5C,kBAAoB,gBCzChC3V,EAAAA,EAAiC,IACnC1yB,EACH2yB,SAAUxC,EAAAA,EACViF,OAAO,EACPwN,QAAQ,EACR9L,gBAAiB,CAAC,EAAG,MANlB,IAA0B92B,ED4C/B,MAAM,cAAEoxB,IAAkBC,EAAAA,EAAAA,wBAAuBliC,GAC3Cm5C,GAAYtH,EAAAA,EAAAA,cAAa,CAAE3J,YAAa,cACvCkR,EAAUC,GAAez3C,EAAAA,SAAe,GAEzC03C,EAAiB13C,EAAAA,QAAcoa,IACnC,OAAQA,EAAG7L,KACT,IAAK,aACHnQ,EAAMu5C,QACN,MACF,IAAK,UACHF,GAAar5C,IAAWA,EAAQ,EAAI62C,EAAsBn3C,QAAUm3C,EAAsBn3C,SAC1F,MACF,IAAK,YACH25C,GAAar5C,IAAWA,EAAQ,GAAK62C,EAAsBn3C,SAE/D,IAOI85C,EAAiB53C,EAAAA,aACpBoa,IACgB,WAAXA,EAAG7L,KAAoBnQ,EAAM6gC,UAC/B7kB,EAAGy9B,kBACHz5C,EAAM+/B,OACR,GAIF,CAAC//B,EAAM6gC,QAAS7gC,EAAM+/B,OAYxB,OANAn+B,EAAAA,WAAgB,KACVqgC,GACFoX,EAAY,EACd,GACC,CAACpX,KAGFnjC,EAAAA,EAAAA,KAACu3C,EAAQ,CACPr2C,MAAOA,EACPnB,UAAU,wBACV,aAAW,SACXy3C,WAAY,CACVl2B,MAAOrgB,EAAMqgB,MACbrN,KAAMhT,EAAMgT,KACZ0jC,UAAW12C,EAAM02C,UACjBiD,YAAa35C,EAAM25C,aAAe,gBAClC/6B,aAAc,MACdg7B,YAAa,MACbC,eAAgB,MAChB93B,UAAW,IACX2X,UAAW+f,EACXl8B,OAAShI,IAEPA,EAAEsJ,gBAAgB,EAEpBof,WAAYj+B,EAAMi+B,WAClBvO,aAAc1vB,EAAM0vB,gBAChBopB,GAAgB,CAAEtiB,YAAa,WAErCggB,aAAc,CACZ13C,UAAWE,IAAWgB,EAAM85C,aAAc,mBAAoB,CAC5D,wBAAyB95C,EAAM+5C,wBAC/B,gBAAiB/5C,EAAM+5C,0BAEzB5hC,MAAO,CACLhK,MAAOnO,EAAM+5C,wBACT95C,EAAM+0C,sBAAsBr4C,SAAS+Y,wBAAwBvH,OAAS,SACtEvO,EACJ4Y,SAAU,UAGdgE,SAAW7W,IACL8yC,EACFp3C,OAAO4U,SAASuK,KAAOm3B,EAAqBhyC,IAE5C3F,EAAM04C,oBAAmB3qB,EAAAA,EAAAA,GAAmBpoB,IAC5C1F,EAAM04C,cAAc,IACtB,UAEwB/4C,IAArBI,EAAMy3C,YAA4B,CAAEhB,YAAc,SAAQz2C,EAAMy3C,oCAAoCn3C,UAEzGF,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,uFAAsFwB,SAAA,CAClGN,EAAMg6C,yBACLj7C,EAAAA,EAAAA,KAACqzC,EAAAA,KAAI,CACH,aAAW,wBACXE,mBAAmB,EACnBxzC,UAAU,oCACVmB,MAAOm5C,EACP/G,cAAegH,EACf78B,SAAWqL,GAAUyxB,EAAYzxB,GACjC6R,UAAW6f,EAAe58C,QAAQ2D,SAEjCw2C,EAAsBvgC,KAAK8iC,IAC1Bt6C,EAAAA,EAAAA,KAACgzC,EAAAA,SAAQ,CAAAzxC,SAAsB+4C,EAAS50C,MAAzB40C,EAAS50C,WAI5By9B,IACAnjC,EAAAA,EAAAA,KAACk7C,EAAAA,cAAa,CACZC,kBAAmBlD,EACnBmD,QAASpB,EACTqB,UAAW,CAACn6C,EAAM24C,aAAc34C,EAAM42C,YAAYv2C,UAElDvB,EAAAA,EAAAA,KAACi5C,EAAU,CACT/3C,MAAOA,EACP+oB,WAAY8tB,EAAsBuC,GAAUrwB,WAC5CyuB,WAAYz3C,EAAMy3C,WAClBe,iBAAkBA,EAClBC,iBAAkBA,EAClBC,iBAAkB14C,EAAM04C,yBAOtC,C,+DEtKA,SAAS2B,EAAqB14B,EAA8Bhc,GAC1D,OAAKA,GAAmB,IAAVA,EAEPgc,EAAM+wB,WAAW7wB,GAASA,EAAKlc,QAAUA,KAFb,CAGrC,CAKO,SAAS20C,EACdr6C,EACAi5C,EACAv3B,EACAnF,GAEA,MAAO61B,EAAekI,GAAoB14C,EAAAA,SAAew4C,EAAqB14B,EAAOu3B,IAC/EsB,EAAe34C,EAAAA,QAAa,IAAM5B,EAAM+/B,SAG9Cn+B,EAAAA,WAAgB,KACd,MAAM44C,EAAWJ,EAAqB14B,EAAOu3B,GAC7CqB,EAAiBE,EAAS,GACzB,CAAC94B,EAAO0wB,EAAe6G,IAE1B,MAAMwB,EAAe74C,EAAAA,aACnB,SAACgmB,GAAwC,IAAzBsqB,IAAazyC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC3B,MAAMi7C,EAAeh5B,EAAMkG,GAM3B,GALA0yB,EAAiB1yB,GAEbsqB,GAAeqI,EAAa79C,UAChC6f,EAASm+B,IAEJA,EAAan6B,OAASm6B,EAAaC,eACtC,OAGF,GAAiC,iBAAtBD,EAAan6B,KAEtB,YADAnf,OAAO4U,SAASuK,KAAOm6B,EAAan6B,MAItC,MAAMq6B,EAAS,IAAIC,IAAIH,EAAan6B,KAAK+N,SAAWltB,OAAO4U,SAASuK,MACpEq6B,EAAO3kC,OAASykC,EAAan6B,KAAKtK,QAAU,GAC5C2kC,EAAOE,KAAOJ,EAAan6B,KAAKu6B,MAAQ,GAExC15C,OAAO4U,SAASuK,KAAOq6B,EAAOj2C,UAChC,GACA,CAAC+c,EAAOnF,EAAU+9B,IAGpB,MAAO,CAAElI,gBAAeqI,eAC1B,C,uUCDO,SAASM,EAAYp8C,GAMN,IANO,MAC3BqB,EAAK,MACLogB,EAAQ,QAAO,iBACf46B,GAAmB,EAAI,UACvBhD,KACGj4C,GACepB,EAClB,MAAMs8C,EAAar5C,EAAAA,SAAc,IArDnC,SAAwBwe,EAAoBkV,GAC1C,OAAQlV,GACN,KAAKgV,EAAAA,YAAAA,MACH,MAAO,CACLhV,MAAO,cACPkW,aAAc,uBACdz3B,UAAWE,IACT,uGACA,CACE,sJACGu2B,EACH,uCAAwCA,IAG5C7F,cAAc3wB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,YAAY3F,UAAU,+CAEnD,KAAKu2B,EAAAA,YAAAA,KACH,MAAO,CACLhV,MAAO,cACPkW,aAAc,uBACdz3B,UAAWE,IAAW,kFAAmF,CACvG,yCAA0Cu2B,EAC1C,kBAAmBA,IAErB7F,cAAc3wB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,YAAY3F,UAAU,4BAEnD,QACE,MAAO,CAAC,EAEd,CAwByCq8C,CAAe9lB,EAAAA,YAAYhV,KAAUrgB,EAAMu1B,SAAS,CAAClV,EAAOrgB,EAAMu1B,SAEzG,OACEx2B,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,IACDg7B,KACAl7C,EACJugB,GAAI06B,EAAmBpb,EAAAA,oBAAiBjgC,EACxCK,MAAOA,EACPs2B,aAAcv3B,IAAWk8C,EAAW3kB,aAAcv2B,EAAMu2B,cACxDz3B,UAAWE,IAAWk8C,EAAWp8C,UAAWkB,EAAMlB,WAClDjB,KAAK,SACLwiB,MAAO66B,EAAW76B,OAASA,EAC3BqP,aACEuoB,GACEl5C,EAAAA,EAAAA,KAAC6jC,EAAAA,QAAO,CAACG,eAAgB/iC,EAAM0vB,cAAgBwrB,EAAWxrB,aAAapvB,UACrEvB,EAAAA,EAAAA,KAACwjC,EAAAA,QAAO,CAACp0B,MAAO,OAGlBnO,EAAM0vB,cAAgBwrB,EAAWxrB,aAEpCpvB,SAEAN,EAAMM,UAGb,C,eC2BO,SAASihB,EAAM3iB,GAKqB,IAL6C,SACtF0B,EAAQ,qBACR86C,EAAoB,sBACpBC,KACGr7C,GACoCpB,EACvC,MAAM+gC,GAAeC,EAAAA,EAAAA,iBAAgBwb,IAC/B,cAAElZ,IAAkBC,EAAAA,EAAAA,wBAAuBxC,GAMjD,OAJA99B,EAAAA,WAAgB,KACdw5C,KAAyBnZ,EAAc,GACtC,CAACmZ,EAAuBnZ,KAGzBnjC,EAAAA,EAAAA,KAACu8C,EAAe,IAAKt7C,EAAO2/B,aAAcA,EAAar/B,SACpDA,GAGP,CASO,SAASg7C,EAAel0B,GAwBqB,IAxB6C,KAE/F3iB,EAAI,MACJzG,EAAK,kBACLwjB,EAAiB,MACjB7b,EAAK,MACLgc,EAAQ,GAAE,SACVnF,EAAQ,eACRiF,EAAc,oBACd85B,EACA,aAAcvV,EAAS,MAEvB3lB,EAAK,cACLm7B,EAAa,YACb7B,EAAc,eAAc,aAE5Bha,EAAY,UACZje,EAAS,qBACT+5B,GAAuB,EAAI,qBAC3BC,GAAuB,EAAK,8BAC5B95B,GAAgC,EAAK,2BACrC+5B,GAA6B,EAAI,SACjCr7C,KACGN,GAC6ConB,EAChD,MAAM,cAAEirB,EAAa,aAAEqI,IAAiBJ,EAAAA,EAAAA,GAAU3a,EAAch6B,EAAOgc,GAAQE,GAASrF,IAAWqF,EAAMpd,KACnGm3C,EAAmBH,IAAwB1iC,EAAAA,EAAAA,MAC3C8iC,EAAiBH,GAAwBE,EAIzCE,GADoBC,EAAAA,EAAAA,MACwBC,EAAAA,EAA8BC,EAAAA,EAEhF,OACE77C,EAAAA,EAAAA,MAACoxC,EAAAA,MAAK,CACJrU,MAAOn/B,EACPk+C,eAAgBX,EAChB9J,aAAcjwB,EACd1iB,UAAWE,IAAWyiB,EAAgB,CAAE06B,SAAUN,IAAkBv7C,SAAA,EAEpEvB,EAAAA,EAAAA,KAACi8C,EAAY,IAAKh7C,EAAOC,MAAO0/B,EAActf,MAAOA,EAAOkV,OAAQv1B,EAAMu1B,QAAUoK,EAAamB,QAAQxgC,SACtGk7C,GAAiB75B,EAAM0wB,IAAiBr0C,OAAS27C,IAEnDkC,GACC98C,EAAAA,EAAAA,KAAC+8C,EACC,CAKAn6B,MAAOA,EACPnF,SAAUk+B,EACV/0C,MAAO0sC,EACPsH,YAAaA,GAJRtH,IAOPtzC,EAAAA,EAAAA,KAACq9C,EAAAA,EAAU,CACTn8C,MAAO0/B,EACP0S,cAAeA,EACfhyB,MAAiB,UAAVA,GAA+B,SAAVA,EAAmBA,OAAQzgB,EACvD+0C,uBAAwB/yB,EACxBgzB,oBAAqB+G,EACrBn/B,SAAUk+B,EACV,aAAY1U,KACRtkB,EAASphB,SAEZA,MAKX,CAEO,SAAS+7C,EAAiB/0B,GAwB9B,IAxBgG,MAEjGtpB,EAAK,eACLyjB,EAAc,kBACdD,EAAiB,oBACjB+5B,EAAmB,MAEnBl7B,EAAK,cACLm7B,EAAa,YACb7B,EAAc,kBACX35C,GAcJsnB,EACC,OACEvoB,EAAAA,EAAAA,KAACyyC,EAAAA,MAAK,CACJrU,MAAOn/B,EACPk+C,eAAgBX,EAChBz8C,UAAW2iB,EACXgwB,aAAcjwB,EAAkBlhB,UAEhCvB,EAAAA,EAAAA,KAACi8C,EAAY,IAAKh7C,EAAOi7C,kBAAkB,EAAO56B,MAAOA,EAAOkV,OAAQv1B,EAAMu1B,OAAOj1B,SAClFk7C,GAAiB7B,KAI1B,CAEO,MAAM73B,EAAeiwB,EAAAA,S,cC9OrB,SAASuK,EAAiB19C,GAMqB,IAN6C,SACjG0B,EAAQ,aACRi8C,EAAY,qBACZnB,EAAoB,qBACpBK,GAAuB,KACpBz7C,GAC+CpB,EAClD,MAAM+gC,GAAeC,EAAAA,EAAAA,iBAAgBwb,GAC/B/zC,GAAUnH,EAAAA,EAAAA,iBAAgB,CAAEC,UAAW,SAAUq8C,iBAAkB,MACnEC,EAAmB56C,EAAAA,QAAa,GAMtCA,EAAAA,WAAgB,KACd,MAAM2a,EAAWA,KAEgB,YAA7B/E,SAASilC,iBACTjlC,SAASklC,gBAAkBhd,EAAaqV,sBAAsBr4C,UAE9D8/C,EAAiB9/C,SAAU,EAC3B0K,EAAQ24B,OACV,EAKF,OAFAvoB,SAAS3U,iBAAiB,mBAAoB0Z,GAC9Cnb,OAAOyB,iBAAiB,OAAQ0Z,GACzB,KACL/E,SAASzU,oBAAoB,mBAAoBwZ,GACjDnb,OAAO2B,oBAAoB,OAAQwZ,EAAS,CAC7C,GAGA,CAACmjB,EAAaqV,sBAAuB3tC,EAAQ24B,OAGhDn+B,EAAAA,WAAgB,KACV89B,EAAamB,UACf2b,EAAiB9/C,SAAU,EAC3B0K,EAAQ24B,OACV,GACC,CAACL,EAAamB,QAASz5B,IAE1B,MAAMu1C,EAAgB/6C,EAAAA,QAAa,KAC5B46C,EAAiB9/C,SAAS0K,EAAQwrC,MAAM,IAIzCgK,EAAeh7C,EAAAA,QAAa,KAChC46C,EAAiB9/C,QAAUgjC,EAAamB,QACnC2b,EAAiB9/C,SAAS0K,EAAQ24B,MAAM,IAG/C,OACE5/B,EAAAA,EAAAA,MAAA,SAAOtB,UAAU,wBAAuBwB,SAAA,EACtCvB,EAAAA,EAAAA,KAACu8C,EAAe,IACVt7C,EACJ2/B,aAAcA,EACdmd,QAASF,EAAcjgD,QACvB4gB,OAAQs/B,EAAalgD,QACrB8+C,qBAAsBA,EAAqBn7C,SAE1CA,KAEuB,IAAzBm7C,IACCr7C,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACwB,EAAAA,eAAc,CACbo5B,UAAW,EACX15B,MAAOoH,EACP,aAAYk1C,EACZz9C,UAAU,wDACVi+C,kBAAgB,KAElBh+C,EAAAA,EAAAA,KAACyB,EAAAA,QAAO,CAACP,MAAOoH,EAAQ/G,UACtBvB,EAAAA,EAAAA,KAAC+gB,EAAAA,UAAS,CAAC9M,KAAK,QAAO1S,SAAEi8C,WAMrC,C,6FCtFO,SAASN,EAAYr9C,GAKI,IALmC,MACjE+iB,EAAK,SACLnF,EAAQ,YACRm9B,EAAc,kBACX35C,GACyBpB,EAC5B,MAAMo+C,GAAmC,IAAjBh9C,EAAM2F,MACxBs3C,EAA2Bp7C,EAAAA,aAC9B0T,IACC,MAAM2nC,EAAY3nC,EAAE4nC,OAAO9K,eAAiB2K,GAAmB,EAAI,GAC7DrC,EAAeh5B,EAAMu7B,GAE3B,IAAKvC,EAAan6B,OAASm6B,EAAaC,eAEtC,YADAp+B,EAAS0gC,GAIX,GAAiC,iBAAtBvC,EAAan6B,KAEtB,YADAnf,OAAO4U,SAASuK,KAAOm6B,EAAan6B,MAItC,MAAMq6B,EAAS,IAAIC,IAAIH,EAAan6B,KAAK+N,SAAWltB,OAAO4U,SAASuK,MACpEq6B,EAAO3kC,OAASykC,EAAan6B,KAAKtK,QAAU,GAC5C2kC,EAAOE,KAAOJ,EAAan6B,KAAKu6B,MAAQ,GAExC15C,OAAO4U,SAASuK,KAAOq6B,EAAOj2C,UAAU,GAE1C,CAAC+c,EAAOnF,EAAUwgC,IAGpB,OACE58C,EAAAA,EAAAA,MAAA,aACMJ,EACJ25B,UAAW,EACX76B,UAAU,0EACV0d,SAAUygC,EAAyB38C,SAAA,CAElC08C,IAAmBj+C,EAAAA,EAAAA,KAAA,UAAQq+C,QAAM,EAAA98C,SAAEq5C,IACnCh4B,EAAMpL,KAAI,CAACsL,EAAMrO,KAChBzU,EAAAA,EAAAA,KAAA,UAAgB4G,MAAO6N,EAAElT,SACtBuhB,EAAK7jB,OADKwV,OAMrB,CAEO,SAASwoC,EAAkEh8C,GAChF,MAAMq9C,GAAWC,EAAAA,EAAAA,MAEXC,EAAuB17C,EAAAA,aAC1Bq7C,IACC,MAAMvC,EAAe36C,EAAM2hB,MAAMu7B,GACjCl9C,EAAMwc,SAAS0gC,GAEXvC,EAAan6B,MAAM68B,EAAS1C,EAAan6B,KAAK,GAIpD,CAAC68B,EAAUr9C,EAAMwc,SAAUxc,EAAM2hB,QAGnC,OAAO5iB,EAAAA,EAAAA,KAACk9C,EAAY,IAAKj8C,EAAOwc,SAAU+gC,GAC5C,C,oHCxDO,SAASnB,EAAUx9C,GAMmB,IANlB,cACzByzC,EAAa,SACb71B,EACA,aAAcwpB,EAAS,SACvB1lC,KACGN,GACsCpB,EACzC,MAAMw6C,GAAYtH,EAAAA,EAAAA,cAAa,CAAEuE,UAAW,OAE5C,OACEt3C,EAAAA,EAAAA,KAAC+gC,EAAAA,QAAO,IAAK9/B,EAAO,aAAYgmC,EAAWlnC,UAAWE,IAAWgB,GAAOlB,UAAW,mBAAmBwB,UACpGvB,EAAAA,EAAAA,KAACqzC,EAAAA,KAAI,CACHnyC,MAAOm5C,EACP/G,cAAeA,EACfvzC,UAAU,WACV0d,SAAUA,EACV,aAAYwpB,EAAU1lC,SAErBA,KAIT,C,gGCjBO,SAASiiC,EAAO3jC,GAAoE,IAAnE,cAAE4+C,GAAgB,EAAK,SAAEC,EAAW,EAAC,MAAEtvC,EAAQ,IAAkBvP,EACvF,MAAM8+C,EAAU,EAAIvvC,EAAS,EACvBwvC,EAAcD,EAAS,EACvBE,EAAWF,EAASC,EAAc,EAClCE,EAAyB,EAATH,EAAa3uC,KAAK+uC,GAExC,OACE19C,EAAAA,EAAAA,MAAA,OACEtB,UAAWE,IAAW,iBAAkB,CAAE,gBAAiBw+C,IAC3DrvC,MAAOA,EACPhB,OAAQgB,EACRk7B,QAAU,OAAMl7B,KAASA,IACzBuiC,MAAM,6BAA4BpwC,SAAA,EAElCvB,EAAAA,EAAAA,KAAA,UACED,UAAU,2EACVqZ,MAAO,CAAEwlC,YAAc,GAAEA,OACzBrT,GAAIsT,EACJrT,GAAIqT,EACJlzB,EAAGgzB,KAEL3+C,EAAAA,EAAAA,KAAA,UACED,UAAU,4EACVqZ,MAAO,CACL4lC,gBAAkB,GAAEF,KAAiBA,IACrCG,iBAAmB,IAAEH,GAAkBL,EAAgBC,EAAW,IAAM,IAAOI,GAC/EF,YAAc,GAAEA,MAChBM,cAAe,SAEjB3T,GAAIsT,EACJrT,GAAIqT,EACJlzB,EAAGgzB,MAIX,C,g5BChCA,MAAMQ,EAAoB,QAEnB,SAASC,EAAev/C,GAOV,IAPkD,KACrEoU,EAAI,WACJykC,EAAU,gBACV2G,EAAe,kBACfC,EAAiB,kBACjBC,EAAiB,SACjBtqB,GACiBp1B,EACjB,MAAM2/C,EAAiB18C,EAAAA,SAAc,IAAMu8C,EAAgBnkC,SAAQmN,IAAA,IAAC,WAAEo3B,GAAYp3B,EAAA,OAAKo3B,CAAU,KAAG,CAACJ,IAE/FlW,EAAcrmC,EAAAA,SAClB,KAAM,CACJmR,OACAghB,WACAl1B,UAAW,GACX4wB,kBAAc9vB,EACd02B,WAAY,SACZjW,MAAO,UAET,CAACrN,EAAMghB,IAGHyqB,EAA6B58C,EAAAA,SAAc,KAAM,CAAGmyB,cAAa,CAACA,IAExE,OACEj1B,EAAAA,EAAAA,KAACu9C,EAAAA,kBAAiB,IACZpU,EACJ,aAAYgW,EACZ1hC,SAAU8hC,EACV34C,MAAO04C,QAAqBz+C,EAC5B+hB,MAAO48B,EACP,cAAc,SAAQ9G,+BACtB+D,eAAez8C,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,aAC1B83C,aAAc2B,EACd3oB,SAAU8oB,EACVz8B,+BAA6B,EAC7B65B,sBAAsB,EACtBE,4BAA4B,EAC5Bj6B,UAAW+8B,EAA2Bn+C,SAErC89C,EAAgBnkC,SAAQ,CAAAqN,EAAwBO,KAAK,IAA5B,MAAE7pB,EAAK,WAAEwgD,GAAYl3B,EAAA,MAAY,EACzDvoB,EAAAA,EAAAA,KAACgqC,EAAAA,kBAAiB,CAAAzoC,SAA4BtC,GAArB,GAAEA,KAAS6pB,QACjC22B,EAAWjoC,KAAIwqB,IAAwC,IAAvC,KAAEvgB,EAAI,MAAE7a,EAAK,MAAE3H,EAAK,WAAE0gD,GAAY3d,EAC/C4d,EAAY,CAAC,EAQjB,OAPIn+B,IACFm+B,EAAY,CACVp+B,GAAIq+B,EAAAA,KACJj5B,GAAInF,EACJo6B,eAAgB8D,IAAe7+C,eAAevB,kBAIhDugD,EAAAA,EAAAA,eAAC/8B,EAAAA,aAAY,IACP68B,EACJvuC,IAAKzK,EACL,cAAc,SAAQ8xC,gBAAyB9xC,IAC/C7G,UAAU,WACVk1B,SAAUA,GAETh2B,EACY,IAGpB,KAGP,C,0BCnFO,SAAS8gD,EAAuBlgD,GAA8B,IAA7B,MAAEZ,EAAK,UAAEi6C,GAAkBr5C,EACjE,OACEwB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAA,QAAMD,UAAWE,IAAW,CAAEiyB,UAAWgnB,IAAa33C,SAAEtC,IACvDi6C,IACCl5C,EAAAA,EAAAA,KAAA,OAAKD,UAAU,0EAAyEwB,UACtFvB,EAAAA,EAAAA,KAAC6jC,EAAAA,QAAO,CAACG,gBAAgBhkC,EAAAA,EAAAA,KAAA,QAAAuB,SAAOtC,IAAcsC,UAC5CvB,EAAAA,EAAAA,KAACwjC,EAAAA,QAAO,CAACp0B,MAAO,WAM5B,CCUA,MAAM4wC,EAAoB,WAEnB,SAASC,EAAepgD,GAcV,IAdkD,KACrEoU,EAAI,WACJykC,EAAU,gBACVwH,EAAe,kBACfC,EAAiB,mBACjBC,EAAkB,UAClBlH,GAAY,EAAK,cACjBmH,EAAa,cACbC,EAAa,kBACbC,EAAiB,0BACjBC,EAAyB,SACzBvrB,EAAQ,mBACRwrB,EAAkB,MAClBn/B,EAAQ,QACSzhB,EACjB,MAAM6gD,EAAiB59C,EAAAA,SAAc,IAAMo9C,EAAgBhlC,SAAQmN,IAAA,IAAC,WAAEs4B,GAAYt4B,EAAA,OAAKs4B,CAAU,KAAG,CAACT,IAE/F/W,EAAcrmC,EAAAA,SAClB,KAAM,CACJmR,OACAghB,WACAtE,kBAAc9vB,EACdd,UAAW,GACXuhB,MAAOA,EACPiW,WAAa8oB,OAA2Bx/C,EAAX,YAE/B,CAACoT,EAAMosC,EAAeprB,EAAU3T,IAG5Bo+B,EAA6B58C,EAAAA,SAAc,KAAM,CAAGmyB,cAAa,CAACA,IAElE2rB,EAA4B99C,EAAAA,aAAkB,KAClD,GAAIu9C,EAAe,CACjB,MAAMQ,EAAwBH,EAAeh5C,MAAK6gB,IAAA,IAAC,MAAE3hB,GAAO2hB,EAAA,OAAK3hB,IAAUu5C,CAAiB,IAC5F,OAAOU,GAAuBC,YAAcD,GAAuB5hD,KACrE,CACA,MAAO,EAAE,GACR,CAACyhD,EAAgBL,EAAeF,IAEnC,OACEL,EAAAA,EAAAA,eAACvC,EAAAA,kBAAiB,IACZpU,EACJ93B,IAAKqnC,EACL,aAAYsH,EACZviC,SAAU8iC,EACV35C,MAAOu5C,EACPv9B,MAAO89B,EACPlqB,UAAQ6pB,GAAkBC,SAAuBz/C,EACjD28C,aAAcwC,EACdvoB,aACEz3B,EAAAA,EAAAA,KAAA,OAAKD,UAAU,mBAAkBwB,UAC/BvB,EAAAA,EAAAA,KAAC+/C,EAAuB,CAAC9gD,OAAOe,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CAACprB,KAAK,aAAewzC,UAAWA,GAAamH,MAGtF5D,cAAemE,IACf,cAAc,SAAQlI,sBACtB71B,+BAA6B,EAC7B65B,sBAAsB,EACtBE,4BAA4B,EAC5Bj6B,UAAW+8B,GAEVQ,EAAgBhlC,SAAQ,CAAA8mB,EAAiB+e,KAAU,IAA1B,WAAEJ,GAAY3e,EAAA,MAAiB,EACvDhiC,EAAAA,EAAAA,KAACgqC,EAAAA,kBAAiB,GAAO,aAAY+W,KAAcX,EAAmBx/C,aACnE+/C,EAAWnpC,KAAKsL,IACjB,MAAMk+B,EAAqBZ,EAAmBlgD,SAAS4iB,EAAKlc,OAC5D,IAAIg5C,EAAY,CAAC,EAQjB,OAPI98B,EAAKrB,OACPm+B,EAAY,CACVp+B,GAAIq+B,EAAAA,KACJj5B,GAAI9D,EAAKrB,KACTo6B,iBAAkB/4B,EAAK68B,cAIzBG,EAAAA,EAAAA,eAAC/8B,EAAAA,aAAY,IACP68B,EACJvuC,IAAM,GAAEyR,EAAKlc,QAAQw5C,EAAmBx/C,SACxC,cAAc,SAAQ83C,sBAA+B51B,EAAKlc,QAC1DquB,SAAUA,EACVtE,aACE8vB,GACEp/C,EAAAA,EAAAA,MAAC8f,EAAAA,OAAM,CACLK,GAAG,MACHF,MAAM,cACNiW,WAAW,SACX,cAAc,SAAQmhB,sBAA+B51B,EAAKlc,wBAC1D8zB,YAAcxd,IACZA,EAAGy9B,kBACHz9B,EAAG4C,iBACH0gC,EAA0B19B,EAAK,EAEjC/iB,UAAWwe,IAAW,cAAe,CACnC,iBAAkByiC,EAClB,kBAAmBA,IAClBz/C,SAAA,EAEHvB,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CACHprB,KAAK,OACL3F,UAAWwe,IAAW,CACpB,qBAAsByiC,EACtB,4BAA6BA,OAGjChhD,EAAAA,EAAAA,KAAC8wB,EAAAA,KAAI,CACHprB,KAAK,eACL3F,UAAWwe,IAAW,CACpB,sBAAuByiC,EACvB,2BAA4BA,cAIhCngD,GAGLiiB,EAAK7jB,MACO,IAGpB,IAGP,CCzHA,SAASgiD,EAAyBphD,GAAuE,IAAtE,UAAEqpB,EAAS,WAAEwvB,GAAuD74C,EACrG,MAAQ,GAAE64C,KAAcxvB,GAC1B,CAEA,SAASg4B,EAAiBjtC,GACxB,OAAQA,GACN,KAAKiiB,EAAAA,WAAAA,MACL,KAAKA,EAAAA,WAAAA,QACH,MAAO,QACT,KAAKA,EAAAA,WAAAA,OACH,MAAO,UACT,KAAKA,EAAAA,WAAAA,MACH,MAAO,SACT,KAAKA,EAAAA,WAAAA,KACH,MAAO,OAEb,CAEO,SAASirB,EAAY94B,GAuBI,IAvB2E,UACzGrhB,EAAYlG,eAAevB,eAAc,WACzCm5C,EAAa,EAAC,2BACd0I,EAA6B,IAAG,gBAChClB,EAAe,gBACfb,EAAe,kBACfc,EAAiB,kBACjBb,EAAiB,mBACjBc,EAAkB,iBAClBiB,EAAgB,kBAChBd,EAAiB,kBACjBhB,EAAiB,0BACjBiB,EAAyB,KACzBvsC,EAAI,SACJghB,EAAW,UAAS,qBACpBqsB,GAAuB,EAAI,iBAC3BC,EAAgB,UAChBxhD,EAAS,mBACT0gD,GAAqB,EAAI,wBACzBe,GAA0B,EAAI,yBAC9BC,EAAwB,cACxBnB,GAAgB,EAAK,MACrBh/B,GAC4B+G,EAC5B,MAAOq5B,EAAsBC,GAA2B7+C,EAAAA,SAAsC,OACvF8+C,EAAgCC,GAAqC/+C,EAAAA,SAAe,CACzFg/C,cAAc,EACdC,eAAe,KAEX,cAAElc,EAAa,aAAEmc,IAAiBlc,EAAAA,EAAAA,GAAkByb,GACpDb,EAAiB59C,EAAAA,SAAc,IAAMo9C,EAAgBhlC,SAAQqN,IAAA,IAAC,WAAEo4B,GAAYp4B,EAAA,OAAKo4B,CAAU,KAAG,CAACT,IAE/F+B,EAA4Bn/C,EAAAA,SAChC,IACE29C,EACIC,EAAe1+C,QAAOggC,IAAA,IAAC,MAAEp7B,GAAOo7B,EAAA,OAAKp7B,IAAUu5C,GAAqBC,EAAmBlgD,SAAS0G,EAAM,IACtG85C,GACN,CAACA,EAAgBP,EAAmBC,EAAoBK,IAGpDJ,EACJC,GAAiB0B,EAAeZ,GAA8Ba,EAA0BrhD,QAAU,EAC9FshD,EAAsCp/C,EAAAA,aAAkB,KAC5D,GAAI4+C,EAAsB,CACxB,MAAMI,EAAmD,IAApCJ,EAAqBS,WACpCJ,EACJ/xC,KAAKoyC,KAAKV,EAAqBW,YAAcX,EAAqBS,aAClET,EAAqBY,YAGrBV,EAA+BE,eAAiBA,GAChDF,EAA+BG,gBAAkBA,GAEjDF,EAAkC,CAAEC,eAAcC,iBAEtD,IACC,CAACH,EAAgCF,IAqBpC,OAnBA5+C,EAAAA,WAAgB,KACdo/C,GAAqC,GACpC,CAACA,EAAqCR,EAAsBM,IAE/Dl/C,EAAAA,WAAgB,KACd,IAAKu9C,GAAiBmB,EAAyB,CAC7C,MAAMe,EAAmB7pC,SAASC,eAChCsoC,EAA0B,CAAEvI,aAAYxvB,UAAWi3B,KAGrD,GAAIoC,GAAoBb,EAAsB,CAC5C,MAAM13B,EACJu4B,EAAiBpO,WAAaoO,EAAiB//C,YAAc,EAAIk/C,EAAqBl/C,YAAc,EAEtGk/C,EAAqBc,SAASxyC,KAAKuI,IAAI,EAAGvI,KAAK9I,IAAI8iB,EAAY03B,EAAqBY,cAAe,EACrG,CACF,IACC,CAACjC,EAAe3H,EAAYyH,EAAmB6B,EAAcR,EAAyBE,KAGvFrgD,EAAAA,EAAAA,MAAA,OACEtB,UAAWE,IACT,oFACA,CACE,aAAcF,GAEhBA,GAEFmE,IAAK2hC,EAActkC,SAAA,EAEjBkgD,GAA4BhB,KAC5BzgD,EAAAA,EAAAA,KAAA,OAAKD,UAAWE,IAAW,CAAE,aAAcqgD,EAAe,YAAaA,IAAiB/+C,UACtFvB,EAAAA,EAAAA,KAACigD,EAAe,CACd3+B,MAAOA,EACPo3B,WAAYA,EACZzkC,KAAMA,EACNghB,SAAUA,EACVkrB,kBAAmBA,EACnBD,gBAAiBA,EACjBE,mBAAoBA,EACpBC,cAAeA,EACfC,cAAeA,EACfpH,YAAamI,GAAoBhB,EACjCG,0BAA2BA,EAC3BD,kBAAmBA,EACnBE,mBAAoBA,OAIxBJ,IACAh/C,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,kDAAiDwB,SAAA,EAC9DvB,EAAAA,EAAAA,KAAA,OACED,UAAWE,IACT,8IACA,CAAE,YAAa2hD,EAA+BE,kBAGlD9hD,EAAAA,EAAAA,KAAA,OACEkE,IAAKy9C,EACL5hD,UAAU,6EACV0iD,SAAUP,EACVQ,QAAUnlC,IAMR,MAAMolC,EAAQ3yC,KAAKosB,IAAI7e,EAAMpN,QACfH,KAAKosB,IAAI7e,EAAMjN,QACjBqyC,IACVplC,EAAM7G,cAAcyrC,YAAc5kC,EAAMjN,OAC1C,EACA/O,SAED0gD,EAA0BzqC,KAAK0R,IAC9B,IAAI02B,EAAY,CAAC,EAgBjB,OAdEA,EADE12B,EAAUzH,KACA,CACVD,GAAIq+B,EAAAA,KACJj5B,GAAIsC,EAAUzH,KACdo6B,eAAgB3yB,EAAUy2B,aAAe34C,EACzCoa,QAASA,IAAMm/B,EAAkBr3B,IAGvB,CACV9H,QAAUlE,IACRA,EAAG4C,iBACHygC,EAAkBr3B,EAAU,IAKhC42B,EAAAA,EAAAA,eAAC3+B,EAAAA,OAAM,IACDy+B,EACJvuC,IAAK6X,EAAUtiB,MACfuB,GAAI84C,EAA0B,CAAEvI,aAAYxvB,UAAWA,EAAUtiB,QACjE7G,UAAU,8BACV,cAAc,SAAQ24C,wBAAiCxvB,EAAUtiB,QACjE0a,MAAM,kBACNrN,KAAMA,EACNxG,QAASyzC,EAAiBhrB,EAAAA,WAAWjiB,GAAQ,YAC7CuiB,OAAQtN,EAAUtiB,QAAUu5C,EAC5BlrB,SAAUA,IAEVj1B,EAAAA,EAAAA,KAAC+/C,EAAuB,CACtB9gD,MAAOiqB,EAAU43B,WACjB5H,UAAWmI,IAAqBn4B,EAAUtiB,QAErC,OAIf5G,EAAAA,EAAAA,KAAA,OACED,UAAWE,IACT,+IACA,CAAE,YAAa2hD,EAA+BG,qBAKrDT,IACCthD,EAAAA,EAAAA,KAAA,OAAKD,UAAU,YAAWwB,UACxBvB,EAAAA,EAAAA,KAACo/C,EAAe,CACd1G,WAAYA,EACZzkC,KAAMA,EACNorC,gBAAiBA,EACjBC,kBAAmBA,EACnBC,kBAAmBA,EACnBtqB,SAAUA,QAMtB,C,8JCvNO,MAAM2tB,EAA0B,WAAyC,IAAxC57C,IAASrG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC/C,MAAMkiD,EAAuC,CAC3C,CACE5jD,MAAO,GACP0hD,WAAY,CACV,CAAE/5C,MAAOk8C,EAAAA,EAAAA,GAAc7jD,MAAO,WAAY6hD,WAAY,MACtD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,GAAc7jD,MAAO,YAAa6hD,WAAY,MACvD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,GAAc7jD,MAAO,YAAa6hD,WAAY,MACvD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,GAAc7jD,MAAO,YAAa6hD,WAAY,MACvD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,IAAe7jD,MAAO,aAAc6hD,WAAY,OACzD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,IAAe7jD,MAAO,aAAc6hD,WAAY,OACzD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,IAAe7jD,MAAO,aAAc6hD,WAAY,SAG7D,CACE7hD,MAAO,GACP0hD,WAAY,CACV,CAAE/5C,MAAOk8C,EAAAA,EAAAA,EAAa7jD,MAAO,SAAU6hD,WAAY,KAAMiC,eAAgB,UACzE,CAAEn8C,MAAOk8C,EAAAA,EAAAA,GAAc7jD,MAAO,UAAW6hD,WAAY,MACrD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,GAAc7jD,MAAO,UAAW6hD,WAAY,QAGzD,CACE7hD,MAAO,GACP0hD,WAAY,CACV,CAAE/5C,MAAOk8C,EAAAA,EAAAA,EAAa7jD,MAAO,QAAS6hD,WAAY,IAAKiC,eAAgB,SACvE,CAAEn8C,MAAOk8C,EAAAA,EAAAA,EAAa7jD,MAAO,SAAU6hD,WAAY,IAAKiC,eAAgB,UACxE,CAAEn8C,MAAOk8C,EAAAA,EAAAA,EAAa7jD,MAAO,UAAW6hD,WAAY,IAAKiC,eAAgB,cAKzEC,EAAiB,CACrB,CAEE/jD,MAAO,GACP0hD,WAAY,CAAC,CAAE/5C,MAAO,WAAqB3H,MAAO,WAAY6hD,WAAY,cAE5E,CACE7hD,MAAO,GACP0hD,WAAY,CACV,CAAE/5C,MAAOk8C,EAAAA,EAAAA,EAAa7jD,MAAO,QAAS6hD,WAAY,SAClD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,EAAa7jD,MAAO,SAAU6hD,WAAY,UACnD,CAAEl6C,MAAOk8C,EAAAA,EAAAA,EAAa7jD,MAAO,UAAW6hD,WAAY,cAK1D,OAAO95C,EAAY67C,EAAoBG,CACzC,EAEO,SAASC,EAAmBj8C,GACjC,OAAO47C,EAAwB57C,EACjC,CAEO,MAAMk8C,EAA0BrjD,IAMlB,IANmB,UACtCmH,EAAS,WACTijB,GAIDpqB,EACC,MAAMsjD,EAAUl5B,IAAekC,EAAAA,EAAAA,MA6B/B,MA5ByE,CACvE,CACEltB,MAAO,OACPwgD,WAAY,CACV,CAAE74C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,QAASiqB,UAAWi6B,EAAUL,EAAAA,EAAAA,GAAeA,EAAAA,EAAAA,IAC/E,CAAEl8C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,SAAUiqB,UAAWi6B,EAAUL,EAAAA,EAAAA,GAAeA,EAAAA,EAAAA,OAGpF,CACE7jD,MAAO,SACPwgD,WAAY,CACV,CAAE74C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,UAAWiqB,UAAW45B,EAAAA,EAAAA,GACxD,CAAEl8C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,WAAYiqB,UAAW45B,EAAAA,EAAAA,GACzD,CAAEl8C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,WAAYiqB,UAAW45B,EAAAA,EAAAA,KAG7D,CACE7jD,MAAO,QACPwgD,WAAY,CACV,CAAE74C,MAAOw8C,EAAAA,EAAAA,IAAmBnkD,MAAO,eAAgBiqB,UAAW45B,EAAAA,EAAAA,GAC9D,CAAEl8C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,SAAUiqB,UAAW45B,EAAAA,EAAAA,GACvD,CAAEl8C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,UAAWiqB,UAAW45B,EAAAA,EAAAA,GACxD,CAAEl8C,MAAOw8C,EAAAA,EAAAA,GAAkBnkD,MAAO,UAAWiqB,UAAWliB,EAAY87C,EAAAA,EAAAA,EAAcA,EAAAA,EAAAA,GAClF,CAAEl8C,MAAOw8C,EAAAA,EAAAA,IAAmBnkD,MAAO,MAAOiqB,UAAW45B,EAAAA,EAAAA,KAKzC,EAGb,SAASO,EAAkBh7B,GAU/B,IAVgC,UACjCrhB,EAAS,YACTs8C,EAAW,kBACXC,GAAoB,EAAI,WACxBt5B,GAMD5B,EACC,MAAMm7B,EAAcN,EAAwB,CAAEl8C,YAAWijB,eAEzD,GAAIjjB,IAAmC,IAAtBu8C,EAA6B,CAC5C,MAAOE,GAAmBH,GAAannC,MAAMunC,IAA+B,GAC5EF,EAAY/wC,KAAK,CACfgtC,WAAY,CACV,CACE74C,MACE08C,GAAe36C,OAAOC,OAAe+6C,GAA2BzjD,SAASujD,GACrEH,EACAM,EACN3kD,MAAO,YAIf,CAEA,OAAOukD,CACT,CAEO,SAASK,EAA0Bt7B,GAcvC,IAdwC,UACzCvhB,EAAS,YACTs8C,EAAW,aACXQ,EAAY,WACZnE,EAAU,kBACV4D,EAAiB,WACjBt5B,GAQD1B,EACC,OAAO86B,EAAmB,CACxBr8C,YACAu8C,oBACAD,cACAr5B,eACCzS,KAAKusC,IAA2B,CACjC9kD,MAAO8kD,EAAe9kD,MACtBwgD,WAAYsE,EAAetE,WAAWjoC,KAAK4T,IAAS,IAC/CA,EACH3J,MACGza,GAAa2B,OAAOC,OAAOw6C,EAAAA,GAAeljD,SAASkrB,EAAUxkB,OAC1Dk9C,EAAa14B,QACbvqB,EACN8+C,WAAYA,IAAe34C,SAGjC,CAEA,MAAMg9C,EAAqB,CAAC,IAAK,IAAK,KAE/B,SAASC,EAAiCjiB,GAgB9C,IAhB+C,UAChDh7B,EAAS,SACTwoB,EAAQ,UACRtG,EAAS,UACTkC,EAAS,YACT84B,EAAW,eACXlB,EAAiBgB,EAAkB,kBACnCG,EAAoB,KASrBniB,EACC,OAAIh7B,GAAag8C,EAAe9iD,SAASgpB,GAChC,CACLsG,WACArY,OAAS,KAAGsF,EAAAA,EAAAA,GAAkB,KACzBT,EAAAA,EAAAA,KACHvH,OAAG5T,EACHgjB,EAAGqF,EACH,CAACi7B,GAAoB/4B,QAAavqB,OAKjC,CACL2uB,SAAU,cACVrY,OAAS,KAAGsF,EAAAA,EAAAA,GAAkB,CAC5B2nC,WAAY,SACZC,WAAY,SACZC,aAAcJ,GAAe5hD,OAAO4U,SAASsY,aAGnD,CAEO,MAAM+0B,EAAoE,CAC/E,CAACv7B,EAAAA,GAAAA,WAAuC,kBACxC,CAACA,EAAAA,GAAAA,aAAyC,oBAC1C,CAACA,EAAAA,GAAAA,WAAuC,kBACxC,CAACA,EAAAA,GAAAA,YAAwC,oBAG9Bw7B,EAAoE,CAC/E,CAACx7B,EAAAA,GAAAA,aAAyC,8BAC1C,CAACA,EAAAA,GAAAA,WAAuC,4BACxC,CAACA,EAAAA,GAAAA,YAAwC,8BCpOpC,IAAK26B,EAAyB,SAAzBA,GAAyB,OAAzBA,EAAyB,cAAzBA,EAAyB,YAAzBA,CAAyB,MAK9B,MAAMC,EAAoB,SACpBF,EAA6B,IAInC,SAASe,EAAmBr5B,GACjC,OAAOA,GAAWjP,MAAMunC,IAA+B,EACzD,CAEO,SAASgB,EAA4B7kD,GAAqE,IAApE,UAAEurB,EAAS,WAAEu5B,GAAqD9kD,EAC7G,MAAO4jD,EAAiBmB,GAAkBH,EAAmBr5B,GAE7D,GAAIq4B,IAAoBE,EAA0BkB,MAAO,CACvD,MAAOC,EAAgBC,GAAgBH,EAAexpC,QAAQ,KAAM,KAAKe,MAXzC,KAY1B6oC,EAAWF,EAAiB,IAAIxgD,KAAKwgD,GAAkB,KACvDG,EAASF,EAAe,IAAIzgD,KAAKygD,GAAgB,KACvD,MAAO,CACLG,MAAOF,IAAaxxC,OAAO0K,MAAM8mC,EAASj/C,WAAai/C,EAAW,KAClEG,IAAKF,IAAWzxC,OAAO0K,MAAM+mC,EAAOl/C,WAAagB,EAAAA,EAAiBk+C,GAAU,KAEhF,CAEA,GAAIxB,IAAoBE,EAA0ByB,KAAM,CACtD,MAAOC,EAAOC,EAAQC,GAAQX,EAAezoC,MApBb,KAoBgD3E,IAAIhE,QAEpF,MAAI,CAAC6xC,EAAOC,EAAQC,GAAM/wC,KAAKhB,OAAO0K,OAC7B,CAAEgnC,MAAO,KAAMC,IAAK,MAGtB,CACLD,MAAOn+C,EAAAA,EAAmBA,EAAAA,EAAY49C,EAAY,CAAEU,QAAOC,SAAQC,KAAMA,EAAO,KAChFJ,IAAKR,EAET,CAEA,MAAO,CAAEO,MAAO,KAAMC,IAAKR,EAC7B,CASO,SAASa,EAAkCn9B,GAA2D,IAA1D,MAAE68B,EAAK,IAAEC,GAA+C98B,EACzG,MAAMo9B,EAAcP,GAAQp1B,EAAAA,EAAAA,IAAqBo1B,GAAS,GACpDQ,EAAYP,GAAMr1B,EAAAA,EAAAA,IAAqBq1B,GAAO,GAUpD,MARoB,CAClBxB,EAA0BkB,MAC1BnB,EACA+B,EAlDgC,IAoDhCC,GAGiBvqC,KAAK,IAAIC,QAAQ,MAAO,IAC7C,CAEO,SAASuqC,EAA8Bp9B,GAQ3C,IAR4C,MAC7C88B,EAAK,OACLC,EAAM,KACNC,GAKDh9B,EAWC,MAVoB,CAClBo7B,EAA0ByB,KAC1B1B,EACA2B,EArEgC,IAuEhCC,EAvEgC,IAyEhCC,GAGiBpqC,KAAK,GAC1B,CAEO,SAASyqC,GAA4B5jB,GAQzC,IAR0C,UAC3C5W,EAAS,UACTpkB,GAAY,EAAI,WAChBijB,GAKD+X,EAEC,OADmBkhB,EAAwB,CAAEl8C,YAAWijB,eAAc/O,SAAQ+mB,IAAA,IAAC,WAAEwd,GAAYxd,EAAA,OAAKwd,CAAU,IAC1F/3C,MAAKm+C,IAAA,IAAC,MAAEj/C,GAAOi/C,EAAA,OAAKj/C,IAAUwkB,CAAS,KAAGlC,WAAa,IAC3E,CAEO,SAAS48B,GAAyBC,GAUtC,IAVuC,UACxC36B,EAAS,WACTu5B,EAAU,WACV16B,EAAU,UACVjjB,GAMD++C,EACC,MAAMC,EAAqBJ,GAA6B,CAAEx6B,YAAWnB,eACrE,GAAI+7B,EACF,OAAOA,EAET,MAAM,MAAEd,EAAK,IAAEC,GAAQT,EAA6B,CAAEt5B,YAAWu5B,eAC3DsB,EAAcf,GAAS,IAAI5gD,KAAK,GAChC4hD,EAAgCn/C,EAAAA,EAAiC49C,EAAYsB,GAAe,EAC5FE,EAAiBp/C,EAAAA,EAAiCo+C,GAAOR,EAAYsB,GAAe,EAK1F,GAAIE,EAAiB,KACnB,OAAOrD,EAAAA,EAAAA,EAGT,GAAIqD,EAAiB,KACnB,OAAOn/C,EAAY87C,EAAAA,EAAAA,EAAcA,EAAAA,EAAAA,EAGnC,GAAIqD,EAAiB,MACnB,OAAOrD,EAAAA,EAAAA,EAIT,GAAI74B,IAAekC,EAAAA,EAAAA,MAAkB,CACnC,GAAIg6B,GAAkB,GAAKD,GAAiC,GAC1D,OAAOpD,EAAAA,EAAAA,GAGT,GAAIqD,GAAkB,GAAKD,GAAiC,GAC1D,OAAOpD,EAAAA,EAAAA,GAGT,GAAIqD,GAAkB,GAAKD,GAAiC,IAC1D,OAAOpD,EAAAA,EAAAA,GAEX,KAAO,CACL,GAAIoD,GAAiC,EACnC,OAAOpD,EAAAA,EAAAA,GAET,GAAIoD,GAAiC,EACnC,OAAOpD,EAAAA,EAAAA,GAEX,CAEA,OAAOA,EAAAA,EAAAA,CACT,CCvJA,MACMsD,GAAuB,IAAI9hD,KAAM,cACjC+hD,IAAkB,IAAI/hD,MAAOiC,cAFX,KAIlB+/C,GAA0B,CAAExnD,KAAM,SAAUiB,UAAW,SAAUy3B,aAAc,eAE9E,IAAK+uB,GAAe,SAAfA,GAAe,OAAfA,EAAAA,EAAe,uBAAfA,EAAAA,EAAe,mBAAfA,CAAe,MA+B3B,MAAMC,GAAoC,CACxCC,KAAMF,GAAgBG,OACtBnB,KAAM,EACND,OAAQ,EACRD,MAAO,GAGHsB,GAAyC,CAC7CF,KAAMF,GAAgBK,SACtB1B,MAAO,KACPC,IAAK,MAiDA,SAAS0B,GAAe7kB,GAMR,IANS,YAC9B8kB,EAAW,UACX17B,EAAS,WACTu5B,EAAU,eACVoC,EAAc,WACdC,GACmBhlB,EACnB,MAAOilB,EAAaC,GAAkBpkD,EAAAA,SA7CxC,SAA+BsoB,GAC7B,GAAIA,EAAW,CACb,MAAOq4B,GAAmBgB,EAAmBr5B,GAC7C,GAAIq4B,IAAoBE,EAA0BkB,MAChD,OAAO0B,GAAgBK,SAEzB,GAAInD,IAAoBE,EAA0ByB,KAChD,OAAOmB,GAAgBG,MAE3B,CACA,OAAOH,GAAgBK,QACzB,CAkCuDO,CAAsB/7B,KAEpElqB,EAAO6B,GAAYD,EAAAA,SAlC5B,SAA+BylB,GAMP,IANQ,UAC9B6C,EAAS,WACTu5B,GAIDp8B,EACC,GAAI6C,EAAW,CACb,MAAOq4B,GAAmBgB,EAAmBr5B,IACvC,MAAE85B,EAAK,IAAEC,GAAQT,EAA6B,CAAEt5B,YAAWu5B,eACjE,GAAIlB,IAAoBE,EAA0BkB,MAChD,MAAO,CAAE4B,KAAMF,GAAgBK,SAAU1B,QAAOC,OAElD,GAAI1B,IAAoBE,EAA0ByB,MAAQF,GAASC,EAAK,CACtE,MAAM,MAAEE,EAAK,OAAEC,EAAM,KAAEC,GAASx+C,EAAAA,EAA2B,CACzDm+C,MAAOn+C,EAAAA,EAAYm+C,EAAO,CAAEK,KAAM,IAClCJ,QAEF,MAAO,CAAEsB,KAAMF,GAAgBG,OAAQrB,QAAOC,SAAQC,OACxD,CACF,CAEA,OAAOoB,EACT,CAWgES,CAAuB,CAAEh8B,YAAWu5B,iBAE1F/mD,QAAS6f,GAAa3a,EAAAA,QAAa,CAAC2jD,EAAuBY,KACjEtkD,GAAUukD,IACR,GAAIb,IAASF,GAAgBG,OAAQ,CAEnC,MAAO,IADUY,GAAWb,OAASF,GAAgBG,OAASY,EAAYd,MACjDa,EAC3B,CACA,GAAIZ,IAASF,GAAgBK,SAAU,CACrC,MAEMW,EAAW,IAFAD,GAAWb,OAASF,GAAgBK,SAAWU,EAAYX,MAEzCU,GACnC,GAAIE,EAASrC,OAASqC,EAASpC,KAAOoC,EAASrC,MAAMn/C,UAAYwhD,EAASpC,IAAIp/C,UAAW,CACvF,MAAMyhD,EAAS,IAAIljD,KAAKijD,EAASrC,MAAMn/C,WACvCwhD,EAASrC,MAAQqC,EAASpC,IAC1BoC,EAASpC,IAAMqC,CACjB,CACA,OAAOD,CACT,CACA,OAAOD,CAAS,GAChB,IAqBEG,EAAavmD,GAAOulD,OAASF,GAAgBK,SAC7Cc,EAAWD,EAAavmD,EAAMgkD,MAAQyB,GAAwBzB,MAC9DyC,EAASF,EAAavmD,EAAMikD,IAAMwB,GAAwBxB,IAE1DyC,EAAc,IACfpB,MACCtlD,GAAOulD,OAASF,GAAgBG,OAASxlD,EAAQ,CAAC,GAGxD,OACEG,EAAAA,EAAAA,MAACqlC,EAAAA,OAAM,CAAC3mC,UAAU,QAAQ,aAAW,eAAemB,MAAO4lD,EAAYvlD,SAAA,EACrEvB,EAAAA,EAAAA,KAAC8hB,EAAAA,aAAY,CAAC/hB,UAAU,UAAUgiB,aAAc+kC,EAAY7lB,KAAK1/B,SAAC,uBAGlEF,EAAAA,EAAAA,MAAA,QAAM8d,SAhCYjC,IACpBA,EAAG4C,iBAEH,IAAIsL,EAAY,KAEZlqB,GAAOulD,OAASF,GAAgBK,UA/ExC,SAAkCv+B,GAAgC,IAA/B,MAAE68B,EAAK,IAAEC,GAAoB98B,EAC9D,SAAU68B,IAASC,EACrB,CA6EoD0C,CAA0B3mD,GACxEkqB,EAAYo6B,EAAmC,CAAEN,MAAOhkD,EAAMgkD,MAAOC,IAAKjkD,EAAMikD,MACvEjkD,GAAOulD,OAASF,GAAgBG,QArF/C,SAAgC7mD,GAAmD,IAAlD,MAAEwlD,EAAQ,EAAC,OAAEC,EAAS,EAAC,KAAEC,EAAO,GAAgB1lD,EAC/E,OAAOwlD,EAAQC,EAASC,EAAO,CACjC,CAmFyDuC,CAAwB5mD,KAC3EkqB,EAAYu6B,EAA+B,CACzCJ,KAAMrkD,EAAMqkD,MAAQ,EACpBD,OAAQpkD,EAAMokD,QAAU,EACxBD,MAAOnkD,EAAMmkD,OAAS,KAI1B0B,EAAe,CAAE37B,aAAY,EAiBE7pB,SAAA,EAC3BF,EAAAA,EAAAA,MAACse,EAAAA,WAAU,CAAC5f,UAAU,0BAAyBwB,SAAA,EAC7CF,EAAAA,EAAAA,MAAC8zB,EAAAA,YAAW,CAACC,YAAY,EAAM7zB,SAAA,EAC7BvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,IACDmlC,GACJ9vB,OAAQywB,IAAgBV,GAAgBK,SACxCxlC,QAASA,IAAM8lC,EAAeX,GAAgBK,UAAUrlD,SACzD,iBAGDvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,IACDmlC,GACJ9vB,OAAQywB,IAAgBV,GAAgBG,OACxCtlC,QAASA,IAAM8lC,EAAeX,GAAgBG,QAAQnlD,SACvD,aAKF0lD,IAAgBV,GAAgBK,UAC/BvlD,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,mCAAkCwB,SAAA,EAC/CvB,EAAAA,EAAAA,KAAC2jC,EAAAA,WAAU,CACT/8B,MAAO8gD,EACPK,QAAS3B,GACT3oC,SAAWynC,GAAgBznC,EAAS8oC,GAAgBK,SAAU,CAAE1B,UAAS3jD,UAEzEvB,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,CAAC1gC,MAAM,QAAQigC,WAAW,YAAYt4B,MAAO8gD,GAAW53B,EAAAA,EAAAA,IAAqB43B,GAAY,QAEjG1nD,EAAAA,EAAAA,KAAC2jC,EAAAA,WAAU,CACT/8B,MAAO+gD,EACPI,QAAS3B,GACT3oC,SAAW0nC,GAAc1nC,EAAS8oC,GAAgBK,SAAU,CAAEzB,QAAO5jD,UAErEvB,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,CAAC1gC,MAAM,MAAMigC,WAAW,YAAYt4B,MAAO+gD,GAAS73B,EAAAA,EAAAA,IAAqB63B,GAAU,WAI7FtmD,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,mCAAkCwB,SAAA,EAC/CvB,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,CACJ1gC,MAAM,QACNH,KAAK,SACL8H,MAAOghD,EAAYvC,MACnBn+C,IAAK,EACLqR,IAAK8tC,GACL5oC,SAAWP,GACTO,EAAS8oC,GAAgBG,OAAQ,CAAErB,MAAO7xC,OAAOmpB,SAASzf,EAAGxG,cAAc9P,YAG/E5G,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,CACJ1gC,MAAM,SACNH,KAAK,SACL8H,MAAOghD,EAAYtC,OACnBp+C,IAAK,EACLqR,IAAK,GACLkF,SAAWP,GACTO,EAAS8oC,GAAgBG,OAAQ,CAAEpB,OAAQ9xC,OAAOmpB,SAASzf,EAAGxG,cAAc9P,YAGhF5G,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,CACJ1gC,MAAM,OACNH,KAAK,SACL8H,MAAOghD,EAAYrC,KACnBr+C,IAAK,EACLqR,IAAK,GACLkF,SAAWP,GACTO,EAAS8oC,GAAgBG,OAAQ,CAAEnB,KAAM/xC,OAAOmpB,SAASzf,EAAGxG,cAAc9P,kBAMpFvF,EAAAA,EAAAA,MAAC6f,EAAAA,aAAY,CAAA3f,SAAA,EACXvB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,OAAMwB,UACnBvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CACLriB,KAAK,SACLyzB,SAAUy0B,EACV5lC,QAASA,IACPre,EAAS7B,EAAMulD,OAASF,GAAgBG,OAASF,GAAuBG,IACzEplD,SACF,aAIHvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACriB,KAAK,SAASyzB,SAAUy0B,EAAY5lC,QAASA,IAAM0lC,EAAY7lB,OAAO1/B,SAAC,WAG/EvB,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACriB,KAAK,SAASwiB,MAAM,OAAOiR,SAAUy0B,EAAWzlD,UACtDF,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,8BAA6BwB,SAAA,CACzCylD,IACChnD,EAAAA,EAAAA,KAAC6jC,EAAAA,QAAO,CAAAtiC,UACNvB,EAAAA,EAAAA,KAACwjC,EAAAA,QAAO,CAACp0B,MAAO,OAEjB,KACHpP,EAAAA,EAAAA,KAAA,QAAAuB,SAAM,yBAOpB,C,gBC/PO,SAASymD,GAAwBnoD,GAKC,IALA,WACvC8kD,EAAU,WACV16B,EAAU,cACVg+B,EAAa,uBACbC,GAAyB,GACYroD,EACrC,MAAMy+C,GAAWC,EAAAA,GAAAA,MACX4J,GAA6B3jB,EAAAA,EAAAA,kBAE7Bx9B,EAAYlG,eAAevB,eAE3B6oD,EAAwBtlD,IAAAA,aAC5B,CAAAulB,EAEEggC,KACG,IAFH,MAAEzhD,EAAK,UAAEsiB,EAAS,KAAEzH,GAA2D4G,EAG/E,GAAKa,EAAL,CAOA,IAAKzH,GAAQwmC,EAAe,CAC1B,MAAMK,EAAOL,EAAc,CAAE/+B,YAAWkC,UAAWxkB,IAC/CshD,EACF5lD,OAAO4U,SAASuK,KAAQ,GAAE6mC,EAAK94B,YAAY84B,EAAKnxC,SAEhDmnC,EAASgK,EAEb,CAEAD,IAAW,CAAEzhD,QAAOsiB,YAAWzH,QAX/B,MAJMza,GACFmhD,EAA2BrU,MAcO,GAExC,CAACwK,EAAU6J,EAA4BnhD,EAAWihD,EAAeC,IAG7DK,EAAwBzlD,IAAAA,aAC3BsoB,GACMu5B,GAAe16B,GAAemB,EAE5B,CACLxkB,MAAOwkB,EACPlC,UAAW48B,GAA0B,CACnC16B,UAAWA,EACXu5B,aACA39C,YACAijB,gBARiD,MAYvD,CAAC06B,EAAY16B,EAAYjjB,IAgB3B,MAAO,CAAE+/C,eAbcjkD,IAAAA,aACrBylB,IAA4F,IAAzF3hB,MAAOwkB,EAAWlC,UAAWs/B,GAAuDjgC,EACrF6/B,EAAsB,CACpBxhD,MAAOwkB,EACPlC,UAAWs/B,IAEbL,EAA2BlnB,MAAM,GAInC,CAACknB,EAA2BlnB,KAAMmnB,IAGXD,6BAA4BC,wBAAuBG,wBAC9E,C,gBCrFO,MAAME,GAA8B,CACzC,CAAC3F,EAAAA,EAAAA,KAAe,EAChB,CAACA,EAAAA,EAAAA,KAAe,EAChB,CAACA,EAAAA,EAAAA,KAAe,EAChB,CAACA,EAAAA,EAAAA,KAAe,EAChB,CAACA,EAAAA,EAAAA,MAAgB,EACjB,CAACA,EAAAA,EAAAA,MAAgB,EACjB,CAACA,EAAAA,EAAAA,MAAgB,EACjB,CAACA,EAAAA,EAAAA,IAAc,EACf,CAACA,EAAAA,EAAAA,KAAe,EAChB,CAACA,EAAAA,EAAAA,KAAe,EAChB,CAACA,EAAAA,EAAAA,IAAc,EACf,CAACA,EAAAA,EAAAA,IAAc,EACf,CAACA,EAAAA,EAAAA,IAAc,GAGJ4F,GAAmC,IAC3CD,GACHE,UAAU,GAGNC,GAAoB,wBAEnB,SAASC,KAAwC,IAAlB7hD,IAASrG,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC7C,MAAM,MAAEO,EAAK,SAAE6B,IAAa+lD,EAAAA,GAAAA,GAC1BF,GACA5hD,EAAYyhD,GAA8BC,IAGtCK,EAA0BjmD,EAAAA,aAC7BomB,IACCnmB,GAAUukD,IAAS,IACdA,EACH,CAACp+B,IAAao+B,EAAUp+B,MACvB,GAEL,CAACnmB,IAGGq9C,EAAqBt9C,EAAAA,SACzB,IAAM6F,OAAOgU,KAAKzb,GAAOc,QAAQqP,GAAQnQ,EAAMmQ,MAC/C,CAACnQ,IAGH,MAAO,CACLk/C,mBAAoBp5C,EAAYo5C,EAAqBz3C,OAAOgU,KAAK+rC,IACjEK,0BAEJ,C,4HCpCA,SAASC,EAAmBnpD,GAMC,IANA,SAC3B0B,EAAQ,eACRyc,EAAc,aACdS,EAAY,gBACZwqC,EAAe,KACfvjD,GACyB7F,EACzB,MAAMyI,GAAUnH,EAAAA,EAAAA,iBAAgB,CAAEC,UAAW,YAAa6nD,KACpD,cAAE9lB,IAAkBC,EAAAA,EAAAA,wBAAuB96B,GAEjD,OACEjH,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAACwB,EAAAA,eAAc,CAACN,MAAOoH,EAASsyB,UAAW,EAAGsuB,sBAAoB,EAAA3nD,SAC/DA,IAEFyc,IAAmBmlB,IAClBnjC,EAAAA,EAAAA,KAACyB,EAAAA,QAAO,CACN1B,UAAU,cACVoI,GAAIzC,EACJxE,MAAOoH,EACP6F,MAAOsQ,EACP,cAAa/Y,GAAM9E,OAAU,GAAE8E,iBAAiB7E,EAAUU,SAEzDyc,MAKX,CAEA,SAASmrC,EAAqB9gC,EAQ5BnkB,GACA,IARA,eACE8Z,EAAc,aACdS,EAAY,gBACZwqC,EAAe,cACfvqC,GAAgB,KACbzd,GAC4DonB,EAGjE,MAAMjC,GAAQpmB,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,IAAK1+B,EAAOiD,IAAKA,IAErC,OAAKwa,GAKH1e,EAAAA,EAAAA,KAACgpD,EAAmB,CAClBtjD,KAAMzE,EAAMyE,KACZsY,eAAgBA,EAChBS,aAAcA,EACdwqC,gBAAiBA,EAAgB1nD,SAEhC6kB,IAVIA,CAaX,CAEO,MAAMjI,EAAerb,EAAAA,WAAiBqmD,E,qNC9DtC,MAAMC,EAAatmD,EAAAA,YAAiB,SAAmBjD,EAE5DqE,GACA,IAFA,MAAEiK,EAAQ,UAAWlN,GAAwBpB,EAG7C,MAAM4e,EAAe4qC,EAAAA,EAAal7C,GAElC,OACEnO,EAAAA,EAAAA,KAAA,UACMiB,EACJiD,IAAKA,EACLnE,UAAWE,IAAWgB,EAAMlB,UAAW,6BAA8B,CACnE,+DAAgE0e,IAAiB4qC,EAAAA,EAAAA,KACjF,0BAA2B5qC,IAAiB4qC,EAAAA,EAAAA,IAC5C,4BAA6B5qC,IAAiB4qC,EAAAA,EAAAA,OAC9C,2BAA4B5qC,IAAiB4qC,EAAAA,EAAAA,KAC7C,8BAA+B5qC,IAAiB4qC,EAAAA,EAAAA,MAChD,yBAA0B5qC,IAAiB4qC,EAAAA,EAAAA,OAC1C9nD,SAEFN,EAAMM,UAGb,ICxBO,SAASE,EAAO5B,GAAuF,IAAtF,MAAEqB,EAAK,SAAEK,EAAQ,MAAE4M,EAAQ,UAAWlN,GAA8CpB,EAC1G,OACEG,EAAAA,EAAAA,KAACykC,EAAAA,EAAc,IAAKvjC,EAAKK,SACtB8mB,IAAA,IAAC,gBAAEif,EAAe,eAAEC,KAAmB+hB,GAAcjhC,EAAA,OACpDroB,EAAAA,EAAAA,KAAA,UAASspD,EAAcvpD,UAAU,uCAAsCwB,UACrEF,EAAAA,EAAAA,MAAC+nD,EAAU,IACLnoD,EACJkN,MAAOA,EACPm5B,gBAAiBA,EACjBC,eAAgBA,EAChB,iBAAgBrmC,EAAME,UAAUG,SAAA,EAEhCvB,EAAAA,EAAAA,KAACykC,EAAAA,EAAmB,IAAKvjC,EAAO+S,KAAM,GAAG1S,UACvCvB,EAAAA,EAAAA,KAAC02C,EAAAA,EAAY,CAACt1C,UAAWF,EAAME,UAAW+M,MAAOA,MAElD5M,MAEC,GAId,C,eCVO,MAAMC,EAAiBsB,EAAAA,YAC5B,CAAAjD,EAUEqE,KAAuC,IATvC,MACEhD,EAAK,iBACL88C,EAAgB,qBAChBkL,EAAoB,QACpB9nC,EAAO,aACPmoC,EAAY,aACZC,KACGvoD,GACgBpB,EAAA,OAGrBG,EAAAA,EAAAA,KAACykC,EAAAA,EAAuB,CACtBvgC,IAAKA,EACLkd,QAAU5K,IACJwnC,GAAoBtlC,SAASklC,yBAAyB6L,aACxD/wC,SAASklC,cAAc8L,OAEzBtoC,IAAU5K,EAAE,EAEd+yC,aAAe/yC,IACT0yC,GAAsB1yC,EAAEsJ,iBAC5BypC,IAAe/yC,EAAE,EAEnBgzC,aAAehzC,IACT0yC,GAAsB1yC,EAAEsJ,iBAC5B0pC,IAAehzC,EAAE,KAEfvV,KACAC,EAAKK,SAERN,EAAMM,UACiB,I,yBClDvB,SAASJ,EAAgBkO,GAC9B,OAAOo1B,EAAAA,EAAuB,IACzBp1B,EACHq1B,SAAUxC,EAAAA,GAEd,C,8FCJA,MAAMynB,EAA6C,CACjDC,KAAM,GACNl8C,IAAK,kBACLC,MAAO,kBACPC,OAAQ,kBACRC,KAAM,kBAYD,SAAS6oC,EAAY72C,GAA8D,IAA7D,UAAEuB,EAAS,MAAE+M,EAAQ,OAAM,UAAEpO,GAA8BF,EACtF,MAAMgqD,EAAezoD,EAAU+a,MAAM,KAAK,GACpC2tC,EAAaT,EAAAA,EAAal7C,GAEhC,OACEnO,EAAAA,EAAAA,KAAA,OAAK2xC,MAAM,6BAA6BrH,QAAQ,YAAYlxB,MAAO,CAAE+sB,UAAWwjB,EAAaE,IAAgBtoD,UAC3GvB,EAAAA,EAAAA,KAAA,QACED,UAAWE,IAAWF,EAAW,CAC/B,gBAAiB+pD,IAAeT,EAAAA,EAAAA,KAChC,mCAAoCS,IAAeT,EAAAA,EAAAA,KACnD,eAAgBS,IAAeT,EAAAA,EAAAA,IAC/B,iBAAkBS,IAAeT,EAAAA,EAAAA,OACjC,gBAAiBS,IAAeT,EAAAA,EAAAA,KAChC,mBAAoBS,IAAeT,EAAAA,EAAAA,QAErC13C,EAAE,uDAIV,C,gDC5CO,IAAK03C,EAAY,SAAZA,GAAY,OAAZA,EAAAA,EAAY,eAAZA,EAAAA,EAAY,iBAAZA,EAAAA,EAAY,aAAZA,EAAAA,EAAY,mBAAZA,EAAAA,EAAY,eAAZA,EAAAA,EAAY,eAAZA,CAAY,K,gJC6BjB,SAAS3nD,EAAO7B,GAAiE,IAAhE,MAAE8B,EAAK,SAAEJ,KAAaN,GAAwCpB,EACpF,OAAOiD,IAAAA,cAlBT,SAA2BnB,GACzB,OAAQA,GACN,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,KAAK,EACH,MAAO,KACT,QACE,MAAO,KAEb,CAIIooD,CAAkBpoD,GAClB,IACKV,EACHlB,UAAWE,IAAWgB,EAAMlB,UAAW,YAAa,CAClD,WAAsB,IAAV4B,EACZ,WAAsB,IAAVA,EACZ,UAAqB,IAAVA,EACX,UAAqB,IAAVA,EACX,WAAsB,IAAVA,KAGhBJ,EAEJ,CA4BO,SAASwf,EAASsH,GAMoB,IANQ,GACnD7G,EAAK,IAAG,KACRvN,EAAO,UAAS,OAChBmkB,EAAM,SACN72B,KACGN,GACsConB,EACzC,OAAOvlB,IAAAA,cACL0e,EACA,IACKvgB,EACHlB,UAAWE,IAAWgB,EAAMlB,UAAW,CACrC,cAAeq4B,EACf,UAAoB,UAATnkB,EACX,UAAoB,YAATA,EACX,WAAqB,UAATA,EACZ,WAAqB,SAATA,KAGhB1S,EAEJ,CAQO,SAASkxC,EAAKlqB,GAA6F,IAA5F,MAAE6V,EAAK,eAAE+e,EAAc,aAAEzK,EAAY,SAAEnxC,KAAaN,GAAsCsnB,EAC9G,OACElnB,EAAAA,EAAAA,MAAA,YAAWJ,EAAOlB,UAAWE,IAAWgB,EAAMlB,UAAW,YAAa,CAAE,YAAa2yC,IAAgBnxC,SAAA,CAClG68B,IAASp+B,EAAAA,EAAAA,KAAA,QAAMD,UAAWE,IAAW,WAAY,CAAE,QAASyyC,GAAgByK,GAAgB57C,SAAE68B,IAC9F78B,IAGP,C,wDC5GO,MAAMyoD,EAAiB,CAC5B,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAIK,IAAKlH,EAAS,SAATA,GAAS,OAATA,EAAS,QAATA,EAAS,QAATA,EAAS,QAATA,EAAS,QAATA,EAAS,UAATA,EAAS,UAATA,EAAS,UAATA,EAAS,MAATA,EAAS,QAATA,EAAS,QAATA,EAAS,MAATA,EAAS,MAATA,EAAS,MAATA,CAAS,K,mFCfd,SAASmH,IACd,MAAMC,EAAepnD,EAAAA,QAAa,GAC5BqnD,EAAernD,EAAAA,aAAkB,IAAMonD,EAAatsD,SAAS,IASnE,OAPAkF,EAAAA,WAAgB,KACdonD,EAAatsD,SAAU,EAChB,KACLssD,EAAatsD,SAAU,CAAK,IAE7B,IAEIusD,CACT,C,eCTO,SAASrkB,IAA8D,IAA5CskB,EAAmCzpD,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,KACtE,MAAMgC,GAAiBC,EAAAA,EAAAA,KACjBunD,EAAeF,KACdI,EAAYxkB,GAAiB/iC,EAAAA,SAAesnD,IAC5CpI,EAAcsI,GAAmBxnD,EAAAA,SAAuBunD,GAAYhI,aAAe,IACnF/oC,EAAeixC,GAAoBznD,EAAAA,SAAuBunD,GAAYG,cAAgB,GA8C7F,OA5CA1nD,EAAAA,WAAgB,KACd,IAAKH,EACH,OAGF,MAAM8nD,EAAiBA,KACrB,IAAKN,IACH,OAEF,MAAMO,EAAkBL,GAAYhI,YAC9BsI,EAAmBN,GAAYG,aACjCE,IAAoB1I,GACtBsI,EAAgBI,GAAmB,GAEjCC,IAAqBrxC,GACvBixC,EAAiBI,GAAoB,EACvC,EAEIC,EAA0BC,IAASJ,EAAgB,KAEnDK,EAAiB,IAAInoD,GAAgBe,IAKzCpB,OAAOqB,uBAAsB,KACvBC,MAAMC,QAAQH,IAAYA,EAAQ9C,OAAS,GAC7CgqD,GACF,GACA,IASJ,OANIP,GACFS,EAAehnD,QAAQumD,GAGzBI,IAEO,KACLG,EAAwBG,SACxBD,GAAgB9mD,YAAY,CAC7B,GACA,CAACrB,EAAgBq/C,EAAcqI,EAAY/wC,EAAe6wC,IAEtD,CAAEtkB,cAAeukB,EAAkB,OAAWvkB,EAAemc,eAAc1oC,gBACpF,C,+DCzCO,SAASkG,EAAqBpC,GACnC,MAAM4tC,EAAqBloD,EAAAA,OAA6B,MACxDA,EAAAA,WAAgB,KACd,IAAImoD,EAAoBvyC,SAASwyC,cAAgC,mBACjE,MAAMtN,EAAgBllC,SAASklC,cAC3BoN,EAAmBptD,UAAYggD,GAM/BA,GAAe3kC,UAAUC,SAAS,cACpC+xC,EAAoBrN,GAGtBoN,EAAmBptD,QAAUqtD,EAE7BA,GAAmBvB,SACnB7mB,YAAW,IAAMooB,GAAmBrT,aAVlCoT,EAAmBptD,QAAU,IAUe,GAC7C,CAACwf,GACN,C,kFCxBA,MAAM+tC,EAAsB,uBACtBC,EAA6B,CACjCC,UAAY,iEAMP,SAASlV,EAAmBt2C,GAAoE,IAAnE,eAAEu2C,EAAc,uBAAER,EAAsB,QAAES,EAAO,MAAEn1C,GAAcrB,EACnG,MAAM,YAAE0Z,IAAgBu8B,EAAAA,EAAAA,GAAc,CAAEC,WAAY70C,EAAM6gC,SAAW7gC,EAAMolC,YACrE0P,EAAgB90C,EAAM+0C,sBAAsBr4C,QA0BlD,OAxBAkF,IAAAA,WAAgB,KACd,IAAKkzC,IAAkB90C,EAAM6gC,UAAY6T,EAAwB,OAGjE,MAAMU,EAAaN,EAAcr/B,yBAC1B,CAAEG,GAAWu/B,EACpB,IAAIiV,EAAmB,OACvB,GAAIpqD,EAAME,UAAUkyB,WAAW,UAAW,CACxC,IAAIllB,EAASmL,EAAc+8B,EAAW1oC,OAAmB,EAAVkJ,EAG3Cw/B,EAAW1oC,OAAS,IAAGQ,GAAU9L,OAAOijC,SAC5C+lB,EAAoB,GAAEt7C,KAAK9I,IAAIkH,EAAQgoC,MACzC,KAAO,CACL,MAAMhoC,EAASkoC,EAAW5oC,IAAgB,EAAVoJ,EAChCw0C,EAAoB,GAAEt7C,KAAK9I,IAAIkH,EAAQgoC,MACzC,CAGA,MAAMG,EAAYP,EAAc/vB,aAAa,kBACtBswB,EAAY79B,SAASC,eAAe49B,GAAa,OACxDn9B,MAAMqtB,YAAY0kB,EAAqBG,EAAiB,GACvE,CAACtV,EAAez8B,EAAa68B,EAAgBR,EAAwBS,EAASn1C,EAAME,UAAWF,EAAM6gC,UAEjG6T,EAAyBwV,OAA6BvqD,CAC/D,C,0EC9CO,SAAS+B,IACd,MAAM2oD,EAAazoD,EAAAA,OAAa,oBAAqBR,OAAS,IAAIkpD,qBAAoB3qD,IAC/E8B,EAAgB8oD,GAAqB3oD,EAAAA,UAC1C,IAAMR,OAAOK,iBAgBf,OAbAG,EAAAA,WAAgB,UACgB,IAAnBH,IACT+oD,EAAAA,EAAAA,KAA6BC,MAAMC,IAC5BL,EAAW3tD,SAASiuD,OAAOC,SAC9BL,GAAkB,IAAMG,GAC1B,GAEJ,GACC,CAACjpD,IAGJG,EAAAA,WAAgB,IAAM,IAAMyoD,EAAW3tD,SAASmuD,SAAS,IAElDppD,CACT,C,6FCVO,SAASuwB,EAAgCc,GAC9C,OAA0C,IAAnCA,GAAQtgB,iBAAiB,KAClC,CAMO,SAASs4C,EAAwCh5B,GACtD,OAAQvb,IACN,IAAI7Q,EAAQ,KASZ,OAPIssB,EAAcF,GACsB,mBAA3BA,EAAOi5B,gBAAgCrlD,EAAQosB,EAAOi5B,gBAAgBx0C,GACzD,iBAARA,IAAkB7Q,EAAQ6Q,IAAMub,EAAO7qB,KAEvDvB,EAAQ6Q,EAGF7Q,GAA2B,IAAI,CAE3C,CAEO,SAASmtB,EAAWl0B,GAYxB,IAZ2C,KAC5CmR,EAAI,OACJgjB,EAAM,UACN/B,EAAS,YACTyB,EAAcs4B,EAAqB,QACnCj6C,GAODlS,EACC,OAAOiD,EAAAA,SAAc,IACdkxB,EAEE,IAAIhjB,GAAM8C,MAAK,CAACV,EAAGC,KACxB64C,EAAAA,EAAAA,IAAuB,IAClBn6C,EACHqB,IACAC,IACA4e,YACAyB,YAAaA,EAAYM,OART,IAAIhjB,IAWvB,CAACA,EAAMe,EAASkgB,EAAWyB,EAAaM,GAC7C,C,0ECxDO,SAAS80B,EAA+BqD,EAAoBhS,GACjE,MAAOj5C,EAAO6B,GAAYD,EAAAA,SAA0BspD,EAAAA,SAAiBD,EAAYhS,IAEjFr3C,EAAAA,WAAgB,KACd,MAAMupD,EAAeD,EAAAA,mBAA2BD,EAAYhS,EAAcp3C,GAE1E,MAAO,KACLspD,EAAaC,aAAa,CAC3B,GACA,CAACH,EAAYhS,IAOhB,MAAO,CACLj5C,QACA6B,SAPeD,EAAAA,aACd4wB,GAAiD04B,EAAAA,SAAiBD,EAAYz4B,EAAaymB,IAC5F,CAACA,EAAcgS,IAOnB,C,qFCtBO,SAASI,EAAiBtrD,GAC/B,MAAM,aAAEurD,GAAe,EAAK,mBAAEC,GAAqB,GAASxrD,GAAS,CAAC,EAChEyrD,EAAgB5pD,EAAAA,OAAa0pD,GAC7Bt1C,GAAWy1C,EAAAA,EAAAA,MAEXC,EAAkB9pD,EAAAA,aAAkB,KACxC+pD,EAAAA,GAAuB,CAAEr9B,SAAUtY,EAASsY,SAAU5W,MAAO1B,EAASC,QAAS,GAC9E,CAACD,EAASsY,SAAUtY,EAASC,SAQhC,OANArU,EAAAA,WAAgB,KACT2pD,IACDC,EAAc9uD,SAASgvD,IAC3BF,EAAc9uD,SAAU,EAAI,GAC3B,CAAC6uD,EAAoBG,EAAiBJ,IAElCI,CACT,C,kFCbO,SAAS9W,IAAyE,IAA3D,iBAAEgX,EAAmB,IAAG,WAAE/W,GAAa,GAAap1C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACpF,MAAOsT,EAAM84C,GAAWjqD,EAAAA,SAAe,CACrCP,WAAYD,OAAOC,WACnBgX,YAAajX,OAAOiX,cAqBtB,OAlBAzW,EAAAA,WAAgB,KACd,IAAKizC,EAAY,OAEjB,MAAMzyC,EAAeC,KAAS,KAC5BwpD,EAAQ,CACNxqD,WAAYD,OAAOC,WACnBgX,YAAajX,OAAOiX,aACpB,GACDuzC,GAIH,OAFAxqD,OAAOyB,iBAAiB,SAAUT,GAE3B,KACLA,EAAaynD,SACbzoD,OAAO2B,oBAAoB,SAAUX,EAAa,CACnD,GACA,CAACwpD,EAAkB/W,IAEf9hC,CACT,C,i9BCxBA,MAAM+4C,EAAoC,CAAC,EAAG,GAqEvC,SAASC,EAAWptD,GAA8D,IAA7D,IAAE6N,EAAG,KAAEG,EAAI,cAAEq/C,EAAa,KAAEjsB,EAAI,MAAEre,GAAyB/iB,EACrF,MAAOstD,EAAeC,GAAoBtqD,EAAAA,SAAe,MACnDuqD,EAAavqD,EAAAA,SAAc,IArEnC,SAAuB4K,EAAaG,GAClC,MAAO,CACL8I,wBACE,MAAMF,EAAO,CACX/I,IAAKA,EAAMpL,OAAOijC,QAClBt5B,EAAGyB,EAAMpL,OAAOijC,QAChB13B,KAAMA,EAAOvL,OAAOgjC,QACpBp5B,EAAG2B,EAAOvL,OAAOgjC,QACjB13B,OAAQF,EACRC,MAAOE,EACPuB,MAAO,EACPhB,OAAQ,GAGV,MAAO,IACFqI,EACH62C,OAAQA,IAAM72C,EAElB,EAEJ,CAiDyC82C,CAAc7/C,EAAKG,IAAO,CAACA,EAAMH,IAClEu7B,GAAgBR,EAAAA,EAAAA,kBAAiB,CAAErnC,UAAW,kBAC9C,cAAE+hC,IAAkBC,EAAAA,EAAAA,wBAAuB6F,GAC3CukB,EAAc1qD,EAAAA,QAAa,IAE3B,OAAE2qD,EAAM,WAAEC,IAAeC,EAAAA,EAAAA,GAAUN,EAAYF,EAAe,CAClE/rD,UAAW,WACXwsD,UAAW,CACT,CACEloD,KAAM,SACNqM,QAAS,CACP87C,OAAQb,OAyBhB,OAhBAlqD,EAAAA,WAAgB,KACVqgC,GAAiBqqB,EAAY5vD,SAASqjC,GAAM,GAC/C,CAACkC,EAAelC,IAKnBn+B,EAAAA,WAAgB,KACdmmC,EAAc6K,OACd0Z,EAAY5vD,SAAU,EAEf,IAAMqrC,EAAchI,SAG1B,KAGDjhC,EAAAA,EAAAA,KAAA,OAIEkE,IAAKkpD,KACDM,EAAWI,OACf10C,MAAOq0C,EAAOK,OACd/tD,UAAU,+DACV,cAAY,2BAA0BwB,UAEtCvB,EAAAA,EAAAA,KAAC+tD,EAAmB,CAClB9uD,OAAOe,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,CAACphB,UAAU,8BACzBmtD,cAAeA,EACfhsD,MAAO+nC,EACPrmB,MAAOA,EACPomB,UAAQ,KAIhB,CAUA,SAASglB,EAAgB3lC,EAEvBnkB,GACA,IAFA,MAAEjF,EAAK,MAAE2jB,EAAK,MAAE1hB,EAAK,SAAE8nC,EAAQ,cAAEkkB,EAAgB15C,OAAOmiC,kBAAyCttB,EAGjG,MAAM4lC,GAAaxlB,EAAAA,EAAAA,kBAAiB,CAAErnC,UAAW,gBAC3C80C,GAAiBC,EAAAA,EAAAA,GAAoB,CACzCC,eAAgB8W,EAChBtX,wBAAwB,EACxBS,QAAS2W,EACT9rD,UAGF,OACElB,EAAAA,EAAAA,KAACqpC,EAAAA,SAAQ,CACPnlC,IAAKA,EACLjF,MAAOA,EACPiC,MAAOA,EACP,aAAW,eACX8nC,SAAUA,EACV5vB,MAAO88B,EACPn2C,UAAU,kBAAiBwB,SAE1BqhB,EAAMpL,KAAI,CAACsL,EAAMgG,IACE,YAAdhG,EAAKhkB,MACAkB,EAAAA,EAAAA,KAACgqC,EAAAA,kBAAiB,CAAAzoC,SAAcuhB,EAAK7jB,OAAb6pB,QAGXjoB,IAAlBiiB,GAAM/Q,SAEN/R,EAAAA,EAAAA,KAAC+tD,EAAmB,CAClB7sD,MAAO+sD,EACPhvD,OACEe,EAAAA,EAAAA,KAAC+pC,EAAAA,aAAY,CAACpZ,aAAa,aAAa,cAAc,iBAAgB7N,EAAK3a,KAAK5G,SAC7EuhB,EAAK7jB,QAGV2jB,MAAOE,EAAK/Q,WAMhB/R,EAAAA,EAAAA,KAAC+pC,EAAAA,aAAY,CAEX3oB,QAASA,KACP0B,EAAK1B,YACL9e,OAAOotB,OAAO,QAAS,eAAgB/mB,OAAO+J,OAAO,CAAEw7C,YAAaprC,EAAK3a,IAAM2a,EAAK4M,MAAM,EAE5F,cAAc,iBAAgB5M,EAAK3a,KACnCpI,UAAU,WAAUwB,SAEnBuhB,EAAK7jB,OARD6pB,MAcjB,CAEA,MAAMilC,EAAsBjrD,EAAAA,WAAiBkrD,G,uCCtLtC,MAAMG,GAAgBrrD,IAAAA,YAC3B,CAAAjD,EAA8CqE,KAAG,IAAhD,SAAE3C,EAAQ,SAAE6sD,EAAQ,UAAEruD,KAAckB,GAAOpB,EAAA,OAC1CG,EAAAA,EAAAA,KAAA,UACMiB,EACJiD,IAAKA,EACLnE,UAAWE,IAAWF,EAAW,wCACjCqZ,MAAO,CAAEg1C,YAAW7sD,SAEnBA,GACG,IAWH,SAAS8sD,GAAUhmC,GAA4F,IAA3F,QAAEyK,EAAU,EAAC,KAAEw7B,EAAO,EAAC,OAAErgD,GAAS,EAAK,SAAE1M,EAAQ,UAAExB,KAAckB,GAAwBonB,EAClH,OACEroB,EAAAA,EAAAA,KAAA,UACMiB,EACJlB,UAAWE,IAAWF,EAAW,mBAAoB,CACnD,2EAA4EkO,IAE9EmL,MAAO,CAAEm1C,oBAAsB,UAASz7B,UAAiB07B,iBAAmB,UAASF,WAAe/sD,SAEnGA,GAGP,CAMO,MAAMktD,GAAuCxtD,IAAUjB,EAAAA,EAAAA,KAACquD,GAAU,IAAKptD,I,gBCzD9E,MAAMytD,GAAsD19C,GAASA,EAqB9D,SAAS29C,GAAU9uD,GAUwB,IALhD2hB,GAAI4Q,EAAW,SACfw8B,EAAW,QAAmB,UAC9BC,EAAY,WAAuB,cACnCC,EAAgBJ,MACbztD,GAC2CpB,EAC9C,MAAQ,CAAC+uD,GAAWhoD,EAAO,CAACioD,GAAYpxC,GAAaxc,GAC9CC,EAAO6B,GAAYD,EAAAA,SAAwD8D,GAE5EqW,EAAena,EAAAA,aACnB,WACEC,EAAS+rD,KAAcnuD,YACvB8c,KAAS9c,UACX,GACA,CAAC8c,EAAUqxC,IAGb,OAAOhsD,EAAAA,cAAoBsvB,EAAa,IACnCnxB,EACH,CAAC2tD,GAAW1tD,EACZ,CAAC2tD,GAAY5xC,GAEjB,C,4HCzBA,MAAM8xC,IAAiBC,EAAAA,GAAAA,IAAiB,CACtCC,GAAAA,GAAAA,OACAA,GAAAA,GAAAA,UACAA,GAAAA,GAAAA,cACAA,GAAAA,GAAAA,aAEIC,GAAkB,CAACC,GAAAA,EAAUF,GAAAA,GAAAA,UAAoBF,IAEjDK,IAAYp1C,EAAAA,GAAAA,MAElB,SAASq1C,GAAqB3pC,EAAiB67B,GAC7C,IAAKA,EAAkB,OAAO,EAE9B,MAAMl/C,EAAUqjB,EAAG/O,wBACb4iB,EAAYgoB,EAAiB5qC,wBAEnC,OAAOtU,EAAQqL,KAAO6rB,EAAU7rB,KAAOrL,EAAQuL,QAAU2rB,EAAU3rB,MACrE,CAEA,SAAS8lB,GAAYV,GACnB,MAAMs8B,EAAoBt8B,EAAOi5B,gBAEjC,YAAiC,IAAtBqD,GAA0CtD,EAAAA,GAAAA,IAAsBh5B,GAEnEvb,GAAuC63C,EAAkB,CAAE7I,KAAM8I,GAAAA,GAAAA,MAAe93C,SAAU,IACpG,CAEO,SAAS+3C,GAAuB3vD,GAQN,IARO,KACtCmR,EAAI,mBACJy+C,EAAkB,YAClBC,EAAW,kBACXC,EAAiB,eACjBC,EAAc,WACdC,EAAU,kBACVC,GAC6BjwD,EAC7B,MAAMkwD,EAAYjtD,EAAAA,SAAc,IAAMkO,EAAKhP,QAAQguD,GAAUA,EAAMlxD,OAAS0kB,GAAAA,GAAAA,QAA2B,CAACxS,IAClGi/C,GAAYx8B,EAAAA,GAAAA,IAAa,CAC7BziB,KAAM++C,EACNj9B,QAASo8B,GACTx7B,eACAX,YAAak8B,GAAAA,GAAAA,UAERiB,EAAaC,GAAkBrtD,EAAAA,YAC/By+C,EAAkB6O,GAAuBttD,EAAAA,WAEhDA,EAAAA,WAAgB,KACd,MAAMT,EAAUqW,SAASwyC,cAAc,2DACnC7oD,GAAS+tD,EAAoB/tD,EAA0B,GAC1D,IAEHS,EAAAA,WAAgB,KACd,MAAMutD,EAAa33C,SAASwyC,cAAe,iBAAgBwE,OACvDE,GAAkBS,IAAe33C,SAASklC,eAAiB5sC,EAAKwD,MAAK6T,IAAA,IAAC,OAAEzJ,GAAQyJ,EAAA,OAAKqnC,IAAgB9wC,CAAM,MAC7GuxC,EAAeT,GACfW,GAAYzY,QACd,GAGC,CAAC+X,EAAmBC,EAAgBF,IAEvC,MAoCMY,EAAcxtD,EAAAA,aACjBoa,IACC,GAAe,cAAXA,EAAG7L,KAAkC,YAAX6L,EAAG7L,IAAmB,CAClD6L,EAAG4C,iBACH,MAAMlB,EAAUlG,SAASklC,eAAsC2S,QAAQ3xC,OACnEA,GACF6wC,EAAmB7wC,EAEvB,IAEF,CAAC6wC,IAGGe,EAAwBtzC,IACvBgzC,GACHhzC,EAAGxG,cAAckhC,MAAM,CAAEC,eAAe,GAC1C,EAGI4Y,EAAmB3tD,EAAAA,aACtBkwB,IACC,IAAIa,EAAUb,EACVi9B,EAAUn8C,KAAKkf,OAAO7qB,KAAO6qB,EAAO7qB,IAAM8nD,EAAUn8C,KAAKme,YAAcW,GAAAA,GAAAA,aACzEiB,EAAUq7B,GAAgB,IAG5Be,EAAUr8B,WAAWC,GACrBi8B,EAAkBj8B,EAAQ1rB,GAAG,GAE/B,CAAC2nD,EAAmBG,IAUtB,OANAntD,EAAAA,WAAgB,KACV+sD,IAAeI,EAAUn8C,KAAKkf,OAAO7qB,IAAI8nD,EAAUr8B,WAAWu7B,GAAAA,EAAUU,GAAY,GAGvF,CAACA,KAGFxuD,EAAAA,EAAAA,MAAC4vB,GAAAA,GAAK,CAAClxB,UAAU,kBAAiBwB,SAAA,EAChCvB,EAAAA,EAAAA,KAACkxB,GAAAA,GAAS,CAACnxB,UAAU,0CAAyCwB,SAC3DwtD,GAAev3C,KAAKwb,IACnBhzB,EAAAA,EAAAA,KAACwyB,GAAAA,GAAmB,CAClBzyB,UAAU,aAEV2xB,MAAOsB,EAAOtB,MACdM,SAAUi+B,EAAUn8C,KAAKkf,OAAO7qB,KAAO6qB,EAAO7qB,GAC9C8pB,UAAWg+B,EAAUn8C,KAAKme,UAC1B7Q,QAASA,IAAMqvC,EAAiBz9B,GAAQzxB,SAEvCyxB,EAAOttB,MANHstB,EAAO7qB,SAUlBnI,EAAAA,EAAAA,KAAA,SAAAuB,SACG0uD,EAAUj/C,KAAKwG,KAAI,CAACyJ,EAAO6H,KAC1B9oB,EAAAA,EAAAA,KAAC0yB,GAAAA,GAAQ,CACP,cAAazR,EAAMrC,OACnBgc,SAAU9R,EAEV/oB,UAAWwe,IAAW,8BAA+B,CACnD,OAAQ6wC,GACR,MAAOA,KAEThuC,QAASA,KACP+uC,EAAelvC,EAAMrC,QACrB6wC,EAAmBxuC,EAAMrC,OAAO,EAElC6mB,YAAa+qB,EACb71B,UAAYzd,GA1GAgd,EAAChd,EAA8C4L,KACnE,GAAe,cAAX5L,EAAG7L,KAAkC,YAAX6L,EAAG7L,IAG/B,OAFA6L,EAAG4C,iBAKL,MAAM4wC,EAAcxzC,EAAGxG,cAAci6C,uBAC/BC,EAAc1zC,EAAGxG,cAAcm6C,mBAC/BC,EAAe5zC,EAAGxG,cAAcq6C,eAAeC,kBAC/CC,EAAc/zC,EAAGxG,cAAcq6C,eAAeG,iBAEpD,GAAe,cAAXh0C,EAAG7L,IAAqB,CAC1Bu/C,GAAahZ,MAAM,CAAEC,eAAe,IAC/B+Y,GAAaE,GAAclZ,MAAM,CAAEC,eAAe,IACvD,MAAMnyB,EAAKhN,SAASklC,cAChBl4B,IAAO2pC,GAAqB3pC,EAAI67B,IAClC7oC,SAASklC,eAAeuT,gBAAe,EAE3C,CACA,GAAe,YAAXj0C,EAAG7L,IAAmB,CACxBq/C,GAAa9Y,MAAM,CAAEC,eAAe,IAC/B6Y,GAAaO,GAAarZ,MAAM,CAAEC,eAAe,IACtD,MAAMnyB,EAAKhN,SAASklC,cAChBl4B,IAAO2pC,GAAqB3pC,EAAI67B,IAClC7oC,SAASklC,eAAeuT,iBAAeroC,GAAS,GAEpD,CAEA,MAAMlK,EAAUlG,SAASklC,eAAsC2S,QAAQ3xC,OAEnEA,GACFuxC,EAAevxC,EACjB,EAyE2Bsb,CAAchd,EAAI4L,GACrCsoC,QAASd,EAAY/uD,SAEpBwtD,GAAev3C,KAAKwb,IACnBhzB,EAAAA,EAAAA,KAACuxB,GAAAA,GAAS,CACRxxB,UAAWwe,IAAW,wCAAyC,CAC7D,+BAAgC2xC,IAAgBjvC,EAAMrC,OACtD,sDAAuDsxC,IAAgBjvC,EAAMrC,SAG/E8S,MAAOsB,EAAOtB,MAAMnwB,SAEnByxB,EAAOq+B,aAAa,CAAE5K,KAAM8I,GAAAA,GAAAA,UAAmB93C,IAAKwJ,EAAO6H,WAHvDkK,EAAO7qB,OAnBV,GAAE8Y,EAAMrC,UAAUkK,WA8BpC,C,gBCjNO,IAAKwoC,GAAS,SAATA,GAAS,OAATA,EAAS,eAATA,EAAS,iBAATA,EAAS,gBAATA,EAAS,eAATA,CAAS,MA0Ed,SAASC,GAAW1xD,GAWN,IAXO,MAC1BZ,EAAK,KACLgV,EAAO,UAAS,YAChBwjB,EAAW,aACX9G,EAAY,IACZzpB,EAAM,EAAC,IACPqR,EAAM,IAAG,KACTi5C,EAAO,EAAC,UACRzxD,EAAS,eACTmlB,KACGjkB,GACcpB,EACjB,MAAO4xD,EAAUC,IAAe93B,EAAAA,EAAAA,WAAS,GACnC+3B,GAAWn4B,EAAAA,EAAAA,QAAuB,MAClCo4B,GAAWp4B,EAAAA,EAAAA,QAAwB,OAEzCgG,EAAAA,EAAAA,YAAU,KACRkyB,EAAYnxC,QAAQoxC,EAAS/zD,SAAWg0D,EAASh0D,SAAS,GACzD,IAEH,MAAMi0D,GAAY5zB,EAAAA,EAAAA,UAAQ,KACxB,MAAM6zB,EAAQH,EAAS/zD,QACjBm0D,EAAQH,EAASh0D,QACjBo0D,GAAgB/wD,EAAM2F,MAAQM,IAAQqR,EAAMrR,GAElD,IAAKuqD,IAAaK,IAAUC,EAAO,OAEnC,MAAME,EAAWH,EAAMn7C,wBACjBu7C,EAAWH,EAAMp7C,wBAEvB,OAASq7C,GAAgBC,EAAS7iD,MAAQ8iD,EAAS9iD,OAAU6iD,EAAS7iD,MAAS,GAAG,GACjF,CAAClI,EAAKqR,EAAKtX,EAAM2F,MAAO6qD,IAE3B,OACEzxD,EAAAA,EAAAA,KAACyyC,GAAAA,MAAK,CAACrU,MAAOn/B,EAAOc,UAAWA,EAAUwB,UACxCF,EAAAA,EAAAA,MAAA,OAAKtB,UAAWE,IAAWqxD,GAAUr9C,GAAO,yCAAyC1S,SAAA,CAClFk2B,GAEDp2B,EAAAA,EAAAA,MAAA,OAAK6C,IAAKytD,EAAU5xD,UAAU,gBAAewB,SAAA,EAC3CF,EAAAA,EAAAA,MAAA,OAAKtB,UAAU,eAAcwB,SAAA,EAC3BvB,EAAAA,EAAAA,KAAA,OACED,UAAWE,IAAW,6DAA8D,CAClF,aAAcwxD,IACblwD,UAEHvB,EAAAA,EAAAA,KAAA,OACED,UAAU,6DACVqZ,MAAO,CAAEhK,MAAQ,GAAEyiD,WAIvB7xD,EAAAA,EAAAA,KAAA,QACEkE,IAAK0tD,EACL7xD,UAAWE,IACT,mNACA,CAAE,aAAcwxD,IAElBr4C,MAAO,CAAEvL,KAAO,GAAEgkD,YAItB7xD,EAAAA,EAAAA,KAAA,YACMiB,EACJnC,KAAK,QACLoI,IAAKA,EACLqR,IAAKA,EACLi5C,KAAMA,EACNzxD,UAAWE,IAAWilB,EAAgB,8DAIzCyL,MAIT,C,mDCvJO,IAAKwhC,GAAY,SAAZA,GAAY,OAAZA,EAAAA,EAAY,qCAAZA,EAAAA,EAAY,6BAAZA,CAAY,MAKZC,GAAgB,SAAhBA,GAAgB,OAAhBA,EAAAA,EAAgB,uBAAhBA,EAAAA,EAAgB,2BAAhBA,CAAgB,M,2BCIrB,MAAMC,GAAiBvvD,EAAAA,cAAqC,CACjEmvB,UAAWmgC,GAAiBE,SAC5BhxC,MAAO6wC,GAAa/6B,gBACpBm7B,WAAW,EACXC,aAAa,EACbx4C,UAAU,IAGL,SAASy4C,KACd,OAAO3vD,EAAAA,WAAiBuvD,GAC1B,CC4CO,SAASK,GAAOrqC,GAMmB,IANlB,UACtB4J,EAAY,WAAU,MACtB3Q,EAAQ,kBAAiB,SACzBtH,GAAW,EAAK,SAChBzY,EAAQ,UACRxB,GACsCsoB,EACtC,MAAMsqC,EAAa7vD,IAAAA,OAA6B,MAC1C8vD,EAAuB9vD,IAAAA,SAC3B,KAAM,CACJmvB,UAAWmgC,GAAiBngC,GAC5B3Q,MAAO6wC,GAAa7wC,GACpBixC,UACEH,GAAiBngC,KAAemgC,GAAiBE,UAAYH,GAAa7wC,KAAW6wC,GAAaU,YACpGL,YACEJ,GAAiBngC,KAAemgC,GAAiBU,YAAcX,GAAa7wC,KAAW6wC,GAAaU,YACtG74C,cAEF,CAACiY,EAAW3Q,EAAOtH,IAEf+4C,EA9EmBlzD,KAK6B,IAL5B,UAC1BoyB,EAAS,UACTsgC,EAAS,SACTv4C,EAAQ,MACRsH,GACgBzhB,EAChB,OACO,IADC0yD,EAEG,CACLxyD,UAAWE,IAAW,kDAAmD,CACvE,iCAAkCgyB,IAAcmgC,GAAiBE,SACjE,iGACExxD,eAAekyD,sBAKd,CACLjzD,UAAWE,IAAW,6DAA8D,CAClF,qBAAsBgyB,IAAcmgC,GAAiBU,YAAchyD,eAAekyD,mBAClF,8FACE/gC,IAAcmgC,GAAiBE,SACjC,YAAargC,IAAcmgC,GAAiBE,WAAat4C,EACzD,qCAAsCsH,IAAU6wC,GAAaU,cAAgB74C,EAC7E,qDACEiY,IAAcmgC,GAAiBU,YAAcxxC,IAAU6wC,GAAaU,YACtE,oBAAqBvxC,IAAU6wC,GAAaU,YAC5C,uEAAwE74C,IAGhF,EAgDwBi5C,CAAmBL,GA2B3C,OAzBA9vD,IAAAA,iBAAsB,KAGpB,GAAIqvD,GAAa7wC,KAAW6wC,GAAaU,cAAe/kC,EAAAA,GAAAA,MAAmB,CACzE,MAAMolC,EAAc3vD,MAAS,KAC3B,GAA2B,OAAvBovD,EAAW/0D,QAAkB,CAC/B,MAAMu1D,EAAgBR,EAAW/0D,QAAQwb,MAAMhK,MAC/CujD,EAAW/0D,QAAQwb,MAAMhK,MAAQ,IAEjCujD,EAAW/0D,QAAQykD,YACnBsQ,EAAW/0D,QAAQwb,MAAMhK,MAAQ+jD,CACnC,IACC,KAKH,OAHAD,IACA5wD,OAAOyB,iBAAiB,SAAUmvD,GAE3B,KACL5wD,OAAO2B,oBAAoB,SAAUivD,EAAY,CAErD,IACC,CAAC5xC,KAKFthB,EAAAA,EAAAA,KAAA,OAEEmI,GAAG,UACH,cAAY,UACZpI,UAAWE,IAAW8yD,EAAgBhzD,UAAWA,GACjDmE,IAAKyuD,EAAWpxD,UAEhBvB,EAAAA,EAAAA,KAACqyD,GAAezqB,SAAQ,CAAChhC,MAAOgsD,EAAqBrxD,SAAEA,KANlD0wB,EASX,CCzDO,SAASmhC,GAAa/qC,GAMiB,IAN8B,KAC1EvF,EAAI,gBACJuwC,EACAC,WAAYC,EAAc,UAC1Bra,KACGj4C,GACuConB,EAC1C,MAAM,MAAE/G,EAAK,YAAEkxC,GAAgBC,KACzBa,EAAaC,QAAsC1yD,IAApBiiB,EAAK0wC,WACpCC,EAjER,SAA+B5zD,GAUe,IAVd,MAC9ByhB,EAAK,SACL0Q,EAAQ,YACRwgC,EAAW,WACXc,GAMDzzD,EACC,MAAM6zD,EAAkB5yD,eAAekyD,mBACvC,OAAQ1xC,IACD6wC,GAAaU,YACT,CACL9yD,UAAWE,IACT,CACE0zD,KAAMnB,EACN,aAAcA,IAAgBkB,EAC9B,gBAAiBJ,IAGlBI,GAAmB,CAClB,yFAAyF,EACzF,+EAAgF1hC,EAChF,uCAAwCA,IAG5C1Q,MAAOoyC,EAAkB,kBAAoB,cAC7Cz+B,SAAUy+B,OAAkB7yD,EAAY,OACxCoT,KAAMu+C,GAAekB,OAAkB7yD,EAAY,QAG9C,CACLd,UAAWE,IACT,+NACA,CACE,gBAAiBqzD,EACjB,mJACGthC,EACH,4EAA6EA,IAGjF1Q,MAAO,cACP2T,SAAU,QAGlB,CAkByB2+B,CAAuB,CAC5CtyC,QACAkxC,cACAxgC,SAAU/wB,EAAMu1B,OAChB88B,WAAYA,IAGRO,EAAcA,KAClB7zD,EAAAA,EAAAA,KAAC8wB,GAAAA,KAAI,CAACprB,KAAOzE,EAAMu1B,QAAU1T,EAAKgxC,YAAehxC,EAAKgU,KAAM1nB,MAAO,GAAIrP,UAAU,cAGnF,OACEC,EAAAA,EAAAA,KAACmhB,EAAAA,OAAM,IACDsyC,KACCxyD,EACLs2B,WAAYt2B,EAAMs2B,YAAc,SAChC6G,MAAOn9B,EAAMsxB,UAAY8gC,EAAkBA,EAAmBpyD,EAAMu1B,QAAU1T,EAAKixC,aAAgBjxC,EAAKsb,MACxGnqB,KACEw/C,EAAex/C,OACdqN,IAAU6wC,GAAa/6B,iBAAmBt2B,eAAekyD,mBAAqB,SAAW,SAC3FzxD,SAEA23C,GACCl5C,EAAAA,EAAAA,KAAC6jC,GAAAA,QAAO,CAACC,MAAO,IAAKE,eAAgB6vB,IAActyD,UACjDvB,EAAAA,EAAAA,KAACwjC,GAAAA,QAAO,CAACp0B,MAAO,QAGlBpP,EAAAA,EAAAA,KAAAsB,EAAAA,SAAA,CAAAC,SACGN,EAAMM,WACJ+xD,GACCtzD,EAAAA,EAAAA,KAAC6jC,GAAAA,QAAO,CAACC,MAAO,IAAKE,eAAgB6vB,IAActyD,UACjDvB,EAAAA,EAAAA,KAAC8wB,GAAAA,KAAI,CAACprB,KAAMod,EAAK0wC,WAAYpkD,MAAO,GAAIrP,UAAU,eAGpD8zD,QAMd,C,wCChDO,SAASG,GAAYn0D,GAUN,IAVO,YAC3Bo0D,EAAW,SACXjiC,EAAQ,UACRknB,EAAS,WACTgb,EAAU,WACVC,EAAU,SACV12C,EAAQ,gBACR22C,GAAkBp6C,EAAAA,GAAAA,MAAU,SAC5BuY,EAAQ,gBACR8gC,GACkBxzD,EAClB,MAAM,MAAEyhB,EAAK,YAAEkxC,GAAgBC,MACxB7W,EAAcyY,GAAmBvxD,EAAAA,SAAemxD,GACjDK,EAAUH,GAAY/4C,QAAQ,MAAO,KAAKm5C,oBAC1CC,EAAqBlzC,IAAU6wC,GAAaU,YAC5CjyB,GAAegW,EAAAA,GAAAA,iBAAgB,CACnCx1C,UAAWozD,GAAsBhC,EAAc,SAAW,gBAEtDxsC,GAASu1B,EAAAA,GAAAA,GACb3a,EACAgb,EAAazzC,GACb+rD,GAAY18C,KAAK/C,IAAC,CAAQ7N,MAAO6N,EAAEtM,GAAIlJ,MAAOwV,EAAE2pB,WAAa,IAC5D/b,IACCgyC,EAAgBH,EAAYA,EAAYvgB,WAAW7wB,GAASA,EAAK3a,KAAOka,EAAOzb,UAC/E6W,EAAS4E,EAAOzb,MAAO,SAAS,IAIpC,OACEvF,EAAAA,EAAAA,MAAA,OACEtB,UAAWE,IAAW,gBAAiB,CACrC0zD,KAAMa,GAAsBhC,EAC5B,YAAagC,IAAuBhC,IAAgB1xD,eAAekyD,qBAClEzxD,SAAA,EAEHF,EAAAA,EAAAA,MAAC+xD,GAAa,CACZ5xC,GAAIsf,GAAAA,eACJ5/B,MAAO0/B,EACPpJ,aAAa,WACb,cAAc,iBAAgB88B,WAC9BxxC,KAAM84B,EACNplB,OAAQxE,EACRO,SAAUA,EACV6L,MAAO+1B,EACPd,gBAAiBA,EACjBna,UAAWA,EACX93B,QAAUlE,IACRA,EAAG4C,iBACH5C,EAAGy9B,kBACHl9B,EAASm+B,EAAazzC,GAAI,QAAQ,EAClC5G,SAAA,EAEFvB,EAAAA,EAAAA,KAAC8wB,GAAAA,KAAI,CAACprB,KAAOssB,GAAY4pB,EAAakY,YAAelY,EAAa9kB,KAAM1nB,MAAO,GAAIrP,UAAU,cAC7FC,EAAAA,EAAAA,KAAC8wB,GAAAA,KAAI,CAACprB,KAAK,aAAa0J,MAAO,GAAIrP,UAAU,qBAG9Cq0D,GACCp0D,EAAAA,EAAAA,KAACk9C,GAAAA,EAAY,CACXt6B,MAAOsxC,EAAW18C,KAAKsL,IAAI,CAAQlc,MAAOkc,EAAK3a,GAAIlJ,MAAO6jB,EAAKsb,UAC/D3gB,SAAUuI,EAAO21B,aACjBv6B,QAASA,IAAM3D,EAASm+B,EAAazzC,GAAI,aAG3CnI,EAAAA,EAAAA,KAACq9C,GAAAA,EAAU,CACT1W,cAAe,CAAE/oC,QAAS8a,SAASM,MACnC9X,MAAO0/B,EACPnjB,SAAUuI,EAAO21B,aACjB,aAAYppB,GAAY8gC,EAAkBA,EAAkBc,EAC5D3e,aAAa,EACbI,wBAAwB,EAAKr0C,SAE5B2yD,EAAW18C,KAAKsL,IACf9iB,EAAAA,EAAAA,KAAC+iB,GAAAA,aAAY,CAEX0U,aAAaz3B,EAAAA,EAAAA,KAAC8wB,GAAAA,KAAI,CAACprB,KAAMod,EAAKgU,KAAM/2B,UAAU,kBAAkBqP,MAAO,KACvE,cAAc,iBAAgBklD,KAAWxxC,EAAK3a,KAAK5G,SAElDuhB,EAAKsb,OAJDtb,EAAK3a,UAWxB,CCpJO,SAASssD,GAAW50D,GAWoB,IAXnB,YAC1Bo0D,EAAW,UACX/a,EAAS,SACTlnB,EAAQ,WACRshC,EAAU,WACVY,EAAU,WACVC,EAAU,SACV12C,EAAQ,gBACR22C,EAAe,SACf7hC,EAAQ,gBACR8gC,GAC2CxzD,EAC3C,MAAM60D,EAAe1iC,IAAaO,EAElC,OAAM2hC,GAAYtzD,QAEdZ,EAAAA,EAAAA,KAACg0D,GAAY,CACXG,WAAYA,EACZD,WAAYA,EACZD,YAAaA,EACb1hC,SAAUA,EACVP,SAAU0iC,EACVxb,UAAWA,EACXz7B,SAAUA,EACV22C,gBAAiBA,EACjBf,gBAAiBA,KAMrBrzD,EAAAA,EAAAA,KAACozD,GAAa,CACZ,cAAc,gBAAea,EAAY9rD,KACzC2a,KAAMmxC,EACNz9B,OAAQk+B,EACRxb,UAAWA,EACXoa,WAAYA,EACZ/gC,SAAUA,EACV8gC,gBAAiBA,EACjBjyC,QAASA,KACP3D,EAASw2C,EAAY9rD,GAAI,SAAS,GAI1C,CCtCO,SAASwsD,GAAc90D,GAAqC,IAApC,UAAEE,GAAgCF,EAC/D,MAAM,UAAEoyB,EAAS,MAAE3Q,GAAUmxC,KAE7B,OACEzyD,EAAAA,EAAAA,KAAA,OACED,UAAWE,IACT,+BACA,CACE,gCAAiCgyB,IAAcmgC,GAAiBE,SAChE,mBAAoBrgC,IAAcmgC,GAAiBU,WACnD,OAAQ7gC,IAAcmgC,GAAiBE,UAAYhxC,IAAU6wC,GAAaU,YAC1E,SAAU5gC,IAAcmgC,GAAiBU,YAAcxxC,IAAU6wC,GAAaU,YAC9E,MAAO5gC,IAAcmgC,GAAiBU,YAAcxxC,IAAU6wC,GAAaU,aAE7E9yD,IAIR,C,mDCxBO,SAAS60D,GAAW/0D,GAA+B,IAA9B,KAAE2xD,GAA0B3xD,EACtD,OACEwB,EAAAA,EAAAA,MAAC2zB,GAAAA,GAAG,CAACj1B,UAAU,iBAAgBwB,SAAA,CAC5BiwD,EAAKpzB,QACJp+B,EAAAA,EAAAA,KAAC0B,GAAAA,QAAO,CAACC,MAAO,EAAG5B,UAAU,OAAMwB,SAChCiwD,EAAKpzB,QAGTozB,EAAKx4C,OAAQhZ,EAAAA,EAAAA,KAAC+gB,GAAAA,UAAS,CAAAxf,SAAEiwD,EAAKx4C,SAGrC,CCOA,IAAI67C,GACG98C,eAAe+8C,GAAoBC,GACxC,GAAIF,GAAiB,OAAOA,GAE5B,IACEE,GAAW,GACX,MAAMC,QAAwB,+BAI9B,OAHAH,GAAkBG,EAAgB3rC,QAClC0rC,GAAW,GAEJF,EACA,CAAP,MAAO,CACX,CAKA,MAAMI,GAAgBh1D,IAAW81B,EAAAA,kBAAmBE,EAAAA,oBAAqBC,EAAAA,WAAAA,QAAoBV,EAAAA,eAAAA,SAC7F,SAAS0/B,GAAeC,EAAqB3D,EAAgB1oC,EAAetX,GAC1E,MAAO,CACL,CACE4jD,OAAQD,EAAKE,SACbC,QAASr1D,IAAWg1D,GAAe,WAAW1+B,EAAAA,EAAAA,gBAAeD,EAAAA,YAAAA,OAAmBI,OAAQP,EAAAA,cAAAA,SACxFiM,KAAM,QAERtZ,EAAQ,GAAK,CACXssC,OAAQD,EAAKI,KACbD,QAASr1D,IAAWg1D,IAAe1+B,EAAAA,EAAAA,gBAAeD,EAAAA,YAAAA,OAAmBI,OAAQP,EAAAA,cAAAA,SAC7EiM,KAAMovB,EAAKgE,YAAc,QAE3B,CACEF,QAASr1D,IAAWg1D,IAAe1+B,EAAAA,EAAAA,gBAAeD,EAAAA,YAAAA,MAAkBI,OAAQP,EAAAA,cAAAA,SAC5Ei/B,OAAQD,EAAKM,KACbrzB,KAAMovB,EAAKkE,aAAe5sC,IAAUtX,EAAI5Q,OAAS,EAAI,SAAW,UAElEoB,OAAOue,QACX,CAKO,SAASo1C,GAAaR,EAAqBS,GAChD,OAAOA,EAAMp+C,KAAI,CAACg6C,EAAM1oC,KAAU,CAChC+sC,SAAU,CAAExzD,QAASmvD,EAAKpT,OAAQ0X,GAAItE,EAAKpwD,WAAa,QACxDk0D,QAAS,WAETS,cAAe,CACbnI,UAAW,CACT,CACEloD,KAAM,SACNqM,QAAS,CACP87C,OAAQ2D,EAAK3D,QAAU,CAAC,EAAG,QAMnCzrB,KAAM4zB,GAAAA,eAAwBlzD,EAAAA,cAAoB8xD,GAAa,CAAEpD,UAEjEz3B,QAASm7B,GAAeC,EAAM3D,EAAM1oC,EAAO8sC,GAC3CK,0BAA2BzE,EAAK0E,eAAiB,EACjDC,2BAA4B3E,EAAK4E,gBAAkB,KAEvD,CAEO,SAASC,KACd,MAAQ,OAAM/zD,OAAO4U,SAASsY,SAASpU,QAAQ,QAAS,MAC1D,CAEO,SAASk7C,GAAgBC,GAC9B,MAAMC,EAAmBC,aAAaC,QAAQL,MACxCM,EAAgBJ,EAAM5iB,WAAWwhB,GAASA,EAAKhtD,KAAOquD,IACtDI,EAAiBD,IAAkBJ,EAAM31D,OAAS,GAAK21D,EAAM77C,MAAMi8C,EAAgB,GAAGt2C,OAAOyC,GAASA,EAAK+zC,OAC3GC,EAAcF,EAAiBL,EAAQA,EAAM77C,MAAMi8C,EAAgB,GAazE,MAAO,CAAEI,aAAcH,EAAgBzB,KAZtB2B,EAAYl6C,QAC3B,CAAC8N,EAAK9sB,IACJA,EAAQi5D,KACJnsC,EACA,IACKA,EACHviB,GAAIvK,EAAQuK,GACZytD,MAAO,IAAIlrC,EAAIkrC,SAAUh4D,EAAQg4D,SAEzC,CAAEztD,GAAI,OAAQytD,MAAO,GAAIoB,YAAaF,EAAY,GAAG3uD,KAIzD,CAEO,SAAS8uD,GAAa5lD,GAC3BolD,aAAaS,QAAQb,KAAchlD,EACrC,CC3GO,MAAM8lD,GAAkB,CAC7BC,WAAW,EACXC,iBAAiB,GAaZ,SAASC,GAAQvlD,GACtB,MAAOmnC,EAAWqe,GAAgBz0D,EAAAA,UAAe,IAC1C00D,EAAaC,GAAW30D,EAAAA,SAAqC,MAM9DyoD,EAAazoD,EAAAA,OAAa,oBAAqBR,OAAS,IAAIkpD,qBAAoB3qD,GAChF62D,EAAgB50D,EAAAA,QAAc5B,IAC9BqqD,EAAW3tD,SAASiuD,OAAOC,SAE/ByL,EAAar2D,EAAM,IAGrB4B,EAAAA,WAAgB,IAAM,IAAMyoD,EAAW3tD,SAASmuD,SAAS,IAEzD,MAAM4L,EAAY70D,EAAAA,aAChBiV,eAAO6/C,GAAmD,IAAvBC,IAAWl3D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC5C,MAAMk0D,QAAwBiD,GAA8BJ,EAAc95D,SAE1E,GAAIi3D,IAAoBtJ,EAAW3tD,SAASiuD,OAAOC,QAAS,CAC1D,MAAMqJ,EAAOqC,GAAe,IAAI3C,EAAgBkD,KAAK,IAAKZ,MAAoBplD,IAEzEylD,GAAaC,EAAQtC,GAG1BvxD,MAAM+iB,KAAKwuC,EAAKS,OAAOtjD,SAASk/C,GAAS2D,EAAK6C,WAAWxG,EAAKrpD,MAE9D,MAAM8vD,EAAiBH,GAAuB3C,EAAMyC,EAAWhC,OAU/D,OATAT,EAAK+C,SAASD,GAEVJ,GACFC,GAAuBF,EAAWzvD,IAGpCgtD,EAAKjQ,QACL5iD,OAAOotB,OAAO,QAAS,aAAc,CAAEyoC,YAAaP,EAAWZ,aAAeY,EAAWzvD,KAElFgtD,CACT,CACF,GACA,CAACqC,EAAazlD,IAGhB,MAAO,CACLmnC,YACAse,cACAG,YACArB,gBAAiBwB,GACjBb,aAAca,GAElB,CCzCA,IAAwBM,GAAU/mD,GAAV+mD,GAsCT91D,QAtCmB+O,GAsCX,WArCR+mD,KAAMA,GAAI/mD,IAAO,CAAC,GAE/B+mD,GAAI/mD,IAAKgnD,WAAa,IACjB3hC,KACA4hC,KACAC,KACAC,KACAC,KACAC,KACAC,MACAC,KACAC,MACAC,KACAC,KACAjiC,MACAm3B,KACA7nC,MACA4yC,MACA3kB,MACAzQ,MACA/a,KACA1R,MACA6O,MACAizC,MACA35D,KACA45D,MACAC,KACA7wD,MACA8wD,MACAjE,KACAkE,MACAn3C,KACAo3C,KACAC,G,wCCtBPC,MAAMC,eAAiBA,EACvBD,MAAMjtC,iBAAmBA,EAAAA,GACzBitC,MAAMxqC,mBAAqBA,EAAAA,EAC3BwqC,MAAMx9C,kBAAoBA,EAAAA,EAC1Bw9C,MAAM/8C,kBAAoBA,EAAAA,EAC1B+8C,MAAMr1D,uBAAyBA,EAAAA,GAC/Bq1D,MAAM1pC,qBAAuBA,EAAAA,GAC7B0pC,MAAM1Q,oBAAsBA,GAAAA,EAC5B0Q,MAAMjN,iBAAmBA,GAAAA,EACzBiN,MAAMvpC,+BAAiCA,EAAAA,GACvCupC,MAAM/C,aAAeA,GACrB+C,MAAM5lD,GAAK,CAAE2E,IAAG,MAAEmhD,KAAI,MAAEC,YAAW,MAAEC,YAAWA,EAAAA,KAChDJ,MAAMK,QAAU,CACdzvB,IAAG,IACH0vB,gBAAe,IACfC,yBAAwB,IACxBC,kBAAiB,IACjBC,SAAQ,IACRC,mBAAkB,IAClBC,YAAW,IACXC,WAAU,IACV1rC,UAAS,IACT2rC,iBAAgB,IAChBC,WAAU,IACVC,YAAW,IACXC,IAAG,IACHC,UAAS,IACTC,SAAQA,EAAAA,GAEVlB,MAAMmB,OAAS,CACbC,KAAI,EACJC,W,m9BCnEF,MAAMC,EAAY,UAEX,SAAS31C,EAOdlkB,GACA,MAAM,SAAE+wB,EAAQ,iBAAE+oC,IAAqBC,EAAAA,EAAAA,OAChCr9C,EAAUC,GAAe9a,EAAAA,SAAe7B,EAAMggB,MAAMnD,OAAS,IAC9DD,EAAa/a,EAAAA,aAChBoa,IACC69C,GAAiB,GACjB,MAAMj9C,EAAQZ,EAAGxG,cAAcqH,cAE3BD,EAAQ,GAAK7c,EAAMmc,QAAQU,OAAO7c,EAAMqc,WAAWF,IAAM,IAAWA,EAAQU,OAAO,MACnFA,EAAQg9C,GACZ75D,EAAM8B,UAAUke,IAAK,IAAWA,EAAOnD,WAAS,GAElD,CAAC7c,EAAO85D,IAGJn0D,GAAQq0D,EAAAA,EAAAA,IAAeh6D,EAAMggB,MAAMnD,OACnCo9C,EAAah9C,MAAMtX,GAEzB,IAAIoX,EACA/c,EAAMmc,QAAQU,OAASkU,IACrBkpC,IAAYl9C,EAAiB,kBAC7BpX,GAAS,GAAyB,iBAAb+W,KAAuBK,EAAiB,mDAGnE,MAAMm9C,EAAYl6D,EAAMmc,QAAQU,QAAUI,MAAM1K,OAAOmK,KAAcnK,OAAOmK,IAAa,GAAkB,KAAbA,GAO9F,OALA7a,EAAAA,WAAgB,KACd,MAAMmb,GAAag9C,EAAAA,EAAAA,IAAeh6D,EAAMggB,MAAMnD,OACzCI,MAAMD,IAAaL,EAAYK,EAAW,GAC9C,CAAChd,EAAMggB,MAAMnD,SAGd9d,EAAAA,EAAAA,KAACme,EAAAA,aAAY,CACXC,sBAAsB,EACtB1Y,KAAK,iBACLzG,MAAOgC,EAAMhC,MACbwjB,kBAAmBxhB,EAAMwhB,kBACzBC,eAAgBzhB,EAAMyhB,eACtB5jB,KAAK,SACLuiB,KAAMpgB,EAAMogB,KACZ/C,MAAO68C,EACP98C,mBAAmB,EACnBnX,IAAK,EACLqR,IAAKuiD,EACL93C,UAAW,EACXkc,WAAY3gB,IAAWtd,EAAMikB,eAAgB,eAAgB,CAAE,cAAejkB,EAAMikB,iBACpFte,MAAO+W,EACPF,SAAWP,IACT,IAA6B,IAAzBjc,EAAMm6D,eAA0B,CAClC,MAAMC,EAAcn+C,EAAGxG,cAAcqH,cACrC9c,EAAM8B,UAAUke,IAAK,IAAWA,EAAOnD,MAAOu9C,KAChD,CACAz9C,EAAYV,EAAGxG,cAAc9P,MAAM,EAErC4X,OAAQX,EACR5J,KAAMhT,EAAMgT,KACZwK,aAAa,MACbwqC,gBAAiB,CAAEpgB,gBAAiB,CAAC,GAAI,KACzC7qB,eAAgBm9C,EAAYn9C,OAAiBnd,EAC7Cd,UAAWwe,IAAWtd,EAAMlB,UAAW,CAAE,WAAYkB,EAAMmc,QAAQU,QACnEY,cAAesT,EACf+rB,QAASA,IAAMgd,GAAiB,IAGtC,C,2MCpDO,SAASO,EACdr6D,GAEA,MAAMs6D,GAAc16B,EAAAA,EAAAA,mBACd26B,GAAsBp4B,EAAAA,EAAAA,wBAAuBm4B,GAC7CE,GAAet6D,EAAAA,EAAAA,iBAAgB,CAAEC,UAAW,MAAOynC,gBAAiB,EAAE,EAAG,MACzE6yB,GAAuBt4B,EAAAA,EAAAA,wBAAuBq4B,GAC9C/mB,EAAmBzzC,EAAMmc,QAAQ/Y,KAAO7C,EAAAA,eAAiBsB,EAAAA,SACzD64D,EAAe16D,EAAMmc,QAAQ/Y,KAC/B,CACEnD,MAAOu6D,EACP7gC,UAAW,EACXsuB,sBAAsB,GAExB,CAAC,EAEC0S,GAA8BJ,EAAoBr4B,gBAAkBu4B,EAAqBv4B,cAC/FrgC,EAAAA,WAAgB,KACd7B,EAAMq7C,sBAAsBsf,EAA2B,GAGtD,CAAC36D,EAAMq7C,sBAAuBsf,IAKjC,MAAMC,EAAe/4D,EAAAA,QAAcg5D,IAEjC,MAAMC,GAAaC,EAAAA,EAAAA,IAAiB,CAAE51C,MAAO01C,IAE7C,GAAyB,iBAAdA,IAA2B/0D,EAAAA,EAAgBg1D,GAEpD,YADA96D,EAAM8B,UAAUke,IAAK,IAAWA,EAAO5c,KAAMy3D,MAI/C,MAAMz3D,EAAO0C,EAAAA,EAAeg1D,EAAY34C,EAAAA,IACxCniB,EAAMqc,WAAWF,GAAYA,EAAO/Y,KAAO,IAAK+Y,EAAQ/Y,MAAM,GAAU+Y,IACxEnc,EAAM8B,UAAUke,IAAK,IAAWA,EAAO5c,WACvCo3D,EAAax6B,MAAM,IAMfpjB,EAAa/a,EAAAA,QAAa,KAC9B,MAAMuB,GAAO23D,EAAAA,EAAAA,IAAiB,CAAE51C,MAAOnlB,EAAMggB,MAAM5c,MAAQ,KACvD0C,EAAAA,EAAgB1C,IAClBpD,EAAMqc,WAAWF,GAAYA,EAAO/Y,KAAO,IAAK+Y,EAAQ/Y,MAAM,GAAU+Y,GAC1E,IAGF,OACE/b,EAAAA,EAAAA,MAACqzC,EAAgB,IAAMinB,EAAYp6D,SAAA,EACjCvB,EAAAA,EAAAA,KAACijC,EAAAA,oBAAmB,CAAC/hC,MAAOq6D,EAAa30D,MAAO3F,EAAM2F,MAAMq1D,OAAQx+C,SAAUo+C,EAAaj+D,QAAQ2D,SAChGuB,EAAAA,aAAwC7B,EAAMi7D,aAAc,CAC3Dz+C,SAAWP,GAAO2+C,EAAaj+D,QAAQsf,EAAGxG,cAAc9P,OACxD+zB,UAAWA,IAAM4gC,EAAYt6B,OAC7BziB,OAAQX,EAAWjgB,aAGrB89D,EAAqBv4B,gBACrBnjC,EAAAA,EAAAA,KAACyB,EAAAA,QAAO,CAACP,MAAOu6D,EAActtD,MAAM,MAAMpO,UAAU,WAAUwB,SAAC,4DAMvE,CAEO,SAASyjB,EACd/jB,GAEA,MAAM,SAAE+wB,EAAQ,iBAAE+oC,IAAqBC,EAAAA,EAAAA,MAKjCp0D,EAAQ9D,EAAAA,SAAc,KAC1B,IACE,MAAMi5D,GAAaC,EAAAA,EAAAA,IAAiB,CAClC51C,MAAOnlB,EAAMggB,MAAM5c,MAAQ,GAC3BgC,OAAQ+c,EAAAA,GACR+4C,aAAa,IAGf,MAAO,CACL/1C,MAAOrf,EAAAA,EAAeg1D,EAAYK,EAAAA,IAClCH,OAAQF,EAOZ,CALE,MACA,MAAO,CACL31C,MAAOnlB,EAAMggB,MAAM5c,KACnB43D,OAAQ,IAAI33D,KAEhB,IACC,CAACrD,EAAMggB,MAAM5c,OAEV63D,GACJl8D,EAAAA,EAAAA,KAAC2/B,EAAAA,MAAK,CACJvhB,sBAAsB,EACtB1Y,KAAK,OACLzG,MAAOgC,EAAMhC,MACbwjB,kBAAmBxhB,EAAMwhB,kBACzBC,eAAgBzhB,EAAMyhB,eACtB5jB,KAAK,OACLuiB,KAAMpgB,EAAMogB,KACZthB,UAAWwe,IAAWtd,EAAMlB,UAAW,CAAE,WAAYkB,EAAMmc,QAAQ/Y,OACnE66B,WAAW,yBACXt4B,MAAOA,EAAMwf,MACb3I,SAAUA,OACVa,MAAOrd,EAAMmc,QAAQ/Y,KACrB4P,KAAMhT,EAAMgT,KACZ+O,UA/HkB,GAgIlB,cAAY,eAIhB,OAAIgP,GAEAhyB,EAAAA,EAAAA,KAACs7D,EAAwB,CACvBY,aAAcA,EACdt1D,MAAOA,EACP01C,sBAAuBye,KACnB95D,IAKHi7D,CACT,C,+HCtJA,MAAMG,EAAa,UAEZ,SAASp3C,EAOdhkB,GACA,MAAM,SAAE+wB,EAAQ,iBAAE+oC,IAAqBC,EAAAA,EAAAA,OAChCr9C,EAAUC,GAAe9a,EAAAA,SAAe7B,EAAMggB,MAAMoC,QAAU,IAC/DxF,EAAa/a,EAAAA,aAChBoa,IACC69C,GAAiB,GACjB,MAAM13C,EAASnG,EAAGxG,cAAcqH,cAE5BsF,GAAU,GAAKpiB,EAAMmc,QAAQiG,QAAQpiB,EAAMqc,WAAWF,IAAM,IAAWA,EAAQiG,QAAQ,MACvFA,EAASg5C,GACbp7D,EAAM8B,UAAUke,IAAK,IAAWA,EAAOoC,YAAU,GAEnD,CAACpiB,EAAO85D,IAGJn0D,GAAQq0D,EAAAA,EAAAA,IAAeh6D,EAAMggB,MAAMoC,QACnC63C,EAAah9C,MAAMtX,GAEzB,IAAIoX,EACA/c,EAAMmc,QAAQiG,QAAU2O,IACtBkpC,IAAYl9C,EAAiB,6BAC7BpX,EAAQ,GAAyB,iBAAb+W,KAAuBK,EAAiB,mDAGlE,MAAMm9C,EAAYl6D,EAAMmc,QAAQiG,SAAWnF,MAAM1K,OAAOmK,KAAcnK,OAAOmK,IAAa,GAAkB,KAAbA,GAO/F,OALA7a,EAAAA,WAAgB,KACd,MAAMw5D,GAAcrB,EAAAA,EAAAA,IAAeh6D,EAAMggB,MAAMoC,QAC1CnF,MAAMo+C,IAAc1+C,EAAY0+C,EAAY,GAChD,CAACr7D,EAAMggB,MAAMoC,UAGdrjB,EAAAA,EAAAA,KAACme,EAAAA,aAAY,CACXC,sBAAsB,EACtB1Y,KAAK,SACLzG,MAAOgC,EAAMhC,MACbwjB,kBAAmBxhB,EAAMwhB,kBACzBC,eAAgBzhB,EAAMyhB,eACtBrB,KAAMpgB,EAAMogB,KACZhD,mBAAmB,EACnBC,MAAO68C,EACPj0D,IAAK,EACLqR,IAAK8jD,EACLr5C,UAAW,EACXlkB,KAAK,SACLiB,UAAWwe,IAAWtd,EAAMlB,UAAW,CAAE,WAAYkB,EAAMmc,QAAQiG,SACnE6b,WAAY3gB,IAAWtd,EAAMikB,eAAgB,eAAgB,CAAE,cAAejkB,EAAMikB,iBACpFte,MAAO+W,EACPF,SAAWP,IACT,IAA6B,IAAzBjc,EAAMm6D,eAA0B,CAClC,MAAMC,EAAcn+C,EAAGxG,cAAcqH,cACrC9c,EAAM8B,UAAUke,IAAK,IAAWA,EAAOoC,OAAQg4C,KACjD,CACAz9C,EAAYV,EAAGxG,cAAc9P,MAAM,EAErC4X,OAAQX,EACR5J,KAAMhT,EAAMgT,KACZwK,aAAa,MACbwqC,gBAAiB,CAAEpgB,gBAAiB,CAAC,GAAI,KACzC7qB,eAAgBm9C,EAAYn9C,OAAiBnd,EAC7C6d,cAAesT,EACf+rB,QAASA,IAAMgd,GAAiB,IAGtC,C,oHCxEO,SAAS/5C,EAOd/f,GACA,MAAM,SAAE+wB,EAAQ,iBAAE+oC,IAAqBC,EAAAA,EAAAA,MACjC/9C,EAAena,EAAAA,aAClBoa,IACC,MAAM0B,EAAS1B,EAAGxG,cAAc9P,MAC5BgY,EAAOqB,OAAOrf,QAAU,GAAKK,EAAMmc,QAAQwB,QAAQ3d,EAAMqc,WAAWF,IAAM,IAAWA,EAAQwB,QAAQ,MACzG3d,EAAM8B,UAAUke,IAAK,IAAWA,EAAOrC,YAAU,GAEnD,CAAC3d,IAGH,IAAI+c,EAKJ,OAJI/c,EAAMmc,QAAQwB,QAAUoT,IAC1BhU,EAA+C,IAA9B/c,EAAMggB,MAAMrC,OAAOhe,OAAe,iBAAmB,mBAItEZ,EAAAA,EAAAA,KAACme,EAAAA,aAAY,CACXC,sBAAsB,EACtB1Y,KAAK,SACLzG,MAAOgC,EAAMhC,MACbwjB,kBAAmBxhB,EAAMwhB,kBACzBC,eAAgBzhB,EAAMyhB,eACtBrB,KAAMpgB,EAAMogB,KACZ/C,MAAOrd,EAAMmc,QAAQwB,OACrB7e,UAAWwe,IAAWtd,EAAMlB,UAAW,CAAE,WAAYkB,EAAMmc,QAAQwB,SACnEhY,MAAO3F,EAAMggB,MAAMrC,OACnBnB,SAAUR,EACVhJ,KAAMhT,EAAMgT,KACZwK,aAAa,MACbwqC,gBAAiB,CAAEpgB,gBAAiB,CAAC,GAAI,KACzC7qB,eAAgBA,EAChBgF,UAzCoB,GA0CpBtE,cAAesT,EACf+rB,QAASA,IAAMgd,GAAiB,GAChCv8C,OAAQA,IAAMu8C,GAAiB,IAGrC,C,+HCxCO,SAASj2C,EAAqBjlB,GAYiB,IAJpD,aACAykB,EAAY,gBACZS,EAAkB,CAAEhlB,UAAW,eAC5BkB,GAC+CpB,EAClD,MAAM,SAAEmyB,EAAQ,iBAAE+oC,IAAqBC,EAAAA,EAAAA,MACjCuB,EAAqBz5D,IAAAA,SAAoC,KAC7D,GAAIwhB,GAAc1jB,OAAQ,OAAO0jB,EACjC,MAAMk4C,GAAaC,EAAAA,EAAAA,IAAcx7D,EAAMggB,MAAMrC,QAG7C,OAFgB2E,EAAAA,EAAAA,IAA6Bi5C,GAE9BhlD,KAAK5Q,IAAK,CAAQ3H,MAAOwkB,EAAAA,GAAkB7c,GAAQA,WAAS,GAC1E,CAAC3F,EAAMggB,MAAMrC,OAAQ0F,IAExB,OACEjjB,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAC,SAAA,EACEvB,EAAAA,EAAAA,KAAA,SAAOqhB,KAAMpgB,EAAMogB,KAAMviB,KAAK,SAAS8H,MAAO3F,EAAMggB,MAAMiC,cACzD8O,GACChyB,EAAAA,EAAAA,KAACwiB,EAAAA,OAAM,CACL,aAAW,cACXziB,UAAWkB,EAAMlB,UACjBd,MAAOgC,EAAMhC,MACbwjB,kBAAmBxhB,EAAMwhB,kBACzBC,eAAgBzhB,EAAMyhB,eACtB9b,MAAO3F,EAAMggB,MAAMiC,YACnBN,MAAO25C,EACP9+C,SAAWqF,GAAS7hB,EAAM8B,UAAUke,IAAK,IAAWA,EAAOiC,YAAaJ,EAAKlc,UAC7E+b,UAAWoC,EACX9Q,KAAMhT,EAAMgT,KACZ,cAAY,qBACZqoC,sBAAuBye,EAAiBx5D,SAEvCg7D,EAAmB/kD,KAAKsL,IACvB9iB,EAAAA,EAAAA,KAAC+iB,EAAAA,aAAY,CAAkB,cAAc,sBAAqBD,EAAKlc,QAAQrF,SAC5EuhB,EAAK7jB,OADW6jB,EAAKlc,YAM5B5G,EAAAA,EAAAA,KAACs9C,EAAAA,kBAAiB,CAChBv9C,UAAWkB,EAAMlB,UACjBkU,KAAMhT,EAAMgT,KACZwoC,cACE8f,EAAmB70D,MAAK2gB,IAAA,IAAC,MAAEzhB,GAAOyhB,EAAA,OAAKzhB,IAAU3F,EAAMggB,MAAMiC,WAAW,KAAGjkB,OAC3Es9D,EAAmB,GAAGt9D,UAMlC,C,oFC5DO,MAAMy9D,EAA8B55D,EAAAA,cAAsD,CAC/FkvB,UAAU,EACV+oC,iBAAkBA,OAClB4B,YAAaA,SAOR,SAAS3B,IACd,OAAOl4D,EAAAA,WAAiB45D,EAC1B,CAUO,MAAMj9C,EAAsC5f,IAGH,IAHI,SAClD0B,EAAQ,wBACRme,GAA0B,GACe7f,EACzC,MAAO+8D,EAAe7B,GAAoBj4D,EAAAA,UAAe,IAClD+5D,EAAUF,GAAe75D,EAAAA,UAAe,GAE/C,OACE9C,EAAAA,EAAAA,KAAC08D,EAA4B90B,SAAQ,CACnChhC,MAAO,CAAEorB,SAAUtS,GAA2Bk9C,GAAiBC,EAAU9B,mBAAkB4B,eAAcp7D,SAExGA,GACoC,C,oJCrCpC,MAAM4tD,EAAqDxmD,OAAOm0D,OAAO,CAC9E,CAAC7N,EAAAA,GAAAA,QAAkB,CACjB9mD,GAAI8mD,EAAAA,GAAAA,OACJ8N,QAAS,GACTr3D,KAAM,GACN2rD,aAAcA,IAAM,MAEtB,CAACpC,EAAAA,GAAAA,QAAkB,CACjB9mD,GAAI8mD,EAAAA,GAAAA,OACJ8N,QAAS,SACTr3D,KAAM,SACNgsB,MAAOJ,EAAAA,GAAAA,KACP+/B,aAAe2L,IACb,OAAQA,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,YACL,KAAKA,EAAAA,GAAAA,QACH,OAAO,KACT,KAAKA,EAAAA,GAAAA,MACL,KAAKA,EAAAA,GAAAA,MACH,OAAIyN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,OAA8Bw5C,EAAKvlD,IAAIwlD,YAYtDj9D,EAAAA,EAAAA,KAAA,QAAAuB,SAAOy7D,EAAKvlD,IAAImH,UAVnB5e,EAAAA,EAAAA,KAAA,KACEyhB,KAAO,iBAAgBu7C,EAAKvlD,IAAImH,SAChC7e,UAAU,2CACVqhB,QAAUlE,GAAOA,EAAGy9B,kBAAkBp5C,SAErCy7D,EAAKvlD,IAAImH,SAMlB,QACE,OAAO5e,EAAAA,EAAAA,KAAA,QAAAuB,SAAOy7D,EAAKvlD,IAAImH,SAC3B,GAGJ,CAACqwC,EAAAA,GAAAA,SAAmB,CAClB9mD,GAAI8mD,EAAAA,GAAAA,QACJ8N,QAAS,UACTr3D,KAAM,UACNgsB,MAAOJ,EAAAA,GAAAA,KACP+/B,aAAe2L,IACb,OAAQA,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,YACH,OAAO,KACT,KAAKA,EAAAA,GAAAA,QACH,OACEluD,EAAAA,EAAAA,MAAA,QAAMtB,UAAU,iCAAgCwB,SAAA,CAAC,WACtC,KACTF,EAAAA,EAAAA,MAAA,QAAMtB,UAAU,qBAAoBwB,SAAA,CACjCy7D,EAAKvlD,IAAIwD,QAAQ,UAA6B,IAArB+hD,EAAKvlD,IAAIwD,QAAgB,GAAK,QAE1Djb,EAAAA,EAAAA,KAAA,QAAMD,UAAU,uBAAsBwB,SAAC,SACvCF,EAAAA,EAAAA,MAAA,QAAMtB,UAAU,sBAAqBwB,SAAA,CAClCy7D,EAAKvlD,IAAI6M,aAAa,eAAuC,IAA1B04C,EAAKvlD,IAAI6M,aAAqB,GAAK,UAI/E,QACE,OAAOtkB,EAAAA,EAAAA,KAAA,OAAKD,UAAU,wBAAuBwB,SAAEy7D,EAAKvlD,IAAII,UAC5D,GAGJ,CAACo3C,EAAAA,GAAAA,SAAmB,CAClB9mD,GAAI8mD,EAAAA,GAAAA,QACJ8N,QAAS,UACTr3D,KAAM,YACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,IACb,GAAIA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,KAA0B,OAAO,KAExF,OAAQw5C,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,YACL,KAAKA,EAAAA,GAAAA,QACH,OAAO,KACT,KAAKA,EAAAA,GAAAA,MACH,OAAIyN,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,MAAmC,MACzD+5C,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAI0lD,SAE/B,QACE,OAAOD,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAI0lD,SACjC,GAGJ,CAAClO,EAAAA,GAAAA,WAAqB,CACpB9mD,GAAI8mD,EAAAA,GAAAA,UACJ8N,QAAS,QACTr3D,KAAM,QACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,IACb,GAAIA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,KAA0B,OAAO,KAExF,OAAQw5C,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,YACL,KAAKA,EAAAA,GAAAA,QACH,OAAO,KACT,QACE,OAAO2N,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIsM,WACjC,GAGJ,CAACkrC,EAAAA,GAAAA,YAAsB,CACrB9mD,GAAI8mD,EAAAA,GAAAA,WACJ8N,QAAS,aACTr3D,KAAM,WACNgsB,MAAOJ,EAAAA,GAAAA,MACP26B,gBAAkB+Q,GAAUA,EAAKvW,OAAS8I,EAAAA,GAAAA,MAAgByN,EAAKvlD,IAAIsM,UAAYi5C,EAAKvlD,IAAI2lD,UAAY,KACpG/L,aAAe2L,IACb,OAAQA,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,YACL,KAAKA,EAAAA,GAAAA,QACH,OAAO,KACT,QACE,GAAIyN,EAAKvlD,IAAIwlD,WAAY,MAAO,IAEhC,MAAMI,EAAaL,EAAKvlD,IAAIsM,UAAYi5C,EAAKvlD,IAAI2lD,UACjD,OACEp9D,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOy2D,EAAY1sC,aAAc,KAAKpvB,UACjD27D,EAAAA,EAAAA,IAAaG,EAAY,CACxBC,cAAc,EACdC,UAAWP,EAAKvlD,IAAIsM,UAAY,EAAI,EAAI,MAIlD,GAGJ,CAACkrC,EAAAA,GAAAA,eAAyB,CACxB9mD,GAAI8mD,EAAAA,GAAAA,cACJ8N,QAAS,YACTr3D,KAAM,WACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,MAE/Cw5C,EAAKvW,OACN8I,EAAAA,GAAAA,YAHiF,MAOlFvvD,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAI+lD,cAAe7sC,aAAyC,OAA3BqsC,EAAKvlD,IAAI+lD,cAAyB,KAAO,IAAIj8D,UACrG27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAI+lD,cAAe,CAAEF,cAAc,OAMlE,CAACrO,EAAAA,GAAAA,YAAsB,CACrB9mD,GAAI8mD,EAAAA,GAAAA,WACJ8N,QAAS,SACTr3D,KAAM,SACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,IACb,GAAIA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,KAA0B,OAAO,KAExF,OAAQw5C,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,MACL,KAAKA,EAAAA,GAAAA,MACH,OAAO2N,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIgmD,WAAY,CAAEF,UAAW,IACxD,QACE,OAAO,KACX,GAGJ,CAACtO,EAAAA,GAAAA,aAAuB,CACtB9mD,GAAI8mD,EAAAA,GAAAA,YACJ8N,QAAS,cACTr3D,KAAM,cACNgsB,MAAOJ,EAAAA,GAAAA,KACP+/B,aAAe2L,IACb,OAAQA,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,YACL,KAAKA,EAAAA,GAAAA,MACH,OAAO9rC,EAAAA,GAAkBu5C,EAAKvlD,IAAIyL,aACpC,QACE,OAAO,KACX,GAGJ,CAAC+rC,EAAAA,GAAAA,MAAgB,CACf9mD,GAAI8mD,EAAAA,GAAAA,KACJ8N,QAAS,OACTr3D,KAAM,OACNgsB,MAAOJ,EAAAA,GAAAA,KACP+/B,aAAe2L,IACb,OAAQA,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,YACL,KAAKA,EAAAA,GAAAA,MACH,OACEvvD,EAAAA,EAAAA,KAAA,OACED,UAAWwe,IAAW,oBAAqB,CACzC,mBAAoBy+C,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,QAC5C5hB,SAEFwF,EAAAA,EAAe,IAAIzC,KAAK04D,EAAKvlD,IAAIpT,MAAO+3D,EAAAA,MAG/C,QACE,OAAO,KACX,GAGJ,CAACnN,EAAAA,GAAAA,QAAkB,CACjB9mD,GAAI8mD,EAAAA,GAAAA,OACJ8N,QAAS,SACTr3D,KAAM,SACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,IACb,GAAIA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,KAA0B,OAAO,KAExF,OAAQw5C,EAAKvW,MACX,KAAK8I,EAAAA,GAAAA,QACH,OAAO,KACT,KAAKA,EAAAA,GAAAA,MACH,OAAIyN,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,MAAmC,MACzD+5C,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAI4L,OAAQ,CAAEk6C,UAAW,IAEpD,QACE,OAAOL,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAI4L,OAAQ,CAAEk6C,UAAW,IACtD,GAGJ,CAACtO,EAAAA,GAAAA,OAAiB,CAChB9mD,GAAI8mD,EAAAA,GAAAA,MACJ8N,QAAS,OACTr3D,KAAM,eACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,KAAiC,KAEhFw5C,EAAKvW,OACN8I,EAAAA,GAAAA,aACI2N,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIqG,OAEtB,MAIf,CAACmxC,EAAAA,GAAAA,WAAqB,CACpB9mD,GAAI8mD,EAAAA,GAAAA,UACJ8N,QAAS,YACTr3D,KAAM,aACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,MACnDw5C,EAAKvW,OAAS8I,EAAAA,GAAAA,OAAiByN,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,MAD4B,MAEjF+5C,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIimD,YAGjC,CAACzO,EAAAA,GAAAA,QAAkB,CACjB9mD,GAAI8mD,EAAAA,GAAAA,OACJ8N,QAAS,SACTr3D,KAAM,SACNgsB,MAAOJ,EAAAA,GAAAA,MACP26B,gBAAkB+Q,GAASA,EAAKvlD,IAAIimD,UACpCrM,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,OAAiByN,EAAKvW,OAAS8I,EAAAA,GAAAA,YAA4B,MACtE2N,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIqG,QAGjC,CAACmxC,EAAAA,GAAAA,aAAuB,CACtB9mD,GAAI8mD,EAAAA,GAAAA,YACJ8N,QAAS,cACTr3D,KAAM,eACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,OAAiByN,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,MAAmC,MACxF+5C,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIkmD,cAGjC,CAAC1O,EAAAA,GAAAA,eAAyB,CACxB9mD,GAAI8mD,EAAAA,GAAAA,cACJ8N,QAAS,UACTr3D,KAAM,eACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,MACnDw5C,EAAKvW,OAAS8I,EAAAA,GAAAA,OAAiByN,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,MAD4B,MAGtFnjB,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAImmD,cAAejtC,aAAc,KAAKpvB,UAC7D27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAImmD,kBAK/B,CAAC3O,EAAAA,GAAAA,eAAyB,CACxB9mD,GAAI8mD,EAAAA,GAAAA,cACJ8N,QAAS,UACTr3D,KAAM,eACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,MACnDw5C,EAAKvW,OAAS8I,EAAAA,GAAAA,OAAiByN,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,MAD4B,MAGtFnjB,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAIomD,cAAeltC,aAAyC,OAA3BqsC,EAAKvlD,IAAIomD,cAAyB,KAAO,IAAIt8D,UACrG27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIomD,kBAK/B,CAAC5O,EAAAA,GAAAA,oBAA8B,CAC7B9mD,GAAI8mD,EAAAA,GAAAA,mBACJ8N,QAAS,aACTr3D,KAAM,aACNgsB,MAAOJ,EAAAA,GAAAA,MACP26B,gBAAkB+Q,GAASA,EAAKvlD,IAAIomD,cACpCxM,aAAe2L,IACb37D,EAAAA,EAAAA,MAAC0vB,EAAAA,EAAiB,CAAAxvB,SAAA,EAChBvB,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAImmD,cAAcr8D,UAAE27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAImmD,kBACpE59D,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAIomD,cAAeltC,aAAyC,OAA3BqsC,EAAKvlD,IAAIomD,cAAyB,KAAO,IAAIt8D,UACrG27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIomD,qBAK/B,CAAC5O,EAAAA,GAAAA,cAAwB,CACvB9mD,GAAI8mD,EAAAA,GAAAA,aACJ8N,QAAS,YACTr3D,KAAM,iBACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAe2L,GACTA,EAAKvW,OAAS8I,EAAAA,GAAAA,SAAmByN,EAAKvlD,IAAI3Y,OAAS0kB,EAAAA,GAAAA,MACnDw5C,EAAKvW,OAAS8I,EAAAA,GAAAA,OAAiByN,EAAKvlD,IAAIyL,cAAgBC,EAAAA,GAAAA,MAD4B,MAGtFnjB,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAIqmD,aAAcntC,aAAc,KAAKpvB,UAC5D27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIqmD,iBAK/B,CAAC7O,EAAAA,GAAAA,mBAA6B,CAC5B9mD,GAAI8mD,EAAAA,GAAAA,kBACJ8N,QAAS,YACTr3D,KAAM,eACNgsB,MAAOJ,EAAAA,GAAAA,MACP26B,gBAAkB+Q,GAASA,EAAKvlD,IAAI+lD,cACpCnM,aAAe2L,IACb37D,EAAAA,EAAAA,MAAC0vB,EAAAA,EAAiB,CAAAxvB,SAAA,EAChBvB,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAIqmD,aAAav8D,UAAE27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAIqmD,iBACnE99D,EAAAA,EAAAA,KAAC0wB,EAAAA,EAAY,CAAC9pB,MAAOo2D,EAAKvlD,IAAI+lD,cAAe7sC,aAAa,IAAGpvB,UAC1D27D,EAAAA,EAAAA,IAAaF,EAAKvlD,IAAI+lD,qBAK/B,CAACvO,EAAAA,GAAAA,OAAiB,CAChB9mD,GAAI8mD,EAAAA,GAAAA,MACJ8N,QAAS,QACTr3D,KAAM,QACNgsB,MAAOJ,EAAAA,GAAAA,MACP+/B,aAAcA,IAAM,QAID1oD,OAAOC,OAAOumD,E,uMCxW9B,MAAM4O,EAAwB,QAExB3B,EAA6B,aAC7Bh5C,EAA6B,wBAE7B46C,EAAmC,IACnCC,EAAkC,IAElCx6C,EAA0D,CACrE,CAACN,EAAAA,GAAAA,OAA6B,QAG9B,CAACA,EAAAA,GAAAA,KAA2B,MAC5B,CAACA,EAAAA,GAAAA,OAA6B,aAG9B,CAACA,EAAAA,GAAAA,aAAmC,eACpC,CAACA,EAAAA,GAAAA,cAAoC,gBACrC,CAACA,EAAAA,GAAAA,YAAkC,SACnC,CAACA,EAAAA,GAAAA,SAA+B,OAGrB+6C,EAAqB,CAAC/6C,EAAAA,GAAAA,IAA0BA,EAAAA,GAAAA,OAEhDg7C,EAAoB,CAC/Bh7C,EAAAA,GAAAA,YACAA,EAAAA,GAAAA,aACAA,EAAAA,GAAAA,WACAA,EAAAA,GAAAA,SAGWi7C,EAAmB,CAC9Bx/C,OAAQ,GACRva,KAAO,GAAE0C,EAAAA,EAAe,IAAIzC,KAAQ8e,KACpCC,YAAQxiB,EACRid,WAAOjd,EACPqiB,YAAaC,EAAAA,GAAAA,KAGFk7C,EAA2D,IACnED,EACH/6C,OAAQ,EACRvF,MAAO,EACPhf,KAAM0kB,EAAAA,GAAAA,MACNk6C,UAAW,KACXC,YAAa,KACbW,gBAAiB,KACjBC,WAAY,KACZV,cAAe,KACfD,cAAe,KACfE,aAAc,KACdN,cAAe,MAGJgB,EAAuB,iBACvBC,EAA8B,+BAC9BC,EAA+B,2CAC/BC,EAAqB,UACrBC,EAA2B,+D,sNCjDjC,MAAMC,EAAoC,CAC/CC,MAAO,EACPnP,kBAAmB,EACnBprC,kBAAmB,EACnBrC,UAAW,GACXrD,KAAM,GACN0D,WAAY,IAGP,SAASw8C,EAAcz8C,GAC5B,OAAO08C,EAAAA,EAAAA,IAA8B,2BAA4B,CAAEpmD,MAAO,CAAE4L,IAAKlC,GAAe,KAClG,CAEO,SAAS28C,EAAgB38C,GAC9B,OAAO08C,EAAAA,EAAAA,IAAW,iCAAkC,CAAEpmD,MAAO,CAAE4L,IAAKlC,IACtE,CAEO,SAASsC,EACdhM,EACAsmD,EACAlmD,GAEA,OAAOgmD,EAAAA,EAAAA,IACL,4BACA,CACEpmD,QACAsmD,SACAlmD,KAAM7H,KAAKC,UAAU4H,KAEvB,EAEJ,CAEO,MAAMmmD,EAA+B,WAC/BC,EAAgC,KAGtC,SAASC,EAAUpkD,GACxB,OAAO+jD,EAAAA,EAAAA,IAAmB,qBAAsB,CAC9CpmD,MAAO,CAAE4S,EAAGvQ,EAAQjZ,QAAQ4c,GAAWA,EAAOhe,SAAQua,KAAK,MAC3DmkD,QAAS,CAAE,eAAgBC,EAAAA,GAAAA,OAE/B,CAEOxnD,eAAeoI,EAAgBlF,GACpC,MAAM0I,QAAiBq7C,EAAAA,EAAAA,IACrB,0BACA,CACEpmD,MAAO,CAAER,MAAM,KAEjB,GAGIonD,EAAgB77C,GAAU1I,QAAQkB,MAAM,MAAQ,GAChD4S,EAAiBpmB,OAAOgU,KAAKgH,GAAU87C,gBAAkB,IAE/D,OAAOxkD,EAAQzD,KAAKoH,GAAW,IAAImQ,KAAmBywC,GAAet/D,SAAS0e,IAChF,CAEO7G,eAAe2nD,EACpBpR,EACAqR,GAE+B,IAD/BC,EAAUj/D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,IAEb,MAAMsa,EAAUtS,OAAOC,OAAO0lD,GAAM92C,KAAKC,IACvC,MAAMmH,GAASoQ,EAAAA,EAAAA,GAAmBvX,EAAImH,OAAOqB,QAAQ,EAAO,CAAC89C,EAAAA,KAC7D,OAAOn/C,EAAOhe,OAASge,EAASugD,CAA4B,IAExDU,EAAiBD,EAAaD,EAE9Bh8C,QAAiB07C,EAAUpkD,GAC3B6kD,EAASn8C,GAAUxH,MApCW,KAsCpC,GAAI2jD,GAAQl/D,SAAWqa,EAAQra,OAS7B,OARA0B,OAAO+tB,QAAQ0vC,eAAe,4BAA6B,CACzDC,MAAO,CACLC,eAAgBhlD,EAChBilD,qBAAsBjlD,EAAQra,OAC9Bu/D,eAAgBL,GAAQl/D,UAIrB,GAGT,MAAMw/D,EAAez3D,OAAOof,YAC1B+3C,EAAOtoD,KAAI,CAACsG,EAAOgL,KACjB,MAAMu3C,EAAcviD,IAAUshD,EAAgCkB,IAAMvnD,WAAW+E,GAE/E,MAAO,CAAC7C,EAAQ6N,GAAQ5K,MAAMmiD,GAAeC,IAAMD,EAAY,KAInE,OAAO/R,EAAK92C,KAAKC,IAAG,CAClBtP,GAAIsP,EAAItP,GACRyW,OAAQnH,EAAImH,OACZ0F,aAAc7M,EAAI6M,aAAa9M,KAAK0L,IAClC,MAAMpF,EAAQsiD,EAAa3oD,EAAImH,QACzByE,EAASrT,KAAKC,MAAO4vD,EAAiB/hD,EAAS,KAAS,IAExDyiD,EAAkBriD,MAAMJ,GAASoF,EAAYpF,MAAQA,EACrD0iD,EAAmBtiD,MAAMmF,GAAUH,EAAYG,OAASA,EAE9D,MAAO,IACFH,EACHA,YACEA,EAAYA,cAAgBC,EAAAA,GAAAA,MAA6BA,EAAAA,GAAAA,IAA2BD,EAAYA,YAClGpF,MAAOoF,EAAYpkB,OAAS0kB,EAAAA,GAAAA,KAA2B,EAAI+8C,EAC3Dl9C,OAAQH,EAAYpkB,OAAS0kB,EAAAA,GAAAA,KAA2B,EAAIg9C,EAC7D,OAGP,CAEO,SAAS37C,EAAW7T,GACzB,OAAOguD,EAAAA,EAAAA,IAAW,yBAA0B,CAC1CE,OAAQ,OACRlmD,KAAMhI,EAAKnL,WACXy5D,QAAS,CAAE,eAAgBC,EAAAA,GAAAA,iBAE/B,CAQO,IAAKkB,EAAW,SAAXA,GAAW,OAAXA,EAAAA,EAAW,yBAAXA,EAAAA,EAAW,qBAAXA,CAAW,MAWhB,SAAS/7C,EAAgB7kB,GAQ7B,IAR8B,QAC/Bob,EAAO,cACPkH,EAAa,YACbG,GAKDziB,EACC,MAAM+Y,EAAQjQ,OAAO+J,OACnB,CAAEuI,gBACuB,IAAlBkH,GAAiC,CAAEu+C,eAAgBv+C,QACnC,IAAhBG,GAA+B,CAAEkC,IAAKlC,IAG/C,OAAO08C,EAAAA,EAAAA,IACL,8BACA,CACEE,OAAQ,OACRtmD,UAEF,EAEJ,CAEO,SAAS+nD,EAAe3vD,GAC7B,OAAOguD,EAAAA,EAAAA,IAAW,yBAA0B,CAC1CE,OAAQ,OACRlmD,KAAMhI,EAAKnL,WACXy5D,QAAS,CAAE,eAAgBC,EAAAA,GAAAA,iBAE/B,CAEO,SAASqB,EAAkB5nD,GAChC,OAAOgmD,EAAAA,EAAAA,IAAW,8BAA+B,CAC/CE,OAAQ,MACRlmD,KAAM7H,KAAKC,UAAU4H,IAEzB,C,kIC1LO,IAAK6nD,EAAc,SAAdA,GAAc,OAAdA,EAAc,SAAdA,EAAc,eAAdA,EAAc,kBAAdA,EAAc,UAAdA,EAAc,YAAdA,EAAc,UAAdA,EAAc,eAAdA,EAAc,kBAAdA,EAAc,cAAdA,CAAc,MAYdC,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,qBAAnBA,EAAmB,YAAnBA,CAAmB,MAKnBC,EAAa,SAAbA,GAAa,OAAbA,EAAa,SAAbA,EAAa,SAAbA,CAAa,MAKbC,EAAkB,SAAlBA,GAAkB,OAAlBA,EAAkB,WAAlBA,EAAkB,UAAlBA,CAAkB,MAKvB,MAAMC,EAA2B,CACtC,CAACD,EAAmBE,QAAS,UAC7B,CAACF,EAAmBG,OAAQ,UAGvB,IAAK39C,EAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,cAAnBA,EAAmB,YAAnBA,CAAmB,MAKnBL,EAAoB,SAApBA,GAAoB,OAApBA,EAAAA,EAAoB,iBAApBA,EAAAA,EAAoB,aAApBA,EAAAA,EAAoB,iBAApBA,EAAAA,EAAoB,+BAApBA,EAAAA,EAAoB,iCAApBA,EAAAA,EAAoB,6BAApBA,EAAAA,EAAoB,uBAApBA,CAAoB,MA8IpB8rC,EAAQ,SAARA,GAAQ,OAARA,EAAQ,gBAARA,EAAQ,gBAARA,EAAQ,kBAARA,EAAQ,sBAARA,EAAQ,kBAARA,EAAQ,wBAARA,EAAQ,8BAARA,EAAQ,wBAARA,EAAQ,0BAARA,EAAQ,YAARA,EAAQ,gBAARA,EAAQ,cAARA,EAAQ,sBAARA,EAAQ,gBAARA,EAAQ,0BAARA,EAAQ,8BAARA,EAAQ,8BAARA,EAAQ,wCAARA,EAAQ,4BAARA,EAAQ,sCAARA,EAAQ,cAARA,CAAQ,MAwBRM,EAAO,SAAPA,GAAO,OAAPA,EAAAA,EAAO,iBAAPA,EAAAA,EAAO,6BAAPA,EAAAA,EAAO,qBAAPA,EAAAA,EAAO,yBAAPA,EAAAA,EAAO,iBAAPA,CAAO,MA8CP6R,EAAU,SAAVA,GAAU,OAAVA,EAAAA,EAAU,2BAAVA,EAAAA,EAAU,+BAAVA,EAAAA,EAAU,mCAAVA,EAAAA,EAAU,qCAAVA,EAAAA,EAAU,yCAAVA,EAAAA,EAAU,mCAAVA,EAAAA,EAAU,yCAAVA,CAAU,K,+WCtNf,IAAKC,EAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,YAAhBA,EAAgB,0BAAhBA,EAAgB,wBAAhBA,EAAgB,4BAAhBA,EAAgB,0BAAhBA,CAAgB,MAQ5B,MAAMC,EAAmB,cAEnBC,EACE,OADFA,EAEG,QAGHC,EACK,UADLA,EAEI,SAGG5Y,EAAoB,gBAYpB6Y,EAA2C,CACtDC,UAAW,IACXC,SAAS,EACTC,gBAAgB,EAChB55D,QAASC,EAAAA,GAAAA,iBACT4nD,WAAYV,EAAAA,EAAUF,EAAAA,GAAAA,OAAgB8N,SAMjC,SAAS8E,EAAmBj7D,GACjC,IACE,GAAIA,EACF,OAAO2Z,QAAQpP,KAAKG,MAAM1K,GAI9B,CAFE,MACA,OAAO,CACT,CACF,CAEO,SAASk7D,IACd,MAAMC,EAAgB3V,EAAAA,SAAyCxD,EAAmB6Y,GAElF,MAAO,IAAKA,KAAqBM,EACnC,CAEO,SAASC,EACd3wD,EACAzK,GAEAwlD,EAAAA,SACExD,GACCtB,IACC,MAAM2a,EAAc,IAAK3a,EAAW,CAACj2C,GAAMzK,GAG3C,MADI,uBAAwBq7D,UAAoBA,EAAYC,mBACrDD,CAAW,GAEpBR,EAEJ,CAEA,MAAMU,EAAoC,CACxClnD,QAAS,EACTqJ,aAAc,EACdjB,OAAQ,EACRm6C,cAAe,EACfE,UAAW,EACXC,YAAa,EACbyE,kBAAmB,EACnBC,sBAAuB,EACvBzE,cAAe,EACfC,cAAe,EACfC,aAAc,GAGT,SAASwE,EAAWtxD,GACzB,IAAIsT,EAAe,EA8BnB,MAAO,IA5BUtT,EAAK4L,QAAO,CAACC,EAAMjf,KAGlC,GAFA0mB,GAAgB1mB,EAAQ0mB,aAAa1jB,QAAU,EAE3ChD,EAAQq/D,WAAY,OAAOpgD,EAE/B,MAAM8gD,EAAc9gD,EAAK8gD,YAAc//D,EAAQ+/D,YACzCyE,EACJvlD,EAAKulD,mBAAqBxkE,EAAQkB,OAAS0kB,EAAAA,GAAAA,KAA2B,EAAI5lB,EAAQ+/D,aAC9E0E,EACJxlD,EAAKwlD,uBAAyBzkE,EAAQkB,OAAS0kB,EAAAA,GAAAA,KAA2B,EAAI5lB,EAAQ0gE,iBAClFZ,EAAY7gD,EAAK6gD,UAAY9/D,EAAQ8/D,UACrCF,EAAgB6E,GAAyB,EAAI,EAAsD,KAAjDD,EAAoBC,EAAwB,GAC9FxE,EAAgBH,GAAa,EAAI,EAA0C,KAArC0E,EAAoB1E,EAAY,GAE5E,MAAO,IACF7gD,EACH8gD,YAAaA,EACbyE,oBACAC,wBACA7E,gBACAK,gBACAx6C,OAAQxG,EAAKwG,OAASzlB,EAAQylB,OAC9Bq6C,UAAW7gD,EAAK6gD,UAAY9/D,EAAQ8/D,UACpCE,cAAe/gD,EAAK+gD,cAAgBhgE,EAAQggE,cAC5CE,aAAcjhD,EAAKihD,aAAelgE,EAAQkgE,aAC3C,GACAqE,GAID79C,eACArJ,QAASjK,EAAKpQ,OAElB,CAUO,SAAS2hE,EAAiBvxD,GAC/B,MAAM0P,EAA8B,GAmCpC,OAjCA1P,EAAKsB,SAAS09C,IACZA,EAAM1rC,aAAahS,SAAS2O,IAC1B,IAbN,SAA0BA,GACxB,OAAOA,EAAMoC,OAAS,GAAKpC,EAAMniB,OAAS0kB,EAAAA,GAAAA,IAC5C,CAWWg/C,CAAiBvhD,GAAQ,OAE9B,MAAMwhD,EAAkB/hD,EAAOizB,WAC5B92B,GACCA,EAAK+B,SAAWqC,EAAMrC,SACrBqC,EAAMniB,OAAS0kB,EAAAA,GAAAA,MAAkC3G,EAAKqG,cAAgBjC,EAAMiC,eAGjF,GAAIu/C,EAAkB,EAAG,CACvB,MAAMC,EAAW,IAAK1S,KAAU/uC,EAAOqD,kBAAczjB,UAC9C6hE,EAASp+C,aAChB5D,EAAOjO,KAAKiwD,EACd,KAAO,CACL,MAAMC,EAAYjiD,EAAO+hD,GACnB9E,EAAcgF,EAAUhF,YAAc18C,EAAM08C,YAC5CD,EAAYiF,EAAUjF,UAAYz8C,EAAMy8C,UAE9Ch9C,EAAO+hD,GAAmB,IACrBE,EACHjF,YACAC,cACAt6C,OAAQs/C,EAAUt/C,OAASpC,EAAMoC,OACjCi7C,gBAAiBqE,EAAUrE,gBAAkBr9C,EAAMq9C,gBACnDV,cAAe+E,EAAU/E,cAAgB38C,EAAM28C,cAC/CC,cAA+C,KAA/BF,EAAcD,EAAY,GAC1CI,aAAc6E,EAAU7E,aAAe78C,EAAM68C,aAEjD,IACA,IAGGn1D,OAAOC,OAAO8X,EACvB,CAuBO,SAASkiD,EAAcpzD,GAC5B,OAAO7G,OAAOgU,KAAKnN,GAAYgI,KAAKhJ,IAAQ,CAC1C9I,KAAM8I,EACNjN,SAAUiO,EAAWhB,MAEzB,CAMO,SAASq0D,EAAiB7J,EAAc3nD,GAC7C,OAAO2nD,EAAKp8C,QAA+B,CAACo/B,EAAM5/B,SAC/Bvb,IAAbub,EAAI/K,GAA2B2qC,EAC5BrzC,OAAO+J,OAAOspC,EAAM,CAAE,CAAC5/B,EAAI/K,KAAkB2qC,EAAK5/B,EAAI/K,KAAmB,IAAIiF,OAAO8F,MAC1F,CAAC,EACN,CA2CA,SAAS0mD,EACPlkD,EACAo6C,EACAhJ,GAEA,OAAIpsD,MAAMC,QAAQm1D,GACTA,EAAKtxD,MAAMob,GAASA,EAAKpd,OAASkZ,GAAUkE,EAAK9R,MAAMg/C,QAAUA,KAAQr9C,KAG3EqmD,IAAOp6C,EAChB,CAKO,SAASjH,EAAU9X,GAYvB,IAZwB,KACzBmR,EAAI,SACJuG,EAAQ,KACRtD,EAAI,QACJjM,EAAO,gBACP+6D,GAODljE,EACC,IAAKmR,EAAM,MAAO,CAAEgyD,SAAS,GAE7B,MAEMC,EAFcV,EAAiBvxD,GAEN4L,QAC7B,CAACC,EAAwBjf,KACvB,MAAMoyD,EA/GZ,SAAuBlxD,EAA2BokE,EAAchgD,GAC9D,GAAIpkB,IAAS0kB,EAAAA,GAAAA,KAA0B,OAAO69C,EAAiB8B,KAE/D,OAAQjgD,GACN,KAAKC,EAAAA,GAAAA,MACH,OAAO+/C,EAAO,EAAI7B,EAAiB+B,aAAe/B,EAAiBgC,YAGrE,QACA,KAAKlgD,EAAAA,GAAAA,IACH,OAAO+/C,GAAQ,EAAI7B,EAAiBiC,YAAcjC,EAAiBkC,WAGzE,CAkGoBC,CAAc5lE,EAAQkB,KAAMlB,EAAQigE,cAAgB,IAAKjgE,EAAQslB,aAE/E,IAAItc,EAAQoJ,KAAKosB,IAAInoB,IAAS6sD,EAAAA,GAAAA,YAAkCljE,EAAQ+/D,YAAc//D,EAAQggE,eACzFpqD,OAAOC,SAAS7M,KAAQA,EAAQ,GAErC,MAAM68D,EApDL,SAAqBvzD,EAAyBlI,GACnD,OAAQA,GACN,KAAKC,EAAAA,GAAAA,iBACH,OAAOiI,EAAK2tD,cACd,KAAK51D,EAAAA,GAAAA,iBACH,OAAOiI,EAAK0tD,cACd,KAAK31D,EAAAA,GAAAA,mBACH,OAAOiI,EAAKstD,cACd,KAAKv1D,EAAAA,GAAAA,mBACH,OAAOiI,EAAK4tD,aAElB,CAyC0B4F,CAAY9lE,EAASoK,GACnC27D,EAAW37D,EAAQsrB,WAAW,aAChCmwC,EACAX,EAAiBllE,EAAQghB,OAAQrH,GAAUzP,MAAOkoD,GAEhD/uC,EAAQ,CACZvb,KAAM9H,EAAQghB,OACdhY,QACA+L,KAAM/U,EAAQkB,OAAS0kB,EAAAA,GAAAA,KAA2B,KAAOmgD,GAAYF,EACrE17D,WACEnK,EAAQkB,OAAS0kB,EAAAA,GAAAA,MACb05C,EAAAA,EAAAA,IAAat/D,EAAQ+/D,aACrBmF,EAAiBllE,EAAQghB,OAAQrH,GAAUxP,WAAYioD,GAC7DhnD,YAAapL,EAAQ4Q,SACrBwC,KAAM,CAAE4yD,SAAUhmE,EAAQgmE,SAAU5T,UAGtC,OAAIppD,EAAQ,EACH,IAAKiW,EAAM,CAACmzC,GAAQ,IAAInzC,EAAKmzC,GAAQ/uC,IAGvCpE,CAAI,GAEb,CACE,CAACwkD,EAAiB8B,MAAO,GACzB,CAAC9B,EAAiBiC,aAAc,GAChC,CAACjC,EAAiBkC,YAAa,GAC/B,CAAClC,EAAiB+B,cAAe,GACjC,CAAC/B,EAAiBgC,aAAc,KAIpC,MAAO,CACLL,QAASr6D,OAAOC,OAAOq6D,GAAYzuD,MAAMhD,GAAQA,EAAI5Q,OAAS,IAC9DoQ,KAAM,CACJtL,KAAM,YACNnE,SAAUoH,OAAOgU,KAAKsmD,GACnBzrD,KAAKnG,GAlHd,SAAqBA,EAAuBL,GAAgD,IAAxB+xD,IAAepiE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC7EkjE,EAAY,GAChB,GAAQxyD,IACDgwD,EAAiB8B,KACpBU,EAAY,YAEd,CACE,MAAMC,EAAS,CAACzC,EAAiBiC,YAAajC,EAAiBkC,YAAYrjE,SAASmR,GAC9E0yD,EAAW,CAAC1C,EAAiBiC,YAAajC,EAAiB+B,cAAcljE,SAASmR,GAClF2yD,EAAahzD,EAAKizD,aAAarjE,QAAUoQ,EAAKkzD,YAAYtjE,OAAU,GAAE2gE,MAAuB,GAC7F4C,EAAcnzD,EAAKozD,YAAYxjE,QAAUoQ,EAAKqzD,WAAWzjE,OAAU,GAAE2gE,MAAwB,GACnGsC,EAAa,GAAEC,EAASE,EAAaG,IAAcJ,EAAWvC,EAAqBA,GAC9E,CAGT,GAAIuB,EAAiB,CACnB,IAAIxhE,EAA6D,GAGjE,OAFuDA,EAAnD8P,IAAQgwD,EAAiB8B,MAAQnyD,EAAKK,GAAKzQ,OAAmB,CAAC,CAAE8E,KAAM,OAAQnE,SAAUyP,EAAKK,KAClFuxD,EAAcC,EAAW7xD,EAAKK,GAAMiwD,IAC7C,CAAE57D,KAAMm+D,EAAWtiE,WAC5B,CAEA,MAAO,CAAEmE,KAAMm+D,EAAWtiE,SAAUyP,EAAKK,GAC3C,CA2FsBizD,CAAYjzD,EAAyB4xD,EAAYF,KAC9D/gE,QAAQs4C,GAAaA,EAAS/4C,SAASX,UAGhD,CAEO,SAAS2jE,EAAoBC,EAAyBC,GAC3D,MAAMC,EAAmBlxD,OAAOmpB,SAAS6nC,EAAOptD,IAAIypD,EAAAA,GAAAA,cAA+B,IAInF,MAAO,CACLv+C,YAHA9O,OAAOC,SAASixD,IAA0C,IAArBA,EAAyBA,EAAmBD,EAIjFD,OAAQ77D,OAAOof,YAAYy8C,EAAO9gE,WAClC0jB,KAAMo9C,EAAOptD,IAAIypD,EAAAA,GAAAA,OAAwBE,EAAAA,GAAAA,KACzCW,UAAW8C,EAAOptD,IAAIypD,EAAAA,GAAAA,iBAA6BhgE,EACnD2W,IAAKqqD,EAAmB2C,EAAOptD,IAAIypD,EAAAA,GAAAA,OAAwBiB,IAAgCH,QAC3F1tD,KAAOuwD,EAAOptD,IAAIypD,EAAAA,GAAAA,OAAwBC,EAAAA,GAAAA,YAC1C94D,QAAUw8D,EAAOptD,IAAIypD,EAAAA,GAAAA,UAA2BiB,IAAgC95D,QAChFgoD,MAAOwU,EAAOptD,IAAIypD,EAAAA,GAAAA,QAAuBj7D,cAAcuW,MAAM,MAAQ,GACrElB,QAASupD,EAAOptD,IAAIypD,EAAAA,GAAAA,UAAyB1kD,MAAM,MAAQ,GAE/D,CAEO,SAAS6yC,EAAiBryC,GAC/B,OAAOA,EAAKnF,KAAKnG,GAAQ89C,EAAAA,EAAU99C,IACrC,CAEO,SAASszD,IAAsD,IAArCt+D,EAAM1F,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGyiB,EAAAA,GACxC,MAAQ,GAAErc,EAAAA,EAAe,IAAIzC,KAAQ+B,IACvC,CAEO,SAAS8d,EACdjjB,GAGA,IAFA0jE,EAAUjkE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGyiB,EAAAA,GACb+4C,IAAWx7D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAEX,MAAMqf,EAAyB,CAAC,EA2BhC,YAzBqBnf,IAAjBK,EAAM0d,QAAuD,IAA/B1d,EAAM0d,OAAOqB,OAAOrf,SACpDof,EAAWpB,QAAS,GAIpB1d,EAAMgiB,cAAgBC,EAAAA,GAAAA,OACpBjiB,EAAMmD,MAAS0C,EAAAA,EAAgBi1D,EAAiB,CAAE51C,MAAOllB,EAAMmD,KAAMgC,OAAQu+D,EAAYzI,mBAE3Fn8C,EAAW3b,MAAO,GAIlBnD,EAAMgiB,cAAgBC,EAAAA,GAAAA,aACJtiB,IAAjBK,EAAMmiB,QAAwBnF,MAAMhd,EAAMmiB,SAAWniB,EAAMmiB,OAAS,KAErErD,EAAWqD,QAAS,GAIpBniB,EAAMgiB,cAAgBC,EAAAA,GAAAA,aACLtiB,IAAhBK,EAAM4c,OAAuBI,MAAMhd,EAAM4c,QAAU5c,EAAM4c,OAAS,KAEnEkC,EAAWlC,OAAQ,GAGd,CAAEiC,QAA4C,IAAnCpX,OAAOgU,KAAKqD,GAAYpf,OAAcwc,OAAQ4C,EAClE,CAEO,SAASg8C,EAAgB3zC,GAQ7B,IAR8B,MAC/BjC,EAAK,OACL/f,EAAS+1D,EAAAA,GAA0B,YACnCD,GAAc,GAKf9zC,EACC,OAAI8zC,GAAgC,iBAAV/1C,GAAsBA,EAAMxlB,SAAWyF,EAAOzF,OAC/D,IAAI0D,KAAK,gBAEd8hB,aAAiB9hB,MAAQyC,EAAAA,EAAgBqf,GAAeA,EAErDrf,EAAAA,EAAcqf,EAAMvgB,WAAYQ,EAAQ,IAAI/B,KACrD,CAEO,MAAMugE,EAAkBl8D,OAAOgU,KAAKyhD,EAAAA,IAMpC,SAAS0G,EACd9zD,GAEoC,IADpCe,EAAgCpR,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEpC,OAAOqQ,EAAK4L,QACV,CAAC8N,EAAKjT,KACJ,MAAMstD,EAActtD,EAA2BtP,GACzCA,EAAK48D,EAAc,GAAEA,KAAeC,EAAAA,EAAAA,MACpC1gD,EACwB,IAA5B7M,EAAI6M,aAAa1jB,QAAiBmR,EAAQkzD,WAAaxI,EAAchlD,EAAImH,UAAY4E,EAAAA,GAAAA,KACjF,CAAC0hD,EAAkBztD,EAAImH,OAAQuE,EAAAA,GAAAA,QAC/B1L,EAAI6M,aAAa9M,KAAK0L,IAAW,IAC5BA,EACHiiD,KAAMjiD,EAAY/a,GAAM,GAAE+a,EAAY/a,MAAO68D,EAAAA,EAAAA,UAErD,MAAO,IACFt6C,EACH,CAACviB,GAAK,IAAKsP,EAAKtP,KAAImc,gBACrB,GAEH,CAAC,EAEL,CAEO,SAAS8gD,EAEd1hE,GACA,MAAM2hE,EAAa,IAAIpuD,gBAavB,OAZAvT,EACGwX,SAAS+F,GACHA,EAAMqD,cAA+C,IAA/BrD,EAAMqD,cAAc1jB,OAIxCqgB,EAAMqD,aAHJ4gD,EAAkBjkD,EAAMrC,OAAQuE,EAAAA,GAAAA,SAK1C7Q,SAAQ,CAAC2O,EAAO6H,KACX7H,EAAMrC,OAAOhe,QAzCvB,SAA6BykE,EAA6B5tD,EAAkCqR,GAC1F+7C,EAAgBvyD,SAASjB,GAAQg0D,EAAWC,OAAQ,GAAEj0D,IAAMyX,IAAU,GAAErR,EAAIpG,IAAoC,OAClH,CAuC+Bk0D,CAAoBF,EAAYpkD,EAAO6H,EAAM,IAGnEu8C,CACT,CAEOttD,eAAeytD,EAAiBx0D,GAAmD,IAAvBy0D,IAAc9kE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC/E,GAAoB,IAAhBqQ,EAAKpQ,OAAc,MAAO,CAAEmf,SAAS,EAAM3C,OAAQ,CAAC,GAExD,IAAI2C,GAAU,EACd,MAAM3C,EAAuC,CAAC,EAE9C,IACE,MAAMnC,EAAUjK,EAAKwG,KAAKC,IACxB,MAAMmH,GAASoQ,EAAAA,EAAAA,GAAmBvX,EAAImH,OAAOqB,QAAQ,EAAO,CAAC89C,EAAAA,KAC7D,OAAOn/C,EAAOhe,OAASge,EAAS8mD,EAAAA,EAAgC,IAE5DxlD,QAAyBwlD,EAAAA,GAAoBzqD,GAEnD8E,EAAU9E,EAAQra,SAAWsf,EAAiBtf,OAG1C6kE,GACFz0D,EAAKsB,SAAQ,CAACmF,EAAKqR,KACjB,MAAM68C,EAAmBluD,EAAI6M,aAAa9M,KAAK0L,GAC7CiB,EAAgBjB,EAAaE,EAAAA,IAA4B,KAGrDwiD,EAAoBD,EAAiBnxD,MAAMkM,IAAYA,EAAOX,UAC9D8lD,GAA8C,IAA5B3lD,EAAiB4I,IAErC88C,GAAqBC,KACvB9lD,GAAU,GAGZ3C,EAAO3F,EAAItP,IAAMw9D,EAAiBnuD,KAAKkJ,IAAM,IAAWA,EAAOtD,OAAQwB,OAAQinD,KAAmB,GAQxG,CALE,MACA,MAAO,CACL9lD,SAAS,EACT3C,OAAQ,CAAC,EAEb,CAEA,MAAO,CAAE2C,UAAS3C,SACpB,CAEO,SAAS69C,EAAer0D,GAC7B,YAAc/F,IAAV+F,GAAuBsX,MAAMtX,GAAe05D,IACzC15D,CACT,CAEO,SAASs+D,EAAkBtmD,GAA4E,IAA5DsE,EAAWviB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAGwiB,EAAAA,GAAAA,IAC9D,MAAMq5C,EAAaC,EAAc79C,GAC3BknD,EAAsBviD,EAA6Bi5C,GAEzD,MAAO,IACF4B,EAAAA,GACH+G,MAAMH,EAAAA,EAAAA,MACNpmD,SACA9f,KAAM29D,EAAc79C,GACpBva,KAAMsgE,EAAiBvhD,EAAAA,IACvBF,YAAa,CAACC,EAAAA,GAAAA,SAA+B2iD,GAAqB5lE,SAASgjB,GACvEA,EACA4iD,EAAoB,GACxBziD,OAAQH,IAAgBC,EAAAA,GAAAA,OAA8Bq5C,IAAeh5C,EAAAA,GAAAA,KAA2B,OAAI3iB,EACpGid,MAAOoF,IAAgBC,EAAAA,GAAAA,MAA6B,OAAItiB,EAE5D,CAEO,SAASklE,IACd,IAAIC,EAAa,CAAEC,YAAY,EAAOC,SAAUR,EAAAA,IAChD,MAAMt1C,EAAkB1X,SAASC,eAAe,uBAChD,GAAIyX,EAAiB,CACnB,MAAM81C,GAAWh2C,EAAAA,EAAAA,IAAiC,uBAClDE,EAAgB8e,SAChB82B,EAAa,CAAEC,aAAcC,EAAUA,SAAUA,GAAYR,EAAAA,GAC/D,CACA,OAAOM,CACT,CAEA,MAAM3H,EAAoB,CAAEn7C,YAAaC,EAAAA,GAAAA,MAA4B2F,MAAO,EAAGhL,MAAO,GAE/E,SAASqoD,EAAuBpH,GACrC,OAAOA,EACJ7jD,SAAS0D,IACR,MAAM0F,EAAe,IAAI1F,EAAO0F,cAIhC,OAH4B,IAAxBA,EAAa1jB,QACf0jB,EAAa7R,KAAK4rD,GAEb/5C,EAAa9M,KAAK0L,IACvB,MAAM9G,EAAM,IAAKwC,GAIjB,cADOxC,EAAIkI,aACJ,IAAKlI,KAAQ8G,EAAa,GACjC,IAEHpP,MAAK,CAACV,EAAGC,IAAMD,EAAEjL,GAAKkL,EAAElL,IAC7B,CAEO,SAASs0D,EAAc2J,GAC5B,OAAIA,GAAQxgE,gBAAkBm4D,EAAAA,GAA8Bv6C,EAAAA,GAAAA,KAErDA,EAAAA,GAAAA,KACT,CAUO,SAASD,EAA6Bi5C,GAC3C,OAAQA,IACDh5C,EAAAA,GAAAA,KACI26C,EAAAA,GAEAD,EAAAA,CAEb,CAEO,SAASmI,IACd,OAAO9qD,EAAAA,EAAAA,IAAuB,CAC5BC,KAAMwiD,EAAAA,GACNpiD,KAAMqiD,EAAAA,GAEV,C,+HC1mBO,IAAKsB,EAAW,SAAXA,GAAW,OAAXA,EAAW,mCAAXA,EAAW,qDAAXA,EAAW,mDAAXA,EAAW,gCAAXA,CAAW,MAOvB,SAAS+G,EAA4B3iD,EAAkB4iD,GACrD,OAAQA,GACN,KAAKhH,EAAYiH,gBACjB,KAAKjH,EAAYkH,mBACjB,KAAKlH,EAAYmH,eACf,OAAOv1D,KAAKG,MAAMqS,GACpB,QACE,OAAOA,EAEb,CAGO,MAAMgjD,UAAuBhiD,MAClCiiD,OACAC,eAAgB,EAChB7tD,KACAgnD,MAA6B,CAAC,EAE9BrvD,YAAYi2D,GAAwF,IAA5C5tD,EAAIrY,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAIq/D,EAA0Br/D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAC/FmmE,MAAO,GAAEF,KADwBjmE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,oBAEpCiQ,KAAKg2D,OAASA,EACdh2D,KAAKi2D,cAAgBD,GAAU,IAC/Bh2D,KAAKoI,KAAOA,EACZpI,KAAKovD,MAAQA,CACf,EAUK,SAAShB,EACdpyC,GAG4C,IAF5C,MAAEhU,EAAK,QAAE0mD,EAAU,CAAC,KAAMvtD,GAAwDpR,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACtFomE,EAAgBpmE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAEhB,MAAM4qD,EAAa,oBAAqBjpD,OAAS,IAAIkpD,qBAAoB3qD,EACnEmmE,EAAapuD,EAAS,GAAEgU,KAAO,IAAI3V,gBAAgB2B,KAAWgU,EAC9D25C,EAA4BjH,EAAgB,iBAAmBC,EAAYiH,gBAE3ES,EAAiB,IAClBl1D,EACHutD,QAAS,CACP,eAAgBiH,KACbjH,IAGD4H,EAAU/uD,MAAM6uD,EAAY,IAAKC,EAAgBpb,OAAQN,GAAYM,SAErEsb,EAAoDD,EACvDvb,MAAK5zC,UACJ,MAAMqvD,QAAqBzjD,EAASye,OAC9BilC,EAAoC1jD,EAAS27C,QAAQloD,IAAI,iBAA2BmoD,EAAY+H,KAEtG,IACE,MAAMC,EAAiBjB,EAA4Bc,EAAcC,GACjE,IAAK1jD,EAAS6jD,IAAM7jD,EAASijD,QAAU,IACrC,MAAM,IAAID,EAAehjD,EAASijD,OAAQjjD,EAAS8jD,WAAYF,EAAgB,CAC7EG,MAAO/jD,EAAS27C,QAAQloD,IAAI,YAIhC,OAAOmwD,CAMT,CALE,MAAOjpD,GACP,GAAIA,aAAiBqoD,EACnB,MAAMroD,EAER,MAAM,IAAIqoD,EAAe,IAAKroD,EAAMuC,QAASumD,EAAc,CAAEM,MAAO/jD,EAAS27C,QAAQloD,IAAI,WAC3F,KAEDuwD,OAAOrpD,IAYN,GAXIA,EAAMsoD,QAAU,KAClBv2C,EAAAA,IAAkBu3C,IAChBA,EAAMC,WAAW,aAAcvpD,EAAM0hD,OAEhB,MAAjB1hD,EAAMsoD,OACRv2C,EAAAA,GAAwB/R,GAExB+R,EAAAA,GAAuB,GAAE/R,EAAMsoD,UAAUtoD,EAAMuC,UACjD,IAGAkmD,EACF,MAAMzoD,CACR,IAOJ,OAJIitC,IACF4b,EAAkBpc,OAAS,IAAMQ,EAAWQ,SAGvCob,CACT,CAQO,SAAS/tB,IAAsD,IAArChzB,EAAKzlB,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAAIspB,EAAuBtpB,UAAAC,OAAA,EAAAD,UAAA,QAAAE,EAClE,OAAOm+D,EAA8B,wBAAyB,CAAEpmD,MAAO,CAAEwN,QAAO6D,gBAAgB,EAClG,CAEO,SAASrG,IACd,OAAOo7C,EAAkD,2BAA4B,CACnFpmD,MAAO,CACLkvD,OAAQ,eAGd,CAEO,SAAS9jD,EAAiBpF,GAC/B,OAAOogD,EAAmB,sBAAuB,CAC/CpmD,MAAO,CACL4S,EAAG5M,IAGT,CAOO,SAASyF,EAAsB/B,GACpC,OAAO08C,EAAiC,2BAA4B,CAClEpmD,MAAO,CACL4L,IAAKlC,EACLwlD,OAAQ,mCAGd,CAEO,SAASnnD,EAAmBzf,GACjC,OAAO89D,EACL,qBACA,CACEE,OAAQ,OACRlmD,KAAM7H,KAAKC,UAAUlQ,KAEvB,EAEJ,C,0JC9JA,IAAI6mE,EAMG,SAASC,EACd32D,EACA8oC,EACA8tB,GAEKF,IAASA,EAAU,IAAIG,EAAAA,cAE5B,MAAMzqD,EAAY7W,IAChB,MAAMygD,EAAWzgD,GAASuhE,EAAS92D,EAAK8oC,GACxCiuB,EAAS/2D,EAAKg2C,EAAUlN,GAAc,GACtC8tB,IAAiB5gB,EAAS,EAGtBghB,EAAmBnrD,IACvB,GAAIA,EAAG7L,MAAQA,EACb,IACE,MAAMzK,EAAQsW,EAAGmqC,SAAWl2C,KAAKG,MAAM4L,EAAGmqC,UAAY,KACtD5pC,EAAS7W,GAASuzC,EAGpB,CAFE,MACA18B,EAAS08B,EACX,CACF,EAMF,OAHA4tB,EAAQO,YAAYj3D,EAAKoM,GACzBnb,OAAOyB,iBAAiB,UAAWskE,GAE5B,CACLN,UACAzb,YAAaA,KACXyb,GAASQ,eAAel3D,EAAKoM,GAC7Bnb,OAAO2B,oBAAoB,UAAWokE,EAAgB,EAG5D,CAKO,SAASF,EAAoB92D,EAAa8oC,GAC/C,IACE,MAAMvzC,EAAQ6vD,aAAaC,QAAQrlD,GAEnC,OADoBzK,EAAQuK,KAAKG,MAAM1K,GAAS,OAC1BuzC,CAGxB,CAFE,MACA,OAAOA,CACT,CACF,CAMO,SAASiuB,EACd/2D,EACAqiB,EACAymB,GAEA,IADAquB,IAAI7nE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAEJ,IACE,MAAMO,EAAQinE,EAAS92D,EAAK8oC,GACtBsuB,EAAe/0C,aAAuBg1C,SAAWh1C,EAAYxyB,GAASwyB,EAE5E+iC,aAAaS,QAAQ7lD,EAAKF,KAAKC,UAAUq3D,IACrCD,GAAMT,GAASS,KAAKn3D,EAAKo3D,EACtB,CAAP,MAAO,CACX,CAMO,SAASE,EAAYt3D,GAA0B,IAAbm3D,IAAI7nE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,KAAAA,UAAA,GAC3C,IACE81D,aAAamS,WAAWv3D,GACpBm3D,GAAMT,GAASS,KAAKn3D,OAAKxQ,EACtB,CAAP,MAAO,CACX,CAKO,SAASgoE,EACdx3D,EAKAy3D,EACA3uB,GAEA,IACE,MAAM4uB,EAAWZ,EAAgC92D,OAAKxQ,GACtD,QAAwB,IAAbkoE,EAA0B,OAErCX,EAAS/2D,EADay3D,aAA0BJ,SAAWI,EAAeC,GAAYD,EACzD3uB,GAAc,EACpC,CAAP,MAAO,CACX,C,0EC/FA,SAAS6uB,EACP1gB,EACAkc,EACAzyD,GAEA,OAAOk3D,EAAAA,GAAqB3gB,EAAMv2C,EAA3Bk3D,CAAoCzE,EAC7C,CAEO,MAAMlc,EACL,IADKA,EAEL,aAFKA,EAGD,iBAHCA,EAIH,UAJGA,EAKH,eALGA,EAMA,kBANAA,EAOF,uBAPEA,EAQJ,cARIA,EASH,4BATGA,EAUJ,0BAVIA,EAWF,gBAXEA,EAaH,eAbGA,EAcL,sBAdKA,EAeF,kBAfEA,EAgBJ,cAhBIA,EAiBH,eAjBGA,EAoBL,YApBKA,EAqBF,gBArBEA,EAwBF,gBAxBEA,EAyBE,4BAzBFA,EA0BI,uBA1BJA,EA2BS,mCA3BTA,EA8BJ,cA9BIA,EA+BA,0BA/BAA,EAgCE,qBAhCFA,EAiCO,iCAjCPA,EAoCH,eApCGA,EAqCC,2BArCDA,EAsCG,sBAtCHA,EAuCQ,kCAvCRA,EA0CA,kBA1CAA,EA2CK,wBA3CLA,EA4CK,yCA5CLA,EA6CM,6BAGNpQ,EAAO,CAClBgxB,OAAQA,IAAM5gB,EACd6gB,OAAQA,IAAM7gB,EACd8gB,WAAYA,IAAM9gB,EAClB+gB,SAAUA,IAAM/gB,EAChBghB,SAAUA,IAAMhhB,EAChBihB,YAAaA,IAAMjhB,EACnBkhB,UAAWA,IAAMlhB,EACjBmhB,QAASA,IAAMnhB,EACfohB,SAAW9qD,GAAmBoqD,EAAY1gB,EAAa,CAAE1pC,UAAU,CAAE+qD,UAAU,IAC/EC,QAAUhrD,GAAmBoqD,EAAY1gB,EAAY,CAAE1pC,WACvDirD,UAAWA,IAAMvhB,EAEjBwhB,SAAUA,IAAMxhB,EAChByhB,OAAQA,IAAMzhB,EACd0hB,UAAWA,IAAM1hB,EACjB2hB,QAASA,IAAM3hB,EACf4hB,SAAUA,IAAM5hB,EAEhB6hB,OAAQA,IAAM7hB,EACd8hB,UAAWA,IAAM9hB,EAEjB+hB,UAAWA,IAAM/hB,EACjBgiB,cAAeA,IAAMhiB,EACrBiiB,gBAAiBA,IAAMjiB,EACvBkiB,qBAAuB5rD,GAAmBoqD,EAAY1gB,EAAyB,CAAE1pC,QAAQwN,EAAAA,EAAAA,IAAYxN,KAErG6rD,QAASA,IAAMniB,EACfoiB,YAAaA,IAAMpiB,EACnBqiB,cAAeA,IAAMriB,EACrBsiB,mBAAqBhsD,GAAmBoqD,EAAY1gB,EAAuB,CAAE1pC,QAAQwN,EAAAA,EAAAA,IAAYxN,KAEjGisD,SAAUA,IAAMviB,EAChBwiB,aAAcA,IAAMxiB,EACpByiB,eAAgBA,IAAMziB,EACtB0iB,oBAAsBpsD,GAAmBoqD,EAAY1gB,EAAwB,CAAE1pC,QAAQwN,EAAAA,EAAAA,IAAYxN,KAEnGqsD,YAAaA,IAAM3iB,EACnB4iB,iBAAkBA,IAAM5iB,EACxB6iB,iBAAmBC,GAAgCpC,EAAY1gB,EAAqB,CAAE8iB,eACtFC,kBAAmBA,IAAM/iB,E,wDC3GpB,IAAKn8B,EAAU,SAAVA,GAAU,OAAVA,EAAU,cAAVA,EAAU,cAAVA,EAAU,gBAAVA,EAAU,kBAAVA,EAAU,mCAAVA,EAAU,cAAVA,CAAU,MAeVi3B,EAAa,SAAbA,GAAa,OAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,UAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,QAAbA,EAAa,UAAbA,CAAa,K,2PCAlB,SAASkoB,EAAiBzrE,GAMa,IANL,UACvC0rE,EAAS,KACTC,GAID3rE,EAIC,GAF0B6Y,SAASwyC,cAAe,kBAAiBqgB,MAE5C,CACrB,MAAME,EAAkBD,IAExB,OAAOE,EAAAA,EAAAA,OAAK,IAAMD,GACpB,CAEA,OAAOC,EAAAA,EAAAA,MAAKF,EACd,CA0BO,SAASp/C,EAAYxN,GAC1B,OAAOA,EAAO0U,WAAW,KAAO1U,EAAO1C,UAAU,GAAK0C,CACxD,CAcO,SAASm6B,EAAuBn6B,GACrC,IAAKA,GAAQ0U,WAAW,KAAM,OAAOnH,EAAAA,EAAAA,MAErC,MAAMw/C,EAAgBv/C,EAAYxN,GAElC,OAAIorC,EAAAA,EAAAA,SAAwB2hB,EAAc/lE,eAAuBumB,EAAAA,EAAAA,OACpC,IAAzBw/C,EAAc/qE,OAAqBurB,EAAAA,EAAAA,MAEhCA,EAAAA,EAAAA,OACT,CAKA,IAAIy/C,EACG7zD,eAAe2zC,IACpB,QAAqC,IAA1BppD,OAAOK,eAAgC,CAChD,MAAMipD,QAAiB,gCAGvB,OAFAggB,EAAyBhgB,EAASviC,QAClC/mB,OAAOK,eAAiBipE,EACjBA,CACT,CACF,CAEO7zD,eAAe8zD,IACpB,OAAQ5xD,UAAU6xD,aAAgB7xD,UAAU6xD,MAAMC,YAAe,CACnE,CAqBO,IAAKpkC,EAAa,SAAbA,GAAa,OAAbA,EAAAA,EAAa,qBAAbA,EAAAA,EAAa,uBAAbA,EAAAA,EAAa,2BAAbA,EAAAA,EAAa,6BAAbA,EAAAA,EAAa,mBAAbA,EAAAA,EAAa,yBAAbA,EAAAA,EAAa,6BAAbA,EAAAA,EAAa,+BAAbA,EAAAA,EAAa,2BAAbA,CAAa,MAYlB,SAASD,EAAoBhJ,GAClC,MAAO,CACL,gBAAiB,CAACiJ,EAAcqkC,QAASrkC,EAAcskC,WAAYtkC,EAAcukC,YAAYhsE,SAASw+B,GACtG,iBAAkB,CAACiJ,EAAc3P,OAAQ2P,EAAcwkC,UAAWxkC,EAAcykC,cAAclsE,SAASw+B,GACvG,cAAe,CAACiJ,EAAc0kC,SAAU1kC,EAAc2kC,YAAa3kC,EAAc4kC,aAAarsE,SAASw+B,GACvG,cAAe,CAACiJ,EAAcqkC,QAASrkC,EAAc0kC,SAAU1kC,EAAcwkC,WAAWjsE,SAASw+B,GACjG,eAAgB,CAACiJ,EAAc3P,OAAQ2P,EAAc4kC,YAAa5kC,EAAcukC,YAAYhsE,SAASw+B,GACrG,YAAa,CAACiJ,EAAcskC,WAAYtkC,EAAc2kC,YAAa3kC,EAAcykC,cAAclsE,SAASw+B,GAE5G,CAQA,MAAM8tC,EAAkD,CAAC,EACzD,SAASC,EAAQlP,GAMf,OALKiP,EAAUjP,KACbiP,EAAUjP,GAAa,IAAImP,KAAKC,aAAa,QAAS,CACpDC,sBAAuBrP,EACvBsP,sBAAuBtP,KAEpBiP,EAAUjP,EACnB,CAEO,SAASuP,EACdlmE,GAEA,IADA,UAAE22D,EAAY,EAAC,aAAED,GAAe,EAAK,aAAEnjB,EAAe,KAAmCx5C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAEzF+3B,EAAM9xB,EACV,GAAI8xB,UAAsCllB,OAAOC,SAASilB,GAAM,OAAOyhB,EAEvE,IAAI4yB,EAAS,GACTr0C,GAAO,KACTA,GAAO,IACPq0C,EAAS,KACAr0C,GAAO,KAChBA,GAAO,IACPq0C,EAAS,KACAr0C,GAAO,MAChBA,GAAO,IACPq0C,EAAS,KAGX,MAAMC,EAAYP,EAAQlP,GAAWl3D,OAAOqyB,GAE5C,OAAQ4kC,GAAgB5kC,EAAM,EAAI,IAAM,IAAMs0C,EAAYD,CAC5D,CAEO,SAAS7P,EACdt2D,GAEA,IADA,UAAE22D,EAAY,EAAC,aAAED,GAAe,EAAK,aAAEnjB,EAAe,KAAmCx5C,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EAE7F,GAAIiG,QAAuC,OAAOuzC,EAElD,MAAM8yB,EAAarmE,EAAMsmE,QAAQ3P,GAC3B4P,EAAS7P,GAAgB12D,EAAQ,EAAI,IAAM,GAEjD,GAA+B,IAA3BmS,WAAWk0D,IAA+B,IAAVrmE,EAClC,OAAO5G,EAAAA,EAAAA,KAAA,QAAMo+B,MAAOx3B,EAAMf,WAAWtE,SAAE4rE,EAASF,IAGlD,MAAMD,EAAYP,EAAQlP,GAAWl3D,OAAOO,GAE5C,OAAOumE,EAASH,CAClB,CAkBO,SAAS9gB,EACdn6C,GAOA,MAAMq7D,EAASr7D,EAAQ2hB,cAAc3hB,EAAQqB,GACvCi6D,EAASt7D,EAAQ2hB,cAAc3hB,EAAQsB,GAE7C,MAAsB,iBAAX+5D,GAAyC,iBAAXC,EAA4BD,EAAOE,cAAcD,GAAUt7D,EAAQkgB,UAGxGlgB,EAAQw7D,gBAA6B,OAAXH,EAAwB9sE,IAClDyR,EAAQw7D,gBAA6B,OAAXF,GAAyB/sE,IAGlDyR,EAAQy7D,yBAAsC,OAAXJ,EACnCr7D,EAAQy7D,yBAAsC,OAAXH,GAGhC75D,OAAO45D,GAAU55D,OAAO65D,IAAWt7D,EAAQkgB,UAHalgB,EAAQkgB,WADPlgB,EAAQkgB,SAK3E,CAEO,SAASw7C,EAA0Bj8D,EAAiBk8D,EAAqBC,GAE9E,MAAMhnD,EAAO3W,KAAKuI,IAAI,EAAGvI,KAAK9I,IAAIwmE,EAAal8D,EAAI5Q,OAAS,IACtDgmB,EAAK5W,KAAK9I,IAAIsK,EAAI5Q,OAAS,EAAGoP,KAAKuI,IAAIo1D,EAAkB,IAEzD/qD,EAAQ,IAAIpR,IACXo8D,GAAWhrD,EAAMirD,OAAOlnD,EAAM,GAGrC,OAFA/D,EAAMirD,OAAOjnD,EAAI,EAAGgnD,GAEbhrD,CACT,CASO,SAASoiD,IACd,OAAO1iE,OAAOwrE,QAAQC,gBAPd,uCAAqC3yD,QAAQ,UAAWc,IAC9D,MAAMggB,EAAI1oB,OAAO0I,GACjB,OAAQggB,EAAK4xC,OAAOE,gBAAgB,IAAIC,WAAW,IAAI,GAAM,IAAO/xC,EAAI,GAAMr2B,SAAS,GAAG,GAM9F,CAOO,SAASqoE,EAAwBvxD,GACtC,OAAQqgD,IACN,MAAMmR,EAAanR,EAAKoR,WAAW/5C,aAC7Bg6C,EAAarR,EAAKsR,QAAQj6C,aAC1Bk6C,EAAkB5xD,EAAKnI,MAAMnD,GAAQ88D,EAAW/2D,IAAI/F,KAASg9D,EAAWj3D,IAAI/F,KAI5Em9D,EAHiB,IAAIL,EAAWxxD,UAAW0xD,EAAW1xD,QAAQ3a,QAClE,CAACqP,EAAKyX,EAAOtX,KAASmL,EAAKzc,SAASmR,IAAQG,EAAI+K,QAAQlL,KAASyX,IAE/BtU,MAAMnD,GAAQ88D,EAAW/2D,IAAI/F,KAASg9D,EAAWj3D,IAAI/F,KAEzF,SAAKk9D,GAAmBC,IAIjBxR,EAAKyR,uBAAuB,CAEvC,CAEO,SAASC,IAI+E,IAJlD,UAC3Cv+C,EAAY,kBAAiB,SAC7BoT,EAAQ,cACRorC,GAAgB,GACqDhuE,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAC,EACzE,MAAM0B,EAAUqW,SAASC,eAAewX,GACxC,IAAIy+C,EAAcrrC,EAElB,IAAKlhC,EAAS,OAAOkhC,GAAY,KAEjC,IACE,MAAM0/B,GAAa/yC,EAAAA,EAAAA,IAAwBC,GACvCw+C,GAAetsE,EAAQ6sC,SAEvB+zB,IAAY2L,EAAc3L,EAGhC,CAFE,MACA2L,EAAcrrC,CAChB,CAEA,OAAOqrC,GAAe,IACxB,C","sources":["webpack://@finviz/website/../config/colors.js","webpack://@finviz/website/./js/app/header/market-badge.tsx","webpack://@finviz/website/./js/app/header/time.tsx","webpack://@finviz/website/./js/app/header/utils.ts","webpack://@finviz/website/./js/app/maps/constants/constants.ts","webpack://@finviz/website/./js/app/maps/constants/generator.ts","webpack://@finviz/website/./js/app/maps/constants/settings.ts","webpack://@finviz/website/./js/app/maps/layout-generator.tsx","webpack://@finviz/website/./js/app/maps/types.ts","webpack://@finviz/website/./js/app/maps/utils.ts","webpack://@finviz/website/./js/app/queryString.ts","webpack://@finviz/website/./js/app/quote/create-alert/EventCheckboxes.tsx","webpack://@finviz/website/./js/app/quote/create-alert/PriceInput.tsx","webpack://@finviz/website/./js/app/quote/create-alert/FormContent.tsx","webpack://@finviz/website/./js/app/quote/create-alert/utils.ts","webpack://@finviz/website/./js/app/quote/create-alert/SuccessContent.tsx","webpack://@finviz/website/./js/app/quote/create-alert/CreateAlert.tsx","webpack://@finviz/website/./js/app/quote/save-to-portfolio/PortfolioInput.tsx","webpack://@finviz/website/./js/app/quote/save-to-portfolio/utils.ts","webpack://@finviz/website/./js/app/quote/save-to-portfolio/FormContent.tsx","webpack://@finviz/website/./js/app/quote/save-to-portfolio/SuccessContent.tsx","webpack://@finviz/website/./js/app/quote/save-to-portfolio/SaveToPortfolio.tsx","webpack://@finviz/website/./js/app/screener/utils.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/hover-chart.ts","webpack://@finviz/website/./js/app/shared/isMobile.ts","webpack://@finviz/website/./js/app/shared/isStockFastRefreshAvailable.ts","webpack://@finviz/website/./js/app/shared/ticker-sanitizer.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/app/shared/utils.ts","webpack://@finviz/website/./js/main/components/RedGreenText.tsx","webpack://@finviz/website/./js/main/components/Table/Table.tsx","webpack://@finviz/website/./js/main/components/Table/types.ts","webpack://@finviz/website/./js/main/components/Table/TableCell.tsx","webpack://@finviz/website/./js/main/components/Table/TableHeader.tsx","webpack://@finviz/website/./js/main/components/Table/TableRow.tsx","webpack://@finviz/website/./js/main/components/Table/hooks.ts","webpack://@finviz/website/./js/main/components/box.tsx","webpack://@finviz/website/./js/main/components/button-group/button-group.tsx","webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/constants.ts","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/date-picker/index.tsx","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/dialog/hooks.ts","webpack://@finviz/website/./js/main/components/dialog/dialog-box.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-overlay.tsx","webpack://@finviz/website/./js/main/components/dialog/utils.ts","webpack://@finviz/website/./js/main/components/dialog/dialog.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-body.tsx","webpack://@finviz/website/./js/main/components/dialog/confirmation-dialog.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-trigger.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-footer.tsx","webpack://@finviz/website/./js/main/components/dialog/dialog-header.tsx","webpack://@finviz/website/./js/main/components/dropdown/hooks.ts","webpack://@finviz/website/./js/main/components/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-bar.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-separator.tsx","webpack://@finviz/website/./js/main/components/dropdown/more-button.tsx","webpack://@finviz/website/./js/main/components/icon/icon.tsx","webpack://@finviz/website/./js/main/components/icon/index.tsx","webpack://@finviz/website/./js/main/components/icon/add.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-down-short.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-forward.tsx","webpack://@finviz/website/./js/main/components/icon/arrow-up-short.tsx","webpack://@finviz/website/./js/main/components/icon/briefcase.tsx","webpack://@finviz/website/./js/main/components/icon/calendar.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-basic.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-heikin-ashi.tsx","webpack://@finviz/website/./js/main/components/icon/candle-bar-hollow.tsx","webpack://@finviz/website/./js/main/components/icon/caret-down.tsx","webpack://@finviz/website/./js/main/components/icon/caret-left.tsx","webpack://@finviz/website/./js/main/components/icon/caret-right.tsx","webpack://@finviz/website/./js/main/components/icon/caret-up.tsx","webpack://@finviz/website/./js/main/components/icon/caretVertical.tsx","webpack://@finviz/website/./js/main/components/icon/chart-bar.tsx","webpack://@finviz/website/./js/main/components/icon/chart-bubble.tsx","webpack://@finviz/website/./js/main/components/icon/chart-pie.tsx","webpack://@finviz/website/./js/main/components/icon/chart-table.tsx","webpack://@finviz/website/./js/main/components/icon/chart-treemap.tsx","webpack://@finviz/website/./js/main/components/icon/chevron-down.tsx","webpack://@finviz/website/./js/main/components/icon/chevron-right.tsx","webpack://@finviz/website/./js/main/components/icon/menu-close.tsx","webpack://@finviz/website/./js/main/components/icon/dark-mode.tsx","webpack://@finviz/website/./js/main/components/icon/diamond-outlined.tsx","webpack://@finviz/website/./js/main/components/icon/done.tsx","webpack://@finviz/website/./js/main/components/icon/drag.tsx","webpack://@finviz/website/./js/main/components/icon/draw.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-action-delete.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-off.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-on.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-autosave-saving.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-drawing-mode.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-drawing-mode-active.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-hide.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-lock.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-preserve-drawings.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-preserve-drawings-active.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-show.tsx","webpack://@finviz/website/./js/main/components/icon/drawing-setting-unlock.tsx","webpack://@finviz/website/./js/main/components/icon/exit-fullscreen.tsx","webpack://@finviz/website/./js/main/components/icon/flash.tsx","webpack://@finviz/website/./js/main/components/icon/fullscreen.tsx","webpack://@finviz/website/./js/main/components/icon/gesture.tsx","webpack://@finviz/website/./js/main/components/icon/gift.tsx","webpack://@finviz/website/./js/main/components/icon/hamburger.tsx","webpack://@finviz/website/./js/main/components/icon/help.tsx","webpack://@finviz/website/./js/main/components/icon/idea.tsx","webpack://@finviz/website/./js/main/components/icon/idea-load.tsx","webpack://@finviz/website/./js/main/components/icon/idea-save.tsx","webpack://@finviz/website/./js/main/components/icon/info.tsx","webpack://@finviz/website/./js/main/components/icon/interval.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h2v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1h3v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1l2r.tsx","webpack://@finviz/website/./js/main/components/icon/layout-1t2b.tsx","webpack://@finviz/website/./js/main/components/icon/layout-2h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-2h2v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-3h1v.tsx","webpack://@finviz/website/./js/main/components/icon/layout-3h2v.tsx","webpack://@finviz/website/./js/main/components/icon/light-mode.tsx","webpack://@finviz/website/./js/main/components/icon/line-chart-type.tsx","webpack://@finviz/website/./js/main/components/icon/lock.tsx","webpack://@finviz/website/./js/main/components/icon/close.tsx","webpack://@finviz/website/./js/main/components/icon/minus.tsx","webpack://@finviz/website/./js/main/components/icon/more.tsx","webpack://@finviz/website/./js/main/components/icon/note.tsx","webpack://@finviz/website/./js/main/components/icon/ohlc-chart-type.tsx","webpack://@finviz/website/./js/main/components/icon/palette.tsx","webpack://@finviz/website/./js/main/components/icon/profile.tsx","webpack://@finviz/website/./js/main/components/icon/publish.tsx","webpack://@finviz/website/./js/main/components/icon/refresh.tsx","webpack://@finviz/website/./js/main/components/icon/remove.tsx","webpack://@finviz/website/./js/main/components/icon/restore.tsx","webpack://@finviz/website/./js/main/components/icon/search.tsx","webpack://@finviz/website/./js/main/components/icon/settings.tsx","webpack://@finviz/website/./js/main/components/icon/settings-wheel.tsx","webpack://@finviz/website/./js/main/components/icon/share.tsx","webpack://@finviz/website/./js/main/components/icon/sign-out.tsx","webpack://@finviz/website/./js/main/components/icon/star.tsx","webpack://@finviz/website/./js/main/components/icon/star-outlined.tsx","webpack://@finviz/website/./js/main/components/icon/switch-horizontal.tsx","webpack://@finviz/website/./js/main/components/icon/switch-vertical.tsx","webpack://@finviz/website/./js/main/components/icon/tab-key.tsx","webpack://@finviz/website/./js/main/components/icon/template.tsx","webpack://@finviz/website/./js/main/components/icon/tool-arrow.tsx","webpack://@finviz/website/./js/main/components/icon/tool-brush.tsx","webpack://@finviz/website/./js/main/components/icon/tool-callout.tsx","webpack://@finviz/website/./js/main/components/icon/tool-curve.tsx","webpack://@finviz/website/./js/main/components/icon/tool-elliott-wave.tsx","webpack://@finviz/website/./js/main/components/icon/tool-ellipse.tsx","webpack://@finviz/website/./js/main/components/icon/tool-expand.tsx","webpack://@finviz/website/./js/main/components/icon/tool-fibonacci.tsx","webpack://@finviz/website/./js/main/components/icon/tool-line.tsx","webpack://@finviz/website/./js/main/components/icon/tool-measure.tsx","webpack://@finviz/website/./js/main/components/icon/tool-midline-h.tsx","webpack://@finviz/website/./js/main/components/icon/tool-midline-v.tsx","webpack://@finviz/website/./js/main/components/icon/tool-mouse.tsx","webpack://@finviz/website/./js/main/components/icon/tool-pitchfork.tsx","webpack://@finviz/website/./js/main/components/icon/tool-polygon.tsx","webpack://@finviz/website/./js/main/components/icon/tool-position.tsx","webpack://@finviz/website/./js/main/components/icon/tool-rect.tsx","webpack://@finviz/website/./js/main/components/icon/tool-rect-rotated.tsx","webpack://@finviz/website/./js/main/components/icon/tool-text.tsx","webpack://@finviz/website/./js/main/components/icon/tool-triangle.tsx","webpack://@finviz/website/./js/main/components/icon/tool-xabcd.tsx","webpack://@finviz/website/./js/main/components/icon/trash-can.tsx","webpack://@finviz/website/./js/main/components/icon/trending-down.tsx","webpack://@finviz/website/./js/main/components/icon/trending-up.tsx","webpack://@finviz/website/./js/main/components/icon/triangle.tsx","webpack://@finviz/website/./js/main/components/icon/triangle-outline-down.tsx","webpack://@finviz/website/./js/main/components/icon/triangle-outline-up.tsx","webpack://@finviz/website/./js/main/components/icon/warning.tsx","webpack://@finviz/website/./js/main/components/icon/svg.tsx","webpack://@finviz/website/./js/main/components/input.tsx","webpack://@finviz/website/./js/main/components/list/hooks.tsx","webpack://@finviz/website/./js/main/components/list/list-item.tsx","webpack://@finviz/website/./js/main/components/list/list.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/components/popover/popover.tsx","webpack://@finviz/website/./js/main/components/popover/hooks.ts","webpack://@finviz/website/./js/main/components/popover/popover-trigger.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box-item.tsx","webpack://@finviz/website/./js/main/components/combo-box/combo-box.tsx","webpack://@finviz/website/./js/main/components/search/constants.ts","webpack://@finviz/website/./js/main/components/centered.tsx","webpack://@finviz/website/./js/main/components/search/search-error.tsx","webpack://@finviz/website/./js/main/components/highlight.tsx","webpack://@finviz/website/./js/main/components/search/search-item.tsx","webpack://@finviz/website/./js/main/components/search/util.ts","webpack://@finviz/website/./js/main/components/search/search-list.tsx","webpack://@finviz/website/./js/main/components/search/search.tsx","webpack://@finviz/website/./js/main/components/combo-box/hooks.ts","webpack://@finviz/website/./js/main/components/select/hooks.ts","webpack://@finviz/website/./js/main/components/select/select-button.tsx","webpack://@finviz/website/./js/main/components/select/select.tsx","webpack://@finviz/website/./js/main/components/select/select-with-tooltip.tsx","webpack://@finviz/website/./js/main/components/select/native-select.tsx","webpack://@finviz/website/./js/main/components/select/select-list.tsx","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/daterange-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/label-with-delayed-spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-bar.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range-utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-custom-date-range-dialog.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-favorite-timeframes.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-box.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip.tsx","webpack://@finviz/website/./js/main/components/tooltip/tooltip-trigger.tsx","webpack://@finviz/website/./js/main/components/tooltip/hooks.ts","webpack://@finviz/website/./js/main/components/tooltip/tooltip-arrow.tsx","webpack://@finviz/website/./js/main/components/tooltip/types.ts","webpack://@finviz/website/./js/main/components/typography.tsx","webpack://@finviz/website/./js/main/constants.ts","webpack://@finviz/website/./js/main/hooks/use-is-mounted.ts","webpack://@finviz/website/./js/main/hooks/use-element-measure.ts","webpack://@finviz/website/./js/main/hooks/use-focus-input-on-error.tsx","webpack://@finviz/website/./js/main/hooks/use-popover-maxHeight.ts","webpack://@finviz/website/./js/main/hooks/use-resize-observer.ts","webpack://@finviz/website/./js/main/hooks/use-sort-data.ts","webpack://@finviz/website/./js/main/hooks/use-sync-local-storage.ts","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/portfolio/PortfolioWatchlistTable.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/index.ts","webpack://@finviz/website/./js/main/libs-init.ts","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/CostPerShare.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Date.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Shares.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Ticker.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/EditableColumns/Transaction.tsx","webpack://@finviz/website/./js/main/modules/portfolio/components/PortfolioBulkEditRowContext.tsx","webpack://@finviz/website/./js/main/modules/portfolio/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/portfolio/constants/general.ts","webpack://@finviz/website/./js/main/modules/portfolio/services/api.ts","webpack://@finviz/website/./js/main/modules/portfolio/types.tsx","webpack://@finviz/website/./js/main/modules/portfolio/utils.ts","webpack://@finviz/website/./js/main/services/api.ts","webpack://@finviz/website/./js/main/services/local-storage.ts","webpack://@finviz/website/./js/main/services/routing.ts","webpack://@finviz/website/./js/main/types.ts","webpack://@finviz/website/./js/main/util.tsx"],"sourcesContent":["// Keep in sync with charts repository colors.js file in: app/constants/colors.js\r\n\r\nmodule.exports = {\r\n white: '#fff',\r\n black: '#000',\r\n inherit: 'inherit',\r\n transparent: 'transparent',\r\n current: 'currentColor',\r\n finviz: {\r\n 'blue-gray': '#262931',\r\n blue: '#4fa4f4',\r\n },\r\n gray: {\r\n 50: '#f3f3f5',\r\n 100: '#dedfe5',\r\n 200: '#c3c6d0',\r\n 300: '#a3a8b9',\r\n 400: '#868ea5',\r\n 500: '#676f85',\r\n 600: '#4c5263',\r\n 700: '#353945',\r\n 750: '#2c303b',\r\n 800: '#22262f',\r\n 900: '#14161d',\r\n },\r\n red: {\r\n 50: '#fef0f0',\r\n 100: '#fcd6d6',\r\n 200: '#fbb4b4',\r\n 300: '#fd8487',\r\n 400: '#fb5057',\r\n 500: '#d91e2b',\r\n 600: '#9f1f2a',\r\n 700: '#691f24',\r\n 800: '#45171a',\r\n 900: '#280e0f',\r\n },\r\n orange: {\r\n 50: '#fef2eb',\r\n 100: '#fdd9c5',\r\n 200: '#fab889',\r\n 300: '#ef9323',\r\n 400: '#ca7b14',\r\n 500: '#a0600e',\r\n 600: '#79460a',\r\n 700: '#583006',\r\n 800: '#3d1e03',\r\n 900: '#261101',\r\n },\r\n amber: {\r\n 50: '#fef2e7',\r\n 100: '#fedab5',\r\n 200: '#fbba56',\r\n 300: '#de9c1a',\r\n 400: '#bb830f',\r\n 500: '#956600',\r\n 600: '#704b00',\r\n 700: '#4f3400',\r\n 800: '#372200',\r\n 900: '#211300',\r\n },\r\n yellow: {\r\n 50: '#fdf2df',\r\n 100: '#fcdc86',\r\n 200: '#f3c736',\r\n 300: '#cda30b',\r\n 400: '#b08900',\r\n 500: '#8b6a00',\r\n 600: '#664e21',\r\n 700: '#46371e',\r\n 800: '#2f2516',\r\n 900: '#1b150d',\r\n },\r\n brightYellow: {\r\n 50: '#fff699',\r\n 100: '#fff200',\r\n },\r\n lime: {\r\n 50: '#ebfad6',\r\n 100: '#caec90',\r\n 200: '#aad547',\r\n 300: '#8db61e',\r\n 400: '#769913',\r\n 500: '#5b7800',\r\n 600: '#435900',\r\n 700: '#2e3e00',\r\n 800: '#1e2a00',\r\n 900: '#111900',\r\n },\r\n green: {\r\n 50: '#e7f7e8',\r\n 100: '#beeac1',\r\n 200: '#86d895',\r\n 300: '#34c062',\r\n 400: '#00a449',\r\n 500: '#19803d',\r\n 600: '#265d35',\r\n 700: '#1e4027',\r\n 800: '#162b1b',\r\n 900: '#0d1810',\r\n },\r\n emerald: {\r\n 50: '#ddfaee',\r\n 100: '#a2f0d2',\r\n 200: '#4dddaf',\r\n 300: '#25be93',\r\n 400: '#1d9f7b',\r\n 500: '#157e60',\r\n 600: '#035d47',\r\n 700: '#004139',\r\n 800: '#002c22',\r\n 900: '#001a13',\r\n },\r\n teal: {\r\n 50: '#e0f8fc',\r\n 100: '#9beef7',\r\n 200: '#4fd8e5',\r\n 300: '#27b9c4',\r\n 400: '#109ba5',\r\n 500: '#007c83',\r\n 600: '#005b62',\r\n 700: '#004045',\r\n 800: '#002b2e',\r\n 900: '#00191b',\r\n },\r\n blue: {\r\n 50: '#ebf4fe',\r\n 100: '#cae2fc',\r\n 200: '#9bcbfa',\r\n 300: '#57aefb',\r\n 400: '#2f91ef',\r\n 500: '#306dca',\r\n 600: '#2f5091',\r\n 700: '#263766',\r\n 800: '#1b2542',\r\n 900: '#101527',\r\n },\r\n violet: {\r\n 50: '#f4f2fe',\r\n 100: '#e1dbfd',\r\n 200: '#c9befc',\r\n 300: '#ad9bfb',\r\n 400: '#9978f9',\r\n 500: '#7c51e7',\r\n 600: '#5e36b8',\r\n 700: '#402979',\r\n 800: '#2a1e4e',\r\n 900: '#18122c',\r\n },\r\n purple: {\r\n 50: '#f9f1fe',\r\n 100: '#eed8fd',\r\n 200: '#e1b6fc',\r\n 300: '#d38bfb',\r\n 400: '#c85bf9',\r\n 500: '#ae27e0',\r\n 600: '#8514ac',\r\n 700: '#60077e',\r\n 800: '#44005a',\r\n 900: '#2a003a',\r\n },\r\n pink: {\r\n 50: '#fef1f4',\r\n 100: '#fdd6e1',\r\n 200: '#fcb2c7',\r\n 300: '#f984aa',\r\n 400: '#f25090',\r\n 500: '#cd2a74',\r\n 600: '#9d1658',\r\n 700: '#700c42',\r\n 800: '#4e052b',\r\n 900: '#32011a',\r\n },\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { isAftermarket, isHoliday, isPremarket } from './utils'\r\n\r\nexport enum MarketBadgeType {\r\n None,\r\n Open,\r\n Closed,\r\n Premarket,\r\n Aftermarket,\r\n}\r\n\r\nexport function getMarketBadgeText(type: MarketBadgeType, _date?: Date) {\r\n switch (type) {\r\n case MarketBadgeType.Open:\r\n return {\r\n label: 'Markets Open',\r\n }\r\n case MarketBadgeType.Closed:\r\n // const holiday = getHoliday(date)\r\n\r\n return {\r\n label: 'Markets Closed',\r\n // description: holiday && (\r\n // <>\r\n // The markets observe U.S. holidays and are closed on\r\n //
\r\n // {holiday.label}\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Premarket:\r\n return {\r\n label: 'Premarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is possible.\r\n //
\r\n // We report it as the time between 7:00 AM and 9:30 AM\r\n // \r\n // ),\r\n }\r\n case MarketBadgeType.Aftermarket:\r\n return {\r\n label: 'Aftermarket',\r\n // description: (\r\n // <>\r\n // An additional time window when trading is still possible.\r\n //
\r\n // We report it as the time between 4:00 PM and 6:30 PM\r\n // \r\n // ),\r\n }\r\n }\r\n}\r\n\r\nexport function getMarketBadgeType(time: Date, hasUserPremium?: boolean) {\r\n if (isHoliday(time)) return MarketBadgeType.Closed\r\n if (isPremarket(time, hasUserPremium)) return MarketBadgeType.Premarket\r\n if (isAftermarket(time, hasUserPremium)) return MarketBadgeType.Aftermarket\r\n // if (isMarketOpen(time, hasUserPremium)) return MarketBadgeType.Open\r\n\r\n return MarketBadgeType.None\r\n}\r\n\r\nexport interface MarketBadgeProps {\r\n badge: MarketBadgeType\r\n className?: string\r\n}\r\n\r\nexport function MarketBadge({ badge, className }: MarketBadgeProps) {\r\n if (badge === MarketBadgeType.None) return null\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../../main/components/tooltip'\r\nimport { Heading } from '../../main/components/typography'\r\nimport { useResizeObserver } from '../../main/hooks/use-resize-observer'\r\nimport { MarketBadge, MarketBadgeProps, getMarketBadgeText, getMarketBadgeType } from './market-badge'\r\nimport { TimeFormatType, getDate, getFormattedDateString } from './utils'\r\n\r\nconst UPDATE_INTERVAL = 10000\r\n\r\nenum TimeBreakpointMode {\r\n container,\r\n window,\r\n}\r\n\r\nexport interface TimeBreakpoint {\r\n minWidth: number\r\n marketBadgeText: boolean\r\n timeFormat: TimeFormatType\r\n}\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 140, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 180, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 255, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\nfunction getTimeState(fixedTime?: string | Date, hasUserPremium: boolean = FinvizSettings.hasUserPremium) {\r\n const time = getDate(fixedTime)\r\n const badge = getMarketBadgeType(time, hasUserPremium)\r\n\r\n return { time, badge }\r\n}\r\n\r\nfunction TooltipBadge(props: MarketBadgeProps & { time: Date }) {\r\n const state = useTooltipState({ placement: 'bottom' })\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n {badge.label}\r\n \r\n {/* {badge.description && {badge.description}} */}\r\n \r\n \r\n )\r\n}\r\n\r\nfunction StaticBadge(props: MarketBadgeProps & { time: Date }) {\r\n const badge = getMarketBadgeText(props.badge, props.time)\r\n\r\n if (!badge) return null\r\n\r\n return (\r\n <>\r\n \r\n {`${badge.label} · `}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * Find matching breakpoint or return the last (largest) one\r\n */\r\nfunction findMatchingBreakpoint(compareWidth: number | undefined, breakpoints: TimeBreakpoint[]) {\r\n if (typeof compareWidth !== 'number') return breakpoints[breakpoints.length - 1]\r\n\r\n const matchingBreakpoints = breakpoints.filter((breakpoint) => compareWidth >= breakpoint.minWidth)\r\n\r\n return matchingBreakpoints.pop() ?? breakpoints[breakpoints.length - 1]\r\n}\r\n\r\nfunction getCurrentWidth(mode: TimeBreakpointMode, element: HTMLElement | null) {\r\n return mode === TimeBreakpointMode.window ? window.innerWidth : element?.clientWidth ?? 0\r\n}\r\n\r\ninterface TimeProps extends React.HTMLProps {\r\n /**\r\n * Set custom time to display\r\n */\r\n fixedTime?: string | Date\r\n\r\n /**\r\n * What to measure the breakpoints to\r\n * - `container` parent element\r\n * - `window` window\r\n *\r\n * @default \"container\"\r\n */\r\n breakpointMode?: keyof typeof TimeBreakpointMode\r\n\r\n /**\r\n * Defines what information is visible at which breakpoint. Local mode measures\r\n * the component wrapper div and global mode measures window width. The definitions\r\n * must be ascending in width\r\n */\r\n breakpoints?: TimeBreakpoint[]\r\n}\r\n\r\nexport function Time({\r\n className,\r\n fixedTime,\r\n breakpointMode = 'container',\r\n breakpoints = BREAKPOINTS,\r\n ...props\r\n}: TimeProps) {\r\n const ResizeObserver = useResizeObserver()\r\n const rootRef = React.useRef(null)\r\n const [state, setState] = React.useState(getTimeState(fixedTime))\r\n const [currentBreakpoint, setBreakpoint] = React.useState(null)\r\n\r\n React.useEffect(() => {\r\n const interval = setInterval(() => setState(getTimeState(fixedTime)), UPDATE_INTERVAL)\r\n return () => clearInterval(interval)\r\n }, [fixedTime])\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver || !rootRef.current) return\r\n\r\n if (!currentBreakpoint) {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n setBreakpoint(findMatchingBreakpoint(currentWidth, breakpoints))\r\n }\r\n\r\n const handleResize = throttle(() => {\r\n const currentWidth = getCurrentWidth(TimeBreakpointMode[breakpointMode], rootRef.current)\r\n const foundBreakpoint = findMatchingBreakpoint(currentWidth, breakpoints)\r\n\r\n if (foundBreakpoint !== currentBreakpoint) setBreakpoint(foundBreakpoint)\r\n }, 150)\r\n\r\n const observer = new ResizeObserver((entries) => {\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) handleResize()\r\n })\r\n })\r\n\r\n observer.observe(rootRef.current)\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n observer.disconnect()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [ResizeObserver, currentBreakpoint, breakpoints, breakpointMode])\r\n\r\n return (\r\n
\r\n {currentBreakpoint && (\r\n
\r\n {currentBreakpoint.marketBadgeText ? (\r\n \r\n ) : (\r\n \r\n )}\r\n {getFormattedDateString(state.time, currentBreakpoint.timeFormat)}\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\n/**\r\n * Check if a given date is DST in the US\r\n * - begins on the second Sunday in March\r\n * - ends on the first Sunday in November\r\n *\r\n * Keep in sync with https://github.com/finvizhq/charts/blob/master/app/utils.ts\r\n */\r\nexport function getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nexport function getDate(seed?: string | number | Date | null) {\r\n var date = seed != null ? new Date(seed) : new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n\r\n if (isDst) {\r\n dateAsNY.setUTCHours(dateAsNY.getUTCHours() + 1)\r\n }\r\n\r\n return dateAsNY\r\n}\r\n\r\nfunction getWeekDay(date: Date) {\r\n return date.toLocaleDateString('en-US', { weekday: 'short' })\r\n}\r\n\r\nfunction getMonth(date: Date, uppercase = true) {\r\n const name = date.toLocaleDateString('en-US', { month: 'short' })\r\n return uppercase ? name.toUpperCase() : name\r\n}\r\n\r\nfunction getDay(date: Date) {\r\n return date.getDate().toString().padStart(2, '0')\r\n}\r\n\r\nfunction getTime(date: Date) {\r\n return date.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })\r\n}\r\n\r\nenum TimeFormat {\r\n long,\r\n short,\r\n dateOnly,\r\n timeOnly,\r\n}\r\n\r\nexport type TimeFormatType = keyof typeof TimeFormat\r\n\r\nexport function getFormattedDateString(date: Date = getDate(), format: TimeFormatType = 'long') {\r\n switch (TimeFormat[format]) {\r\n case TimeFormat.long:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${date.getFullYear()} ${getTime(date)} ET`\r\n case TimeFormat.short:\r\n return `${getWeekDay(date)} ${getMonth(date)} ${getDay(date)} ${getTime(date)}`\r\n case TimeFormat.dateOnly:\r\n return `${getMonth(date, false)} ${getDay(date)}`\r\n case TimeFormat.timeOnly:\r\n return getTime(date)\r\n }\r\n}\r\n\r\nexport function formatDate(value: Date | unknown, inputOrOutputFormat: string, outputFormat?: string): string {\r\n return dateFns.format(\r\n dateFns.isDate(value) ? (value as Date) : dateFns.parse(`${value}`, inputOrOutputFormat, new Date()),\r\n outputFormat ?? inputOrOutputFormat\r\n )\r\n}\r\n\r\nexport function isPremarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n const hours = date.getHours()\r\n\r\n if (isPremium && dayOfWeek !== 0 && dayOfWeek !== 6 && (hours === 7 || hours === 8 || (hours === 9 && min < 30))) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isAftermarket(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n const dayOfWeek = date.getDay()\r\n const min = date.getMinutes()\r\n\r\n if (\r\n isPremium &&\r\n dayOfWeek !== 0 &&\r\n dayOfWeek !== 6 &&\r\n (date.getHours() === 16 || date.getHours() === 17 || (date.getHours() === 18 && min < 30))\r\n ) {\r\n return true\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * https://www.nyse.com/markets/hours-calendars\r\n */\r\nconst HOLIDAY_DATES = [\r\n {\r\n label: \"New Year's Day\",\r\n test: (day: number, month: number) => month === 1 && day === 2,\r\n },\r\n {\r\n label: 'Martin Luther King, Jr. Day',\r\n test: (day: number, month: number) => month === 1 && day === 16,\r\n },\r\n {\r\n label: 'Presidents Day',\r\n test: (day: number, month: number) => month === 2 && day === 20,\r\n },\r\n {\r\n label: 'Good Friday',\r\n test: (day: number, month: number) => month === 4 && day === 7,\r\n },\r\n {\r\n label: 'Memorial Day',\r\n test: (day: number, month: number) => month === 5 && day === 29,\r\n },\r\n {\r\n label: 'Juneteenth Holiday',\r\n test: (day: number, month: number) => month === 6 && day === 19,\r\n },\r\n {\r\n label: 'Early Close',\r\n test: (day: number, month: number, hours: number) => month === 7 && day === 3 && hours >= 13,\r\n },\r\n {\r\n label: 'Independence Day',\r\n test: (day: number, month: number) => month === 7 && day === 4,\r\n },\r\n {\r\n label: 'Labor Day',\r\n test: (day: number, month: number) => month === 9 && day === 4,\r\n },\r\n {\r\n label: 'Thanksgiving Day',\r\n test: (day: number, month: number) => month === 11 && day === 23,\r\n },\r\n {\r\n label: 'Day after Thanksgiving (closed from 1 PM)',\r\n test: (day: number, month: number, hours: number) => month === 11 && day === 24 && hours >= 13,\r\n },\r\n {\r\n label: 'Christmas Day',\r\n test: (day: number, month: number) => month === 12 && day === 25,\r\n },\r\n]\r\n\r\nexport function getHoliday(date: Date = getDate()) {\r\n var day = date.getDate()\r\n var month = date.getMonth() + 1\r\n var hours = date.getHours()\r\n\r\n return HOLIDAY_DATES.find((holiday) => holiday.test(day, month, hours))\r\n}\r\n\r\nexport function isHoliday(date: Date = getDate()) {\r\n return !!getHoliday(date)\r\n}\r\n\r\nexport function isMarketOpen(date: Date = getDate(), isPremium = FinvizSettings.hasUserPremium) {\r\n if (isPremarket(date, isPremium) || isAftermarket(date, isPremium) || isHoliday(date)) {\r\n return false\r\n }\r\n\r\n const dayOfWeek = date.getDay()\r\n const hour = date.getHours()\r\n const minute = date.getMinutes()\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n // Day starts at 9:30\r\n const dayStarted = hour === 9 ? minute >= 30 : hour >= 10\r\n // Ends at 16:00\r\n const dayEnded = hour >= 16\r\n\r\n return !isWeekend && dayStarted && !dayEnded\r\n}\r\n","import { MapSubtype, MapSubtypeId, MapType, MapTypeId, ScaleId } from '../types'\r\n\r\nexport const EXPANDED_MAP_BODY_CLASSS = 'is-map-expanded'\r\nexport const FALLBACK_PERF_RESPONSE = { nodes: {}, additional: {}, subtype: MapSubtypeId.DayPerf }\r\n\r\nexport const MAP_SUBTYPES_COMPANIES_BY_ID: Record = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToEarnings]: {\r\n id: MapSubtypeId.PriceToEarnings,\r\n name: 'P/E',\r\n scaleId: ScaleId.PriceToEarnings,\r\n tooltip: \"Color indicates the stock's price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ForwardPriceToEearnings]: {\r\n id: MapSubtypeId.ForwardPriceToEearnings,\r\n name: 'Forward P/E',\r\n scaleId: ScaleId.ForwardPriceToEearnings,\r\n tooltip: \"Color indicates the stock's forward price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceEarningsToGrowth]: {\r\n id: MapSubtypeId.PriceEarningsToGrowth,\r\n name: 'PEG',\r\n scaleId: ScaleId.PriceEarningsToGrowth,\r\n tooltip: \"Color indicates the stock's price-to-earnings-to-growth ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToSellsRatio]: {\r\n id: MapSubtypeId.PriceToSellsRatio,\r\n name: 'P/S',\r\n scaleId: ScaleId.PriceToSellsRatio,\r\n tooltip: \"Color indicates the stock's price-to-sales ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToBookRatio]: {\r\n id: MapSubtypeId.PriceToBookRatio,\r\n name: 'P/B',\r\n scaleId: ScaleId.PriceToBookRatio,\r\n tooltip: \"Color indicates the stock's price-to-book ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.DividendYield]: {\r\n id: MapSubtypeId.DividendYield,\r\n name: 'Dividend Yield',\r\n scaleId: ScaleId.DividendYield,\r\n tooltip: \"Color indicates the stock's dividend yield.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EPSGrowth5y]: {\r\n id: MapSubtypeId.EPSGrowth5y,\r\n name: 'EPS Growth Past 5 Years',\r\n scaleId: ScaleId.EPSGrowth5y,\r\n tooltip: \"Color indicates the stock's annual earnings (EPS) growth over past 5 years.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.FloatShort]: {\r\n id: MapSubtypeId.FloatShort,\r\n name: 'Float Short',\r\n scaleId: ScaleId.FloatShort,\r\n tooltip: \"Color indicates percent of the stock's float sold short.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.AnalystRecommendation]: {\r\n id: MapSubtypeId.AnalystRecommendation,\r\n name: 'Analysts Recom.',\r\n scaleId: ScaleId.AnalystRecommendation,\r\n tooltip:\r\n \"Color indicates the analyst's recommendations for given stocks. The rating is based on a 1-5 scale, ranging from a strong-buy, to a strong-sell.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EarningsPerf]: {\r\n id: MapSubtypeId.EarningsPerf,\r\n name: 'Earnings Day Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n \"Color indicates stock's performance on earnings day. Next day performance for earnings reported after market close.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n [MapSubtypeId.EarningsDate]: {\r\n id: MapSubtypeId.EarningsDate,\r\n name: 'Earnings Date',\r\n scaleId: ScaleId.EarningsDate,\r\n tooltip: \"Color indicates stock's earnings date.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_ETF_BY_ID = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_COMPANIES: MapSubtype[] = Object.values(MAP_SUBTYPES_COMPANIES_BY_ID)\r\n\r\nexport const MAP_SUBTYPES_ETF: MapSubtype[] = Object.values(MAP_SUBTYPES_ETF_BY_ID)\r\n\r\nexport const MAP_TYPES: MapType[] = [\r\n {\r\n name: 'S&P 500',\r\n pageTitle: 'S&P 500 Map',\r\n description:\r\n \"Standard and Poor's 500 index stocks categorized by sectors and industries. Size represents market cap.\",\r\n type: MapTypeId.Sector,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'World',\r\n pageTitle: 'World Map',\r\n description:\r\n 'Foreign ADR stocks listed on NYSE, NASDAQ, AMEX categorized by geo location. Size represents market cap.',\r\n type: MapTypeId.World,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Full',\r\n pageTitle: 'Stock Market Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\r\n type: MapTypeId.SectorFull,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Exchange Traded Funds',\r\n pageTitle: 'ETF Map - Exchange Traded Funds Map',\r\n nameShort: 'ETF',\r\n description: 'ETFs categorized by sectors and styles. Size represents 3-month average dollar volume, $1M minimum.',\r\n type: MapTypeId.ETF,\r\n subtypes: MAP_SUBTYPES_ETF,\r\n },\r\n]\r\n\r\nexport const MAP_TYPE_SCREENER = {\r\n name: 'Screener',\r\n pageTitle: 'Screener Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\r\n type: MapTypeId.Screener,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n\r\nexport const MAP_TYPE_ETF_HOLDINGS_WIDGET = {\r\n name: 'ETF Holdings',\r\n pageTitle: '',\r\n description: '',\r\n type: MapTypeId.ETFHoldings,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n","export type MapOrder = Record\r\n\r\nexport const MAP_MIN_WIDTH = 700\r\nexport const MAP_MIN_HEIGHT = 388\r\nexport const SECTOR_MIN_HEIGHT = 5\r\nexport const LEGEND_HEIGHT = 79\r\n\r\nexport const LARGE_MAP_HEIGHT_RATIO = 1.8\r\nexport const SMALL_MAP_GEO_HEIGHT_RATIO = 1.7\r\nexport const SMALL_MAP_HEIGHT_RATIO = 1.085 // old design ratio - 1.33\r\n\r\n// Minimal size of node to display header\r\nexport const LARGE_NODE_SIZE = {\r\n dx: 40,\r\n dy: 12,\r\n}\r\n\r\n// Don't display header if node height - header is smaller than this\r\nexport const LARGE_NODE_MIN_HEIGHT = 5\r\n\r\nexport const ORDER_SP500: MapOrder = {\r\n Technology: 10,\r\n Financial: 11,\r\n 'Communication Services': 9,\r\n Healthcare: 4,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n}\r\n\r\nexport const ORDER_SEC_ALL: MapOrder = {\r\n Technology: 10,\r\n Financial: 9,\r\n 'Communication Services': 8,\r\n Healthcare: 7,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n}\r\n\r\nexport const ORDER_ETF: MapOrder = {\r\n US: 11,\r\n 'US Sector': 10,\r\n 'US Large Cap': 9,\r\n 'US Mid Cap': 8,\r\n 'US Small Cap': 7,\r\n 'US Volatility': 6,\r\n Global: 5,\r\n International: 3,\r\n 'Fixed Income': 2,\r\n Commodity: 4,\r\n Strategy: 1,\r\n Forex: 0,\r\n}\r\n\r\nexport const ORDER_SCREENER: MapOrder = {\r\n Technology: 10,\r\n Financial: 9,\r\n 'Communication Services': 8,\r\n Healthcare: 7,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n}\r\n\r\nexport const ORDER_SCREENER_ETF: MapOrder = {\r\n ...ORDER_SCREENER,\r\n Financial: 1000,\r\n}\r\n\r\nexport const ORDER_WORLD: MapOrder = {\r\n Ireland: 20,\r\n 'United Kingdom': 19,\r\n Spain: 18,\r\n France: 17,\r\n Belgium: 16,\r\n Netherlands: 15,\r\n Switzerland: 14,\r\n\r\n China: 21,\r\n Japan: 20,\r\n India: 19,\r\n 'Hong Kong': 18,\r\n 'South Korea': 15,\r\n Taiwan: 14,\r\n\r\n Colombia: 30,\r\n Chile: 29,\r\n Argentina: 28,\r\n}\r\n\r\nexport const WORLD_INDUSTRIES = [\r\n {\r\n x: 4,\r\n y: 0,\r\n dx: 240,\r\n dy: 226,\r\n name: 'Canada',\r\n countries: ['Canada'],\r\n },\r\n {\r\n x: 4,\r\n y: 230,\r\n dx: 240,\r\n dy: 135,\r\n name: 'Mexico',\r\n countries: ['Cayman Islands', 'Bermuda', 'Mexico'],\r\n },\r\n {\r\n x: 4,\r\n y: 375,\r\n dx: 240,\r\n dy: 170,\r\n name: 'South America',\r\n countries: ['Netherlands Antilles', 'Panama', 'Peru', 'Argentina', 'Colombia', 'Chile', 'Brazil'],\r\n },\r\n {\r\n x: 730,\r\n y: 380,\r\n dx: 108,\r\n dy: 80,\r\n name: 'South Africa',\r\n countries: ['South Africa'],\r\n },\r\n {\r\n x: 725,\r\n y: 180,\r\n dx: 108,\r\n dy: 81,\r\n name: 'Israel',\r\n countries: ['Israel'],\r\n },\r\n {\r\n x: 1055,\r\n y: 420,\r\n dx: 144,\r\n dy: 80,\r\n name: 'Australia',\r\n countries: ['Australia'],\r\n },\r\n {\r\n x: 871,\r\n y: 0,\r\n dx: 336,\r\n dy: 396,\r\n name: 'Asia',\r\n countries: [\r\n 'Malaysia',\r\n 'Russia',\r\n 'Philippines',\r\n 'Indonesia',\r\n 'Singapore',\r\n 'South Korea',\r\n 'Taiwan',\r\n 'India',\r\n 'Hong Kong',\r\n 'Japan',\r\n 'China',\r\n ],\r\n },\r\n {\r\n x: 324,\r\n y: 0,\r\n dx: 374,\r\n dy: 428,\r\n name: 'Europe',\r\n countries: [\r\n 'Cyprus',\r\n 'Channel Islands',\r\n 'Greece',\r\n 'Luxembourg',\r\n 'Germany',\r\n 'Belgium',\r\n 'Spain',\r\n 'France',\r\n 'Ireland',\r\n 'Switzerland',\r\n 'Netherlands',\r\n 'United Kingdom',\r\n ],\r\n },\r\n {\r\n x: 697,\r\n y: 75,\r\n dx: 144,\r\n dy: 51,\r\n name: 'Frozen',\r\n countries: ['Finland', 'Sweden', 'Norway', 'Denmark'],\r\n },\r\n {\r\n x: 542,\r\n y: 414,\r\n dx: 102,\r\n dy: 68,\r\n name: 'Italy',\r\n countries: ['Italy'],\r\n },\r\n]\r\n","import tailwindColors from '../../../../../config/colors'\r\nimport { ScaleId } from '../types'\r\n\r\nexport interface ISettings {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string\r\n industry: ISettingsSection\r\n sector: ISettingsSection\r\n scaleFontSizes: Record\r\n fontSizePadding: Record\r\n fontSizePairs: Record\r\n}\r\n\r\nexport interface ISettingsSection {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string | null\r\n border: string | null\r\n header: ISettingsSectionHeader\r\n hover?: ISettingsSectionHeader\r\n}\r\n\r\nexport interface ISettingsSectionHeader extends ISettingsSectionFont {\r\n background: string | null\r\n border: string | null\r\n height: number\r\n margin: { top: number; right: number; bottom: number; left: number }\r\n}\r\n\r\nexport interface ISettingsSectionFont {\r\n color: string\r\n fontSize: number\r\n fontWeight: 'bold' | 'normal'\r\n padding: { top: number; right: number; left: number }\r\n}\r\n\r\nexport const scaleMinMax: Record = {\r\n [ScaleId.DayPerf]: [-3, 3],\r\n _5: [-6, 6],\r\n _10: [-10, 10],\r\n _15: [-18, 18],\r\n _20: [-24, 24],\r\n _25: [-30, 30],\r\n _relvol: [0, 3],\r\n _pe: [0, 30],\r\n _fpe: [0, 30],\r\n _peg: [0, 3],\r\n _ps: [0, 5],\r\n _pb: [0, 5],\r\n _div: [0, 5],\r\n _eps5y: [-50, 50],\r\n _short: [0, 15],\r\n _rec: [5, 1],\r\n _earndate: [30, -30],\r\n // Portfolio — values are just placeholders, the real value is computed from data\r\n _portfolioPct: [-1, 1],\r\n _portfolioUsd: [-1, 1],\r\n}\r\n\r\nexport const scaleStepFormat: Record = {\r\n [ScaleId.DayPerf]: '%N%',\r\n _5: '%N%',\r\n _10: '%N%',\r\n _15: '%N%',\r\n _20: '%N%',\r\n _25: '%N%',\r\n _relvol: '%N',\r\n _pe: '%N',\r\n _fpe: '%N',\r\n _peg: '%N',\r\n _ps: '%N',\r\n _pb: '%N',\r\n _div: '%N%',\r\n _eps5y: '%N%',\r\n _short: '%N%',\r\n _rec: { 1: '%N Strong Buy', 2: '%N Buy', 3: '%N Hold', 4: '%N Sell', 5: '%N Strong Sell' },\r\n _earndate: {\r\n '-30': '%N Days',\r\n '-15': '%N Days',\r\n '-1': 'After Earnings',\r\n 1: 'Before Earnings',\r\n 15: '%N Days',\r\n 30: '%N Days',\r\n },\r\n _portfolioPct: '%N%',\r\n _portfolioUsd: '$%N',\r\n}\r\n\r\nexport const Settings: ISettings = {\r\n padding: { top: 0, right: 0, bottom: 1, left: 1 },\r\n background: tailwindColors.finviz['blue-gray'],\r\n sector: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: null,\r\n height: 14.5,\r\n fontSize: 13,\r\n fontWeight: 'bold',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -1, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: tailwindColors.finviz['blue-gray'],\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -0.5, right: 4, left: 4 },\r\n },\r\n hover: {\r\n color: '#6b5811',\r\n background: '#ffd614',\r\n border: '#ffd614',\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -0.5, right: 3, left: 4 },\r\n },\r\n },\r\n scaleFontSizes: {\r\n 1: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8],\r\n 1.5: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 2.25: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 3: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n },\r\n fontSizePadding: {\r\n 36: 30,\r\n 30: 25,\r\n 24: 20,\r\n 20: 14,\r\n 18: 12,\r\n 14: 9,\r\n 13: 7,\r\n 12: 7,\r\n 11: 4,\r\n 10: 3,\r\n 9: 3,\r\n 8: 2.5,\r\n 6: 0,\r\n 4: 1,\r\n },\r\n fontSizePairs: {\r\n 36: [18, 14, 13, 12],\r\n 30: [14, 13, 12, 11, 10],\r\n 24: [14, 13, 12, 11, 10],\r\n 20: [12, 11, 10, 9, 8, 6],\r\n 18: [11, 10, 9, 8, 6],\r\n 14: [9, 8, 6, 4],\r\n 13: [9, 8, 6, 4],\r\n 12: [9, 8, 6, 4],\r\n 11: [8, 6, 4],\r\n 10: [10, 9, 8, 6, 4],\r\n 9: [9, 8, 6, 4],\r\n 8: [8, 6, 4],\r\n 6: [6, 4],\r\n 4: [4],\r\n },\r\n}\r\n\r\nexport const SettingsSmall: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n background: '#343842',\r\n sector: {\r\n ...Settings.industry,\r\n padding: { top: 0.5, right: 0, bottom: 0, left: 2 },\r\n border: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -1.5 },\r\n padding: { top: 0.5, right: 1, left: 1 },\r\n border: '#343842',\r\n fontSize: 9,\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n padding: { top: 0, right: 1, bottom: 1, left: 0 },\r\n header: {\r\n ...Settings.industry.header,\r\n height: 0,\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 2, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallDark: ISettings = {\r\n ...SettingsSmall,\r\n sector: {\r\n ...SettingsSmall.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmall.sector.header,\r\n padding: { top: 0.5, right: 2, left: 2 },\r\n margin: { top: 0, right: 1.5, bottom: 0, left: -0.5 },\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n industry: {\r\n ...SettingsSmall.industry,\r\n header: {\r\n ...SettingsSmall.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeo: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#a7c4d3',\r\n industry: {\r\n ...Settings.industry,\r\n background: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n height: 9,\r\n fontSize: 8,\r\n border: '#e0e0e0',\r\n margin: { top: -0.5, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -1, right: 0, left: 1 },\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 1, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeoDark: ISettings = {\r\n ...SettingsSmallGeo,\r\n background: tailwindColors.gray[800],\r\n sector: {\r\n ...SettingsSmallGeo.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsSmallGeo.industry,\r\n border: tailwindColors.gray[800],\r\n background: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmallGeo.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreener: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n sector: {\r\n ...Settings.sector,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#363a46',\r\n border: '#d3d3d3',\r\n header: {\r\n ...Settings.sector.header,\r\n height: 20,\r\n padding: { top: 2.5, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n header: {\r\n ...Settings.industry.header,\r\n border: '#363a46',\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreenerDark: ISettings = {\r\n ...SettingsScreener,\r\n sector: {\r\n ...SettingsScreener.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsScreener.industry,\r\n header: {\r\n ...SettingsScreener.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport * as constants from './constants/generator'\r\nimport { ISettings } from './constants/settings'\r\nimport { MapDataIndustry, MapDataNode, MapDataRoot, MapDataRow, MapDataSector, MapTypeId, NodeDepth } from './types'\r\n\r\nexport default class LayoutGenerator {\r\n width: number\r\n height: number\r\n settings: ISettings\r\n layout?: Array>\r\n sectors: MapDataSector[] = []\r\n industries: MapDataIndustry[] = []\r\n nodes: MapDataNode[] = []\r\n isSmall: boolean\r\n type: MapTypeId\r\n minSectorHeight: number\r\n\r\n static smallIndustryPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static smallIndustryGeoPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static getSizeRatio = (type: MapTypeId, isSmall: boolean) => {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return constants.SMALL_MAP_GEO_HEIGHT_RATIO\r\n }\r\n return constants.SMALL_MAP_HEIGHT_RATIO\r\n }\r\n\r\n return constants.LARGE_MAP_HEIGHT_RATIO\r\n }\r\n\r\n static calculateHeight = (\r\n width: number,\r\n type: MapTypeId,\r\n isSmall: boolean,\r\n ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n ) => ~~(width / ratio)\r\n\r\n static calculateWidth = (height: number, type: MapTypeId, isSmall: boolean) => {\r\n const ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n\r\n return Math.round(height * ratio)\r\n }\r\n\r\n static isNodeHeaderVisible(node: any, settings: ISettings) {\r\n const deltaX = node.dx ?? Math.round(node.x1) - Math.round(node.x0)\r\n const deltaY = node.dy ?? Math.round(node.y1) - Math.round(node.y0)\r\n\r\n const isLargeNode = deltaX >= constants.LARGE_NODE_SIZE.dx && deltaY >= constants.LARGE_NODE_SIZE.dy\r\n const showHeader =\r\n deltaY - settings.industry.padding.top - settings.industry.header.height > constants.LARGE_NODE_MIN_HEIGHT\r\n\r\n return isLargeNode && showHeader\r\n }\r\n\r\n constructor(width: number, height: number, type: MapTypeId, settings: ISettings, isSmall: boolean = false) {\r\n this.width = width\r\n this.height = height\r\n this.settings = settings\r\n this.isSmall = isSmall\r\n this.type = type\r\n this.minSectorHeight = settings.sector.padding.top + settings.sector.header.height + constants.SECTOR_MIN_HEIGHT\r\n }\r\n\r\n getExportData() {\r\n let mapRoot: MapDataRoot\r\n if (this.type === MapTypeId.World) {\r\n mapRoot = this._rootsToRoot(this.industries)\r\n } else {\r\n mapRoot = this.layout?.find((node) => node.data.name === 'Root') as unknown as MapDataRoot\r\n }\r\n\r\n // Save some file size by filtering out small nodes on maps where hover is not a concern\r\n if (this.isSmall) {\r\n mapRoot.children = this.filterVisibleNodes(mapRoot.children)\r\n }\r\n\r\n const stringified = JSON.stringify(mapRoot, (key, value) => (key === 'parent' ? '[Circular]' : value))\r\n\r\n return JSON.parse(stringified)\r\n }\r\n\r\n getLayoutData() {\r\n return {\r\n nodes: this.nodes,\r\n sectors: this.sectors,\r\n industries: this.industries,\r\n }\r\n }\r\n\r\n filterVisibleNodes = (arr: T[]) =>\r\n arr.filter((node) => {\r\n const isVisible = this.isNodeVisible(node)\r\n if (isVisible && node.children?.length) {\r\n node.children = this.filterVisibleNodes(node.children)\r\n }\r\n return isVisible\r\n })\r\n\r\n isNodeVisible(d: MapDataRow) {\r\n if (!d.depth || d.depth < NodeDepth.Industry) return true\r\n\r\n return d.dx > 0 && d.dy > 0\r\n }\r\n\r\n getLayout(data: MapDataRoot, options: Record = {}) {\r\n this.nodes = []\r\n this.sectors = []\r\n this.industries = []\r\n\r\n switch (this.type) {\r\n case MapTypeId.Sector:\r\n this.layout = this._generateSP500(data).descendants()\r\n break\r\n case MapTypeId.SectorFull:\r\n this.layout = this._generateFull(data).descendants()\r\n break\r\n case MapTypeId.Portfolio:\r\n case MapTypeId.Screener:\r\n case MapTypeId.ETFHoldings:\r\n this.layout = this._generateScreener(data, options).descendants()\r\n break\r\n case MapTypeId.World:\r\n this.layout = this._generateWorld(data)\r\n break\r\n case MapTypeId.ETF:\r\n this.layout = this._generateETF(data).descendants()\r\n break\r\n }\r\n\r\n this.layout?.forEach((d: any) => {\r\n this._transformNode(d)\r\n\r\n if (!this.isNodeVisible(d)) return\r\n\r\n if (!d.children) {\r\n this.nodes.push(d)\r\n } else if (d.parent && !d.parent.parent) {\r\n this.sectors.push(d)\r\n } else if (d.parent && !!d.parent.parent && d.children) {\r\n this.industries.push(d)\r\n }\r\n })\r\n\r\n return this.getLayoutData()\r\n }\r\n\r\n _transformNode(d: d3.HierarchyRectangularNode) {\r\n Object.assign(d, {\r\n name: d.data.name,\r\n description: d.data.description,\r\n perf: d.data.perf,\r\n additional: d.data.additional,\r\n x: d.x0,\r\n y: d.y0,\r\n dx: d.x1 - d.x0,\r\n dy: d.y1 - d.y0,\r\n })\r\n }\r\n\r\n _rootsToRoot(roots: any) {\r\n return {\r\n name: 'Root',\r\n children: [\r\n {\r\n name: 'World',\r\n children: roots,\r\n },\r\n ],\r\n duplicateTickers: 0,\r\n } as MapDataRoot\r\n }\r\n\r\n _getPadding = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (this.isSmall || LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryPadding.top,\r\n LayoutGenerator.smallIndustryPadding.right,\r\n LayoutGenerator.smallIndustryPadding.bottom,\r\n LayoutGenerator.smallIndustryPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getPaddingGeo = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryGeoPadding.top,\r\n LayoutGenerator.smallIndustryGeoPadding.right,\r\n LayoutGenerator.smallIndustryGeoPadding.bottom,\r\n LayoutGenerator.smallIndustryGeoPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getHierarchySort = <\r\n Datum extends { y0?: number; y1?: number; value?: number; data: { name: string }; depth?: number },\r\n >(\r\n a: Datum,\r\n b: Datum,\r\n order: Record\r\n ): number => {\r\n // Sort small sectors (works only when layout is recalculated)\r\n const heightB = b.y1! - b.y0!\r\n if (b.depth === NodeDepth.Sector && Number.isFinite(heightB) && heightB < this.minSectorHeight) {\r\n return b.value! - a.value!\r\n }\r\n\r\n if (order.hasOwnProperty(a.data.name) && order.hasOwnProperty(b.data.name)) {\r\n return order[b.data.name] - order[a.data.name]\r\n }\r\n return b.value! - a.value!\r\n }\r\n\r\n _getHierarchy = (data: MapDataRoot, order: Record) =>\r\n d3\r\n .hierarchy(data as unknown as MapDataNode)\r\n .sum((d) => d.value)\r\n .sort((a, b) => this._getHierarchySort(a, b, order))\r\n\r\n _getTreemap = (width: number, height: number) => {\r\n const paddingFn = this.type === MapTypeId.World ? this._getPaddingGeo : this._getPadding\r\n\r\n return d3\r\n .treemap()\r\n .size([width, height])\r\n .round(true)\r\n .tile(d3.treemapSquarify.ratio(1))\r\n .paddingTop((d) => paddingFn(d)[0])\r\n .paddingRight((d) => paddingFn(d)[1])\r\n .paddingBottom((d) => paddingFn(d)[2])\r\n .paddingLeft((d) => paddingFn(d)[3])\r\n }\r\n\r\n _getIndustriesRoots(data: MapDataRoot, industries: string[]) {\r\n return data.children[0].children.filter(function (d) {\r\n return industries.some((i) => i === d.name)\r\n })\r\n }\r\n\r\n _getSectorsRoots(data: MapDataRoot, sectors: string[]) {\r\n return data.children.filter(function (d) {\r\n return sectors.some((s) => s === d.name)\r\n })\r\n }\r\n\r\n _generateLayout(data: MapDataRoot, order: any, recountSectors = false) {\r\n const treemapHeight = LayoutGenerator.calculateHeight(this.width, this.type, false)\r\n const treemap = this._getTreemap(this.width, treemapHeight)\r\n const hierarchy = this._getHierarchy(data, order)\r\n const recalculateHeight = this.height !== treemapHeight\r\n\r\n // Calculate the base layout\r\n let nodes = treemap(hierarchy)\r\n\r\n // Recalculate for custom height\r\n if (this.height !== treemapHeight) {\r\n treemap.tile(d3.treemapResquarify).size([this.width, this.height])\r\n }\r\n\r\n // Run layout again so that possible small sectors are reordered\r\n // This also applies the recalculateHeight option\r\n if (recountSectors || recalculateHeight) {\r\n nodes = treemap(nodes.sort((a, b) => this._getHierarchySort(a, b, order)))\r\n }\r\n\r\n return nodes\r\n }\r\n\r\n _generateSP500(data: MapDataRoot) {\r\n const nodes = this._generateLayout(data, constants.ORDER_SP500)\r\n\r\n // Switch financial and technology sector\r\n const financialSector = nodes.find((node) => node.data.name === 'Financial')!\r\n const technologySector = nodes.find((node) => node.data.name === 'Technology')!\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n\r\n financialSector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n technologySector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n return nodes\r\n }\r\n\r\n _generateFull(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_SEC_ALL)\r\n }\r\n\r\n _generateScreener(data: MapDataRoot, { showETF }: Record) {\r\n const order = showETF ? constants.ORDER_SCREENER_ETF : constants.ORDER_SCREENER\r\n\r\n return this._generateLayout(data, order, true)\r\n }\r\n\r\n _generateETF(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_ETF)\r\n }\r\n\r\n _generateWorld = (data: MapDataRoot) => {\r\n const originalWidth = 1211\r\n const ratio = this.width / originalWidth\r\n let nodes: Array> = []\r\n\r\n for (let industryIndex = 0; industryIndex < constants.WORLD_INDUSTRIES.length; industryIndex++) {\r\n const industry = constants.WORLD_INDUSTRIES[industryIndex]\r\n const industryX = Math.round(industry.x * ratio)\r\n const industryY = Math.round(industry.y * ratio)\r\n const industryWidth = Math.round(industry.dx * ratio)\r\n const industryHeight = Math.round(industry.dy * ratio)\r\n\r\n const countriesRoots = this._getIndustriesRoots(data, industry.countries)\r\n const root = this._rootsToRoot(countriesRoots)\r\n const hierarchy = this._getHierarchy(root, constants.ORDER_WORLD)\r\n const treemap = this._getTreemap(industryWidth, industryHeight)\r\n const treemapNodes = treemap(hierarchy)\r\n\r\n treemapNodes.each((d) => {\r\n d.x0 += industryX\r\n d.x1 += industryX\r\n d.y0 += industryY\r\n d.y1 += industryY\r\n })\r\n\r\n // SWITCH BRAZIL AND OTHERS\r\n if (industry.name === 'South America') {\r\n const brazil = treemapNodes.find((d) => d.data.name === 'Brazil')!\r\n const colombia = treemapNodes.find((d) => d.data.name === 'Colombia')!\r\n const brazilWidth = brazil.x1 - brazil.x0\r\n const colombiaWidth = colombia.x1 - colombia.x0\r\n\r\n treemapNodes.each((d) => {\r\n if ([d.parent?.data.name, d.data.name].includes('Brazil')) {\r\n d.x0 += colombiaWidth\r\n d.x1 += colombiaWidth\r\n } else {\r\n d.x0 -= brazilWidth\r\n d.x1 -= brazilWidth\r\n }\r\n })\r\n }\r\n\r\n nodes = nodes.concat(treemapNodes.descendants())\r\n }\r\n\r\n return nodes\r\n }\r\n}\r\n","import { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n ETFHoldings = 'etf_holdings',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: string\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n subtype: MapSubtypeId\r\n version?: number\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { ScreenerQuery, ScreenerView } from '../screener/utils'\r\nimport { isMobile } from '../shared/isMobile'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { EXPANDED_MAP_BODY_CLASSS } from './constants/constants'\r\nimport { LEGEND_HEIGHT, MAP_MIN_HEIGHT, MAP_MIN_WIDTH } from './constants/generator'\r\nimport { Settings, SettingsSmall, SettingsSmallGeo } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport type Treemap from './treemap'\r\nimport {\r\n MapDataIndustry,\r\n MapDataNode,\r\n MapDataRoot,\r\n MapDataRow,\r\n MapDataSector,\r\n MapSubtypeId,\r\n MapTypeId,\r\n PerfData,\r\n} from './types'\r\n\r\nexport function getOffset(e: MouseEvent | React.MouseEvent) {\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n\r\n return {\r\n offsetX: e.clientX - rect.left,\r\n offsetY: e.clientY - rect.top,\r\n }\r\n}\r\n\r\nexport function getIsSmall() {\r\n const query = new URLSearchParams(window.location.search)\r\n return query.get('settings') === 'small'\r\n}\r\n\r\nexport function getSettingsForMapType(type: MapTypeId, isSmall?: boolean) {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return SettingsSmallGeo\r\n }\r\n return SettingsSmall\r\n }\r\n\r\n return Settings\r\n}\r\n\r\ntype DataRow = MapDataRow | MapDataRoot\r\n/**\r\n * We strip parents when serializing data for precomputed JSONs\r\n * but we need to restore them so that we can get them in treemap\r\n */\r\nexport function restoreDataKeys(\r\n data: T[],\r\n perfData: PerfData,\r\n parent?: any\r\n): T[] {\r\n return data.map((row) => {\r\n const newRow = {\r\n ...row,\r\n parent,\r\n perf: (perfData.nodes as Record)[row.name],\r\n additional: perfData.additional[row.name],\r\n }\r\n\r\n newRow.children = row.children ? restoreDataKeys(row.children, perfData, newRow) : undefined\r\n\r\n return newRow\r\n })\r\n}\r\n\r\nexport function splitData(mapData: MapDataRoot) {\r\n let sectors: MapDataSector[] = []\r\n let industries: MapDataIndustry[] = []\r\n let nodes: MapDataNode[] = []\r\n\r\n mapData.children?.forEach((sector) => {\r\n sectors.push(sector)\r\n sector.children?.forEach((industry) => {\r\n industries.push(industry)\r\n industry.children?.forEach((company) => {\r\n if (!(company.dx < 1 || company.dy < 1)) {\r\n nodes.push(company)\r\n }\r\n })\r\n })\r\n })\r\n\r\n return { sectors, industries, nodes }\r\n}\r\n\r\nexport function getMapData(mapData: MapDataRoot, perfData: PerfData) {\r\n const [data] = restoreDataKeys([mapData], perfData)\r\n\r\n return splitData(data)\r\n}\r\n\r\nexport async function fetchBaseData(filename: string, cacheBuster: number) {\r\n const response = await fetch(`/maps/${filename}?rev=${cacheBuster}`)\r\n\r\n return response.json()\r\n}\r\n\r\nfunction getSizeForExpandedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n wrapper?.style.removeProperty('max-width')\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n const elementHeight = Math.max(window.innerHeight - LEGEND_HEIGHT - 50, MAP_MIN_HEIGHT)\r\n\r\n // We don’t want the map to overflow the height\r\n if (size.height > elementHeight) {\r\n const newWidth = LayoutGenerator.calculateWidth(elementHeight, type, isSmall)\r\n size = {\r\n width: newWidth,\r\n height: LayoutGenerator.calculateHeight(newWidth, type, isSmall),\r\n }\r\n }\r\n\r\n if (wrapper) {\r\n wrapper.style.maxWidth = `${size.width}px`\r\n }\r\n\r\n return size\r\n}\r\n\r\nfunction getRatioSizeForWidth(width: number, type: MapTypeId, isSmall: boolean) {\r\n const mapWidth = Math.max(width, MAP_MIN_WIDTH)\r\n return {\r\n width: mapWidth,\r\n height: LayoutGenerator.calculateHeight(mapWidth, type, isSmall),\r\n }\r\n}\r\n\r\nfunction getSizeRatioBasedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n // Remove maxWidth if exiting expanded mode\r\n if (wrapper?.style.maxWidth) {\r\n wrapper.style.removeProperty('max-width')\r\n }\r\n\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n\r\n // Set height so that we know if scrollbars are visible\r\n element.style.height = `${size.height + LEGEND_HEIGHT}px`\r\n\r\n // Add a bit of padding if scrollbar is visible and map touches it\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\r\n const isMediumScreen =\r\n window.innerWidth > 1430 &&\r\n window.innerWidth < 1450 &&\r\n !document.body.classList.contains('is-screener') &&\r\n !document.body.classList.contains('is-portfolio')\r\n if (isMediumScreen && scrollbarWidth > 0) {\r\n size = getRatioSizeForWidth(element.clientWidth - 10, type, isSmall)\r\n\r\n // This means we would display a horizontal scrollbar, which we don’t want\r\n } else if (size.width !== element.clientWidth) {\r\n size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n }\r\n\r\n element.style.removeProperty('height')\r\n\r\n return size\r\n}\r\n\r\n/**\r\n * Calculate size of the treemap based on w/h ratio and scrollbars visibility\r\n */\r\nexport function getSize(element: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n const canvasWrapper = document.getElementById('canvas-wrapper')\r\n\r\n if (!element) {\r\n return { width: 1, height: 1 }\r\n }\r\n\r\n // Custom width using query param\r\n const query = new URLSearchParams(window.location.search)\r\n if (query.has('width')) {\r\n const width = Number(query.get('width'))\r\n const parsedRatio = query.has('ratio') ? parseFloat(query.get('ratio')!) : undefined\r\n const ratio = Number.isFinite(parsedRatio) ? parsedRatio : undefined\r\n return {\r\n width,\r\n height: LayoutGenerator.calculateHeight(width, type, isSmall, ratio),\r\n }\r\n }\r\n\r\n // Expanded map\r\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\r\n return getSizeForExpandedMap(element, canvasWrapper, type, isSmall)\r\n }\r\n\r\n if (type === MapTypeId.ETFHoldings) {\r\n return { height: element.clientHeight, width: element.clientWidth }\r\n }\r\n\r\n return getSizeRatioBasedMap(element, canvasWrapper, type, isSmall)\r\n}\r\n\r\n/**\r\n * Get treemap zoom levels based on env\r\n */\r\nexport function getDefaultZoomLevels() {\r\n if (isMobile()) {\r\n return [1, 1.5]\r\n }\r\n\r\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\r\n return [1, 1.5, 2.25]\r\n }\r\n\r\n return [1, 1.5, 2.25, 3]\r\n}\r\n\r\nexport function parseInitDataAsPerf(data?: MapDataRoot): PerfData | undefined {\r\n if (!data) return\r\n\r\n const nodes: Record = {}\r\n const additional: Record = {}\r\n\r\n for (const sector of data.children) {\r\n for (const industry of sector.children) {\r\n for (const node of industry.children) {\r\n if (node.perf !== undefined) {\r\n nodes[node.name] = node.perf\r\n }\r\n if (node.additional !== undefined) {\r\n additional[node.name] = node.additional\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n nodes,\r\n additional,\r\n subtype: MapSubtypeId.DayPerf,\r\n version: 1,\r\n }\r\n}\r\n\r\nconst MAX_SPARKLINES = 120\r\nconst HOVER_TOP_ROW_HEIGHT = 100\r\nconst HOVER_BORDER_WIDTH = 4\r\nconst ROW_HEIGHT = 30\r\nconst ROW_HEIGHT_SMALL = 24\r\nconst ROW_HEIGHT_BREAKPOINT = 15\r\n\r\nexport function getVisibleTooltipTickers(node?: MapDataNode) {\r\n if (!node) return []\r\n\r\n const industryTickers = node.parent.children\r\n const isSmall = industryTickers.length > ROW_HEIGHT_BREAKPOINT\r\n const rowHeight = isSmall ? ROW_HEIGHT_SMALL : ROW_HEIGHT\r\n const visibleRows = Math.floor((window.innerHeight - HOVER_TOP_ROW_HEIGHT - 2 * HOVER_BORDER_WIDTH) / rowHeight)\r\n const visibleChildren = industryTickers\r\n .slice()\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n .slice(0, Math.min(visibleRows, MAX_SPARKLINES))\r\n .map((n) => n.name)\r\n\r\n return visibleChildren\r\n}\r\n\r\nexport function onNodeClick({\r\n treemap,\r\n node,\r\n industry,\r\n sector,\r\n}: {\r\n treemap: Treemap\r\n node?: MapDataNode\r\n industry?: MapDataIndustry\r\n sector?: MapDataSector\r\n}) {\r\n if (node) {\r\n window.open(`/quote.ashx?t=${node.name}`)\r\n return\r\n }\r\n\r\n const query = new URLSearchParams()\r\n query.set(ScreenerQuery.View, ScreenerView.Overview.toString())\r\n\r\n // Use ticker filter for ETFs\r\n if (treemap.type === MapTypeId.ETF) {\r\n let tickers: string[] = []\r\n if (industry) {\r\n tickers = industry.children.map((node) => node.name)\r\n } else if (sector) {\r\n tickers = sector.children.flatMap((industry) => industry.children.map((node) => node.name))\r\n }\r\n\r\n if (tickers.length) {\r\n query.set(ScreenerQuery.Tickers, tickers.join(','))\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n\r\n return\r\n }\r\n\r\n if (industry) {\r\n const id = industry.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n const filter = treemap.type === MapTypeId.World ? 'geo' : 'ind'\r\n\r\n query.set(ScreenerQuery.Filters, `${filter}_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n } else if (sector) {\r\n const id = sector.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n\r\n query.set(ScreenerQuery.Filters, `sec_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n}\r\n\r\nenum MapsPollingIntervalInMs {\r\n Free = 180000,\r\n Elite = 3000,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport function getMapsRefreshInterval({\r\n base = MapsPollingIntervalInMs.Elite,\r\n reduced = MapsPollingIntervalInMs.EliteStocksReduced,\r\n free = MapsPollingIntervalInMs.Free,\r\n}: { base?: number; reduced?: number; free?: number } = {}) {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n let customRefreshInterval = base\r\n if (!isPremium) {\r\n customRefreshInterval = free\r\n } else if (!isStockFastRefreshAvailable()) {\r\n customRefreshInterval = reduced\r\n }\r\n\r\n return customRefreshInterval\r\n}\r\n","export type ObjectHash = Record\r\n\r\nexport const decodeQueryString = function = ObjectHash>(\r\n search = window.location.search\r\n): T {\r\n const vars = search.substring(1).split('&')\r\n const obj: ObjectHash = {}\r\n vars.forEach((pair) => {\r\n const delimiterPos = pair.indexOf('='),\r\n key = decodeURIComponent(pair.substring(0, delimiterPos)),\r\n value = decodeURIComponent(pair.substring(delimiterPos + 1))\r\n obj[key] = value\r\n })\r\n return obj as T\r\n}\r\n\r\nexport const encodeQueryString = function (values: ObjectHash, whitelistedValues: string[] = []) {\r\n return Object.keys(values).reduce((prev, key) => {\r\n const value = values[key]\r\n if (!['', null, undefined].includes(value) || whitelistedValues.includes(value)) {\r\n return prev + (prev.length > 0 ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value)\r\n }\r\n return prev\r\n }, '')\r\n}\r\n","import React from 'react'\r\n\r\nimport { Checkbox } from '../../../main/components/checkbox'\r\nimport { CreateAlertInputProps } from './types'\r\n\r\ntype EventType = 'news' | 'rating' | 'insider'\r\ntype EventOptionType = {\r\n name: EventType\r\n label: string\r\n}\r\n\r\nconst EVENTS: EventOptionType[] = [\r\n {\r\n name: 'news',\r\n label: 'News',\r\n },\r\n {\r\n name: 'rating',\r\n label: 'Ratings',\r\n },\r\n {\r\n name: 'insider',\r\n label: 'Insiders',\r\n },\r\n]\r\n\r\nexport default function EventCheckboxes(props: CreateAlertInputProps) {\r\n const handleChange = React.useCallback(\r\n (ev: React.FormEvent, name: EventType) => {\r\n const checked = ev.currentTarget.checked\r\n\r\n if (checked && !props.errors?.isEmpty) props.setErrors((errors) => ({ ...errors, isEmpty: false }))\r\n props.setState((prev) => ({ ...prev, [name]: checked }))\r\n },\r\n [props]\r\n )\r\n\r\n return (\r\n
\r\n {EVENTS.map((event) => (\r\n handleChange(e, event.name)}\r\n >\r\n {event.label}\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipInput } from '../../../main/components/tooltip-input'\r\nimport { CreateAlertInputProps } from './types'\r\n\r\ntype PriceInputProps = {\r\n name: 'priceAbove' | 'priceBelow'\r\n label: string\r\n} & CreateAlertInputProps\r\n\r\nexport function PriceInput({ name, label, ...props }: PriceInputProps) {\r\n const [rawValue, setRawValue] = React.useState(props.state[name] ?? '')\r\n\r\n const handleBlur = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n const price = ev.currentTarget.valueAsNumber\r\n\r\n if (price > 0 && props.errors?.[name]) props.setErrors((errors) => ({ ...errors, [name]: false }))\r\n props.setState((prev) => ({ ...prev, [name]: price }))\r\n },\r\n [name, props]\r\n )\r\n\r\n const tooltipContent = props.errors?.[name] ? 'Invalid number, please enter a positive number' : undefined\r\n\r\n React.useEffect(() => {\r\n const priceValue = Number(props.state[name] !== '' ? props.state[name] : undefined)\r\n if (!isNaN(priceValue)) setRawValue(priceValue.toString())\r\n }, [name, props.state])\r\n\r\n return (\r\n setRawValue(ev.currentTarget.value)}\r\n onBlur={handleBlur}\r\n tooltipColor=\"red\"\r\n tooltipContent={tooltipContent}\r\n isInteractive\r\n />\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogFooter } from '../../../main/components/dialog'\r\nimport { Paragraph } from '../../../main/components/typography'\r\nimport { useFocusInputOnError } from '../../../main/hooks/use-focus-input-on-error'\r\nimport { TickerEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Ticker'\r\nimport { PortfolioBulkEditRowContextProvider } from '../../../main/modules/portfolio/components/PortfolioBulkEditRowContext'\r\nimport EventCheckboxes from './EventCheckboxes'\r\nimport { PriceInput } from './PriceInput'\r\nimport { CreateAlertEntry, FormErrors } from './types'\r\nimport { submit, validateState } from './utils'\r\n\r\nconst DEFAULT_STATE: CreateAlertEntry = {\r\n ticker: '',\r\n news: false,\r\n rating: false,\r\n insider: false,\r\n priceAbove: '',\r\n priceBelow: '',\r\n}\r\n\r\ntype FormContentProps = {\r\n ticker: string\r\n onSubmit: () => void\r\n onClose?: () => void\r\n}\r\n\r\nexport default function FormContent({ ticker, onSubmit, onClose }: FormContentProps) {\r\n const [state, setState] = React.useState({ ...DEFAULT_STATE, ticker })\r\n const [errors, setErrors] = React.useState({})\r\n const [apiError, setApiError] = React.useState()\r\n const formRef = React.useRef(null)\r\n\r\n useFocusInputOnError(errors)\r\n\r\n const handleSubmit = async (event: React.FormEvent) => {\r\n event.preventDefault()\r\n\r\n const { isValid, errors } = await validateState(state)\r\n setErrors(errors)\r\n\r\n if (!isValid) {\r\n return\r\n }\r\n\r\n const alert = Object.assign(\r\n state,\r\n typeof state.priceAbove === 'string' && { priceAbove: null },\r\n typeof state.priceBelow === 'string' && { priceBelow: null }\r\n )\r\n\r\n const result = await submit(alert)\r\n if (!result.isSuccess) {\r\n setApiError(result.message)\r\n } else {\r\n onSubmit()\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n Get instant email notifications on the selected events.\r\n \r\n {(apiError || errors.isEmpty) && (\r\n \r\n {apiError ?? 'Please choose at least 1 event trigger'}\r\n \r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {onClose && (\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","import { validateTickers } from '../../../main/modules/portfolio/services/api'\r\nimport { createAlertRequest } from '../../../main/services/api'\r\nimport { CreateAlertEntry, FormErrors } from './types'\r\n\r\nexport async function validateState(state: CreateAlertEntry) {\r\n const formErrors: FormErrors = {}\r\n\r\n if (state.ticker !== undefined && state.ticker.trim().length === 0) {\r\n formErrors.ticker = true\r\n } else if (state.ticker !== undefined) {\r\n const validatedTickers = await validateTickers([state.ticker.toUpperCase()])\r\n formErrors.ticker = validatedTickers[0] !== true\r\n }\r\n\r\n if (state.priceAbove !== '' && Number(state.priceAbove) <= 0) {\r\n formErrors.priceAbove = true\r\n }\r\n\r\n if (state.priceBelow !== '' && Number(state.priceBelow) <= 0) {\r\n formErrors.priceBelow = true\r\n }\r\n\r\n const eventTriggers = { ...state, ticker: undefined }\r\n delete eventTriggers.ticker\r\n formErrors.isEmpty = Object.values(eventTriggers).every((trigger) => trigger !== 0 && !trigger)\r\n\r\n return { isValid: !Object.values(formErrors).some(Boolean), errors: formErrors }\r\n}\r\n\r\nexport async function submit(alert: CreateAlertEntry): Promise<{ isSuccess: boolean; message?: string }> {\r\n try {\r\n await createAlertRequest(alert)\r\n return { isSuccess: true }\r\n } catch (error) {\r\n const result = {\r\n isSuccess: false,\r\n message: 'There’s been an error creating the alert, make sure you’re connected to the Internet and try again.',\r\n }\r\n if (!!error && typeof error === 'object' && 'body' in error) {\r\n const apiError = error as { body: string }\r\n result.message = apiError.body\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogFooter } from '../../../main/components/dialog'\r\nimport { Paragraph } from '../../../main/components/typography'\r\n\r\ntype SuccessContentProps = {\r\n onClose?: () => void\r\n}\r\n\r\nexport default function SuccessContent({ onClose }: SuccessContentProps) {\r\n return (\r\n <>\r\n \r\n
\r\n Alert successfully created.\r\n Do you wish to proceed to alerts?\r\n
\r\n
\r\n \r\n {onClose && }\r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { DialogHeader } from '../../../main/components/dialog'\r\nimport FormContent from './FormContent'\r\nimport SuccessContent from './SuccessContent'\r\n\r\ntype CreateAlertProps = {\r\n ticker: string\r\n isInlined?: boolean\r\n onClose?: () => void\r\n}\r\n\r\nexport function CreateAlert({ ticker, onClose, isInlined }: CreateAlertProps) {\r\n const [isSubmitted, setIsSubmitted] = React.useState(false)\r\n\r\n const handleFromSubmitted = () => {\r\n if (isInlined) {\r\n // @ts-ignore\r\n window.location = '/alerts.ashx'\r\n return\r\n }\r\n\r\n setIsSubmitted(true)\r\n }\r\n\r\n return (\r\n <>\r\n Create Alert\r\n\r\n {isSubmitted ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Select, SelectOption } from '../../../main/components/select'\r\nimport { TooltipInput } from '../../../main/components/tooltip-input'\r\nimport { PortfolioOptions, SaveToPortfolioInputProps } from './types'\r\n\r\ntype PortfolioInputProps = {\r\n portfolios: PortfolioOptions\r\n} & SaveToPortfolioInputProps\r\n\r\nexport default function PortfolioInput(props: PortfolioInputProps) {\r\n const handleChange = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n const portfolio = ev.currentTarget.value\r\n if (portfolio.trim().length >= 0 && props.errors?.portfolioName) {\r\n props.setErrors?.((errors) => ({ ...errors, portfolio: false }))\r\n }\r\n\r\n props.setState((prev) => ({ ...prev, portfolioName: portfolio }))\r\n },\r\n [props]\r\n )\r\n\r\n const handleSelect = React.useCallback(\r\n (option: { value: number; label: string }) => {\r\n props.setState((prev) => ({ ...prev, portfolioId: option.value }))\r\n props.setErrors?.((errors) => ({ ...errors, portfolioId: false }))\r\n },\r\n [props]\r\n )\r\n\r\n const tooltipContent = props.errors?.portfolioName ? 'Missing portfolio name' : undefined\r\n\r\n return (\r\n <>\r\n {props.portfolios.length > 0 ? (\r\n
\r\n \r\n \r\n {props.portfolios.map((item) => (\r\n {item.label}\r\n ))}\r\n \r\n
\r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PORTFOLIO_DATE_FORMAT_DATA } from '../../../main/modules/portfolio/constants/general'\r\nimport { portfolioEntry, portfolioTickers, validateTickers } from '../../../main/modules/portfolio/services/api'\r\nimport { PortfolioTransaction } from '../../../main/modules/portfolio/types'\r\nimport { validateEditRow } from '../../../main/modules/portfolio/utils'\r\nimport { portfolioLimitRequest } from '../../../main/services/api'\r\nimport { FormErrors, SaveToPortfolioEntry } from './types'\r\n\r\nexport const PORTFOLIO_BASE_URL = '/portfolio.ashx?pid='\r\n\r\nexport async function validateState(state: SaveToPortfolioEntry) {\r\n const validation = validateEditRow(state, PORTFOLIO_DATE_FORMAT_DATA, false)\r\n const formErrors: FormErrors = { ...validation.errors }\r\n\r\n if (state.portfolioId === 0 && state.portfolioName.trim().length === 0) {\r\n formErrors.portfolioName = true\r\n }\r\n\r\n if (state.portfolioId !== 0) {\r\n const limitResponse = await portfolioLimitRequest(state.portfolioId)\r\n if (!limitResponse || limitResponse.transactions >= limitResponse.limitTransactions) formErrors.portfolioId = true\r\n }\r\n\r\n if (!formErrors.ticker) {\r\n const validatedTickers = await validateTickers([state.ticker.toUpperCase()])\r\n formErrors.ticker = validatedTickers[0] !== true\r\n }\r\n\r\n return { isValid: !Object.values(formErrors).some(Boolean), errors: formErrors }\r\n}\r\n\r\nexport async function submitForm(state: SaveToPortfolioEntry): Promise<{ message?: string; isSuccess: boolean }> {\r\n let pid = state.portfolioId\r\n\r\n try {\r\n if (!!state.portfolioName) {\r\n const createdPortfolioResponse = await portfolioTickers({\r\n tickers: state.ticker,\r\n portfolioName: state.portfolioName,\r\n })\r\n\r\n if (!createdPortfolioResponse) throw new Error()\r\n if (state.transaction === PortfolioTransaction.Watch) return { isSuccess: true }\r\n\r\n pid = createdPortfolioResponse.portfolioId\r\n }\r\n\r\n await portfolioEntry({ pid }, 'POST', state)\r\n return { isSuccess: true }\r\n } catch (error) {\r\n const result = {\r\n message: 'There’s been an error saving to portfolio, make sure you’re connected to the Internet and try again.',\r\n isSuccess: false,\r\n }\r\n\r\n if (!!error && typeof error === 'object' && 'body' in error) {\r\n const apiError = error as { body: { message: string } }\r\n result.message = apiError.body.message\r\n }\r\n\r\n return result\r\n }\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogFooter } from '../../../main/components/dialog'\r\nimport { Paragraph } from '../../../main/components/typography'\r\nimport { useFocusInputOnError } from '../../../main/hooks/use-focus-input-on-error'\r\nimport { CostPerShareEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/CostPerShare'\r\nimport { DateEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Date'\r\nimport { SharesEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Shares'\r\nimport { TickerEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Ticker'\r\nimport { TransactionEditColumn } from '../../../main/modules/portfolio/components/EditableColumns/Transaction'\r\nimport { PortfolioBulkEditRowContextProvider } from '../../../main/modules/portfolio/components/PortfolioBulkEditRowContext'\r\nimport { PORTFOLIO_DATE_FORMAT_DATA, TRANSACTION_LABEL } from '../../../main/modules/portfolio/constants/general'\r\nimport { PortfolioSymbolType, PortfolioTransaction } from '../../../main/modules/portfolio/types'\r\nimport { getTransactionsForSymbolType } from '../../../main/modules/portfolio/utils'\r\nimport { lastCloseRequest, portfoliosRequest } from '../../../main/services/api'\r\nimport PortfolioInput from './PortfolioInput'\r\nimport { FormErrors, PortfolioOptions, SaveToPortfolioEntry } from './types'\r\nimport { submitForm, validateState } from './utils'\r\n\r\nconst DEFAULT_STATE: SaveToPortfolioEntry = {\r\n portfolioId: 0,\r\n portfolioName: '',\r\n ticker: '',\r\n transaction: PortfolioTransaction.Watch,\r\n date: dateFns.format(new Date(), PORTFOLIO_DATE_FORMAT_DATA),\r\n shares: 0,\r\n price: 0,\r\n}\r\n\r\nconst TRANSACTION_OPTIONS = [\r\n PortfolioTransaction.Watch,\r\n ...getTransactionsForSymbolType(PortfolioSymbolType.Stock),\r\n].map((value) => ({ label: TRANSACTION_LABEL[value], value }))\r\n\r\ntype FormContentProps = {\r\n ticker: string\r\n onSubmit: (portfolioId: number) => void\r\n onClose?: () => void\r\n}\r\n\r\nexport default function FormContent({ ticker, onClose, onSubmit }: FormContentProps) {\r\n const [state, setState] = React.useState({ ...DEFAULT_STATE, ticker })\r\n const [errors, setErrors] = React.useState({})\r\n const [portfolios, setPortfolios] = React.useState([])\r\n const [apiError, setApiError] = React.useState()\r\n const formRef = React.useRef(null)\r\n\r\n useFocusInputOnError(errors)\r\n\r\n // fetch portfolios and stock data on mount\r\n React.useEffect(() => {\r\n const fetchPortfolios = async () => {\r\n const response = await portfoliosRequest()\r\n if (response && response.portfolios.length > 0) {\r\n setState((prev) => ({ ...prev, portfolioId: response.portfolios[0].id }))\r\n setPortfolios(response.portfolios.map((p) => ({ value: p.id, label: p.name })))\r\n }\r\n }\r\n const fetchLastClose = async () => {\r\n const lastClose = await lastCloseRequest(ticker)\r\n if (lastClose) {\r\n setState((prev) => ({ ...prev, price: +lastClose }))\r\n }\r\n }\r\n\r\n try {\r\n fetchPortfolios()\r\n if (!!ticker) {\r\n fetchLastClose()\r\n }\r\n } catch (error) {}\r\n\r\n // this should be run only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleSubmit = async (event: React.FormEvent) => {\r\n event.preventDefault()\r\n\r\n const { isValid, errors } = await validateState(state)\r\n setErrors(errors)\r\n\r\n if (!isValid) {\r\n return\r\n }\r\n\r\n const entry = {\r\n ...state,\r\n ...(state.transaction === PortfolioTransaction.Watch && {\r\n date: DEFAULT_STATE.date,\r\n shares: DEFAULT_STATE.shares,\r\n price: DEFAULT_STATE.price,\r\n }),\r\n }\r\n\r\n const result = await submitForm(entry)\r\n if (!result.isSuccess) {\r\n setApiError(result.message)\r\n } else {\r\n onSubmit(state.portfolioId)\r\n }\r\n }\r\n\r\n const commonProps = {\r\n entry: state,\r\n errors,\r\n setState,\r\n setErrors,\r\n isHorizontalLabel: true,\r\n className: 'w-56',\r\n labelClassName: 'flex-row items-center justify-between',\r\n size: 'small' as const,\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {(errors.portfolioId || apiError) && (\r\n \r\n {apiError ?? 'Portfolio limit exceeded, select another portfolio.'}\r\n \r\n )}\r\n \r\n \r\n \r\n {state.transaction !== PortfolioTransaction.Watch && (\r\n <>\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n \r\n {onClose && (\r\n \r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { DialogBody, DialogFooter } from '../../../main/components/dialog'\r\nimport { Paragraph } from '../../../main/components/typography'\r\n\r\ntype SuccessContentProps = {\r\n portfolioUrl: string\r\n onClose?: () => void\r\n}\r\n\r\nexport default function SuccessContent({ portfolioUrl, onClose }: SuccessContentProps) {\r\n return (\r\n <>\r\n \r\n
\r\n Successfully saved to portfolio.\r\n Do you wish to proceed to the portfolio?\r\n
\r\n
\r\n \r\n {onClose && }\r\n \r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { DialogHeader } from '../../../main/components/dialog'\r\nimport FormContent from './FormContent'\r\nimport SuccessContent from './SuccessContent'\r\nimport { PORTFOLIO_BASE_URL } from './utils'\r\n\r\ntype SaveToPortfolioProps = {\r\n ticker: string\r\n isInlined?: boolean\r\n onClose?: () => void\r\n}\r\n\r\nexport function SaveToPortfolio({ ticker, onClose, isInlined }: SaveToPortfolioProps) {\r\n const [isSubmitted, setIsSubmitted] = React.useState(false)\r\n const [portfolioUrl, setPortfolioUrl] = React.useState(PORTFOLIO_BASE_URL)\r\n\r\n const handleFromSubmitted = (portfolioId: number) => {\r\n if (isInlined) {\r\n // @ts-ignore\r\n window.location = PORTFOLIO_BASE_URL + portfolioId\r\n return\r\n }\r\n\r\n setPortfolioUrl(PORTFOLIO_BASE_URL + portfolioId)\r\n setIsSubmitted(true)\r\n }\r\n\r\n return (\r\n <>\r\n Save to Portfolio\r\n\r\n {isSubmitted ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","export enum ScreenerQuery {\r\n View = 'v',\r\n Signal = 's',\r\n Order = 'o',\r\n Tickers = 't',\r\n Filters = 'f',\r\n FilterTab = 'ft',\r\n MapSubtype = 'st',\r\n}\r\n\r\nexport enum ScreenerFilter {\r\n MarketCap = 'cap',\r\n Index = 'idx',\r\n Sector = 'sec',\r\n Industry = 'ind',\r\n AverageVolume = 'sh_avgvol',\r\n}\r\n\r\nexport enum ScreenerAddtionalQuery {\r\n ShowEtf = 'show_etf',\r\n}\r\n\r\nexport enum ScreenerView {\r\n Overview = 11,\r\n Maps = 71,\r\n Bubbles = 72,\r\n}\r\n\r\nexport function eventListenerRegister(el: HTMLElement, eventName: string, handler: (...args: any[]) => any) {\r\n el.addEventListener(eventName, handler)\r\n\r\n return () => {\r\n el.removeEventListener(eventName, handler)\r\n }\r\n}\r\n\r\nexport function textContent(el: HTMLElement) {\r\n return el.textContent || el.innerText\r\n}\r\n\r\nexport function ScreenerGetOptionsList(select: HTMLSelectElement) {\r\n const options = select.getAttribute('data-selected')?.split('|') ?? [],\r\n result = []\r\n for (var i = 0, len = options.length; i < len; i++) {\r\n var option = options[i]\r\n for (var j = 0; j < select.children.length; j++) {\r\n var optionEl = select.children[j] as HTMLOptionElement\r\n if (optionEl.value === option) {\r\n result.push({\r\n key: option,\r\n value: textContent(optionEl),\r\n })\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\nexport function ScreenerRenderCustomModal(select: any) {\r\n const filter = select.getAttribute('data-filter')\r\n const customWrapper = document.getElementById('fsm_' + filter) as HTMLElement\r\n if (customWrapper) {\r\n select.style.display = 'none'\r\n customWrapper.style.display = 'block'\r\n const input = document.getElementById('fsmi_' + filter) as HTMLInputElement\r\n const options = ScreenerGetOptionsList(select)\r\n const arr = []\r\n for (let i = 0, len = options.length; i < len; i++) {\r\n arr.push(options[i].value)\r\n }\r\n input.value = arr.join(', ')\r\n }\r\n}\r\n\r\nconst DATE_REGEX = /^[0-9]{2}[-][0-9]{2}[-][0-9]{4}/\r\n\r\nexport function getIsOptionDateRange(option: string) {\r\n if (!option.includes('x')) return false\r\n\r\n const [from, to] = option.split('x')\r\n const [isValidFromDate, isValidToDate] = [from, to].map((value) => {\r\n if (DATE_REGEX.test(value)) {\r\n return !Number.isNaN(new Date(value.replace(/-/g, '/')).getTime())\r\n }\r\n return false\r\n })\r\n\r\n return isValidFromDate || isValidToDate\r\n}\r\n\r\nexport function getInitialDateFromSelectedValues(selectedValues: string[]) {\r\n const initialDate = selectedValues.find(getIsOptionDateRange)\r\n\r\n if (initialDate) {\r\n return initialDate.split('x').map((date) => (DATE_REGEX.test(date) ? date.replace(/-/g, '/') : undefined))\r\n }\r\n}\r\n\r\nexport function dateRangeToFilterString({ from, to }: { from?: string; to?: string }) {\r\n return from || to ? `${from ?? ''}x${to ?? ''}`.replace(/\\//g, '-') : null\r\n}\r\n\r\n/**\r\n * Creates link for given view & subview and ignores any additional query params\r\n */\r\nexport function getQueryForView(view?: ScreenerView, allowedParams: string[] = [], baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const allowList = [...allowedParams, ...Object.values(ScreenerQuery)]\r\n\r\n /**\r\n * Seems like `query` is a live property, so we can’t use `query.forEach` to delete,\r\n * so we need to copy keys before looping.\r\n * https://stackoverflow.com/questions/60522437\r\n */\r\n const keys = Array.from(query.keys())\r\n\r\n keys.forEach((key) => {\r\n if (!allowList.includes(key)) {\r\n query.delete(key)\r\n }\r\n })\r\n\r\n const [, originalView, settings = 0] = query.get(ScreenerQuery.View)?.match(/(\\d{2})(\\d)/) ?? []\r\n\r\n if (view ?? originalView) {\r\n query.set(ScreenerQuery.View, `${view ?? originalView}${settings}`)\r\n }\r\n\r\n return query\r\n}\r\n\r\n/**\r\n * Parse screener `f` query param to object\r\n */\r\nexport function parseScreenerFilters(baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const filtersString = query.get(ScreenerQuery.Filters)\r\n\r\n if (!filtersString) return {}\r\n\r\n return Object.fromEntries(\r\n filtersString.split(',').map((f) => {\r\n const lastUnderscore = f.lastIndexOf('_')\r\n const key = f.substring(0, lastUnderscore)\r\n const value = f.substring(lastUnderscore + 1)\r\n return [key, value.split('|')]\r\n })\r\n )\r\n}\r\n\r\n/**\r\n * Stringify screener `f` query param\r\n */\r\nexport function stringifyScreenerFilters(filters: Record) {\r\n return Object.entries(filters)\r\n .filter(([, value]) => String(value).length > 0)\r\n .map(([key, value]) => `${key}_${value.join('|')}`)\r\n .join(',')\r\n}\r\n\r\nexport function rangesToFilter(\r\n ranges: {\r\n from: string\r\n to: string\r\n }[],\r\n rangeSuffixes?: string[],\r\n delimiter = 'x',\r\n rangeDelimiter = 'to'\r\n) {\r\n return ranges.reduce((filter, range, index) => {\r\n const { from, to } = range\r\n const rangeStr = from || to ? `${from}${rangeDelimiter}${to}${rangeSuffixes?.[index] ?? ''}` : ''\r\n\r\n let currentFilter = filter\r\n if (index > 0) currentFilter += delimiter\r\n return currentFilter + rangeStr\r\n }, '')\r\n}\r\n","import { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps {\r\n type: string\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n overlays: string[]\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: string\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: 'dark' | 'light'\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: '1h1v',\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n height,\r\n timeframe,\r\n scale: 'linear',\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","import { HTMLAttributeReferrerPolicy } from 'react'\r\n\r\nimport { Instrument } from '../../main/types'\r\nimport { cleanTicker } from '../../main/util'\r\nimport { encodeQueryString } from '../queryString'\r\n\r\nconst DEFAULT_OVERLAYS =\r\n '&o[0][ot]=sma&o[0][op]=50&o[0][oc]=FF8F33C6&o[1][ot]=sma&o[1][op]=200&o[1][oc]=DCB3326D&o[2][ot]=patterns&o[2][op]=&o[2][oc]=000'\r\n\r\nexport function getHoverChartUrl(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange = FinvizSettings.hoverCharts?.stock?.dateRange\r\n): string {\r\n const theme = document.documentElement.classList.contains('dark') ? 'd' : undefined\r\n const overlays = FinvizSettings.hasUserPremium && FinvizSettings.hoverCharts?.stock?.patterns ? DEFAULT_OVERLAYS : ''\r\n const query = encodeQueryString({\r\n cs: 'm',\r\n t: ticker,\r\n tf: timeframe ?? 'd',\r\n ct: 'candle_stick',\r\n r: dateRange,\r\n tm: theme,\r\n })\r\n\r\n let imgUrl = `${FinvizSettings.nodeChartsDomain}/chart.ashx?${query}${overlays}`\r\n\r\n if (escaped) {\r\n // \"Escaping\" [ and ] because of how boxover.js works\r\n imgUrl = imgUrl.replace(/\\[/g, '[[').replace(/]/g, ']]')\r\n }\r\n return imgUrl\r\n}\r\n\r\nfunction timeframeToDeprecatedTimeframe(timeframeString: string) {\r\n switch (timeframeString) {\r\n case 'i1':\r\n case 'i2':\r\n return 'm1'\r\n case 'i3':\r\n return 'm3'\r\n case 'i5':\r\n return 'm5'\r\n case 'i10':\r\n case 'i15':\r\n return 'm15'\r\n case 'i30':\r\n return 'm30'\r\n case 'h':\r\n case 'h2':\r\n case 'h4':\r\n return 'h1'\r\n case 'w':\r\n return 'w1'\r\n case 'm':\r\n return 'mo'\r\n default:\r\n case 'd':\r\n return 'd1'\r\n }\r\n}\r\n\r\nfunction getOldChartsUrl(ticker: string, timeframe: string = 'd1', instrument: Instrument) {\r\n const oldPeriod = timeframeToDeprecatedTimeframe(timeframe)\r\n\r\n switch (instrument) {\r\n case Instrument.Crypto:\r\n case Instrument.Forex:\r\n return `/fx_image.ashx?${cleanTicker(ticker).toLowerCase()}_${oldPeriod}_s.png`\r\n default:\r\n case Instrument.Futures:\r\n return `/fut_image.ashx?${cleanTicker(ticker).toLowerCase()}_${oldPeriod}_s.png`\r\n }\r\n}\r\n\r\nexport function getHoverChartDimensions() {\r\n switch (FinvizSettings.hoverCharts?.stock?.timeframe) {\r\n case 'i3':\r\n case 'i15':\r\n return { width: 584, height: 180 }\r\n case 'i5':\r\n return { width: 376, height: 180 }\r\n case 'd':\r\n if (FinvizSettings.hoverCharts?.stock?.patterns) return { width: 464, height: 230 }\r\n return { width: 324, height: 180 }\r\n default:\r\n return { width: 324, height: 180 }\r\n }\r\n}\r\n\r\nexport function getReferrerPolicy(): HTMLAttributeReferrerPolicy {\r\n return 'no-referrer-when-downgrade'\r\n}\r\n\r\nexport function getHoverChartImg(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange?: string,\r\n instrument: Instrument = Instrument.Stock\r\n) {\r\n const useOldCharts = !FinvizSettings.hasForexFuturesCryptoNodeCharts && instrument !== Instrument.Stock\r\n const chartSize = useOldCharts ? { width: 320, height: 180 } : getHoverChartDimensions()\r\n const referrerPolicy = getReferrerPolicy()\r\n const url = useOldCharts\r\n ? getOldChartsUrl(ticker, timeframe, instrument)\r\n : getHoverChartUrl(ticker, escaped, timeframe, dateRange)\r\n const srcSet = useOldCharts ? '' : getSrcSet(url)\r\n const srcsetString = srcSet?.length ? ` srcset='${srcSet}'` : ''\r\n\r\n return {\r\n img: ``,\r\n ...chartSize,\r\n }\r\n}\r\n\r\nexport function getSrcSet(url: string) {\r\n // You must keep a space after , for refresh to work\r\n return FinvizSettings.hasUserRetinaNodeCharts ? `${url} 1x, ${url}&sf=2 2x` : undefined\r\n}\r\n","const matchesAndroid = navigator.userAgent.match(/Android/i)\r\nconst matchesWebOS = navigator.userAgent.match(/webOS/i)\r\nconst matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\nconst matchesiPad = navigator.userAgent.match(/iPad/i)\r\nconst matchesIPod = navigator.userAgent.match(/iPod/i)\r\nconst matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\nconst matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\nconst matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\nconst isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\nexport function isMobile() {\r\n return !!isMobileDevice\r\n}\r\n\r\nexport function isIphone() {\r\n return !!(matchesIPhone && !matchesiPad)\r\n}\r\n\r\nexport function isIpad() {\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesiPad\r\n}\r\n\r\nexport function isSafariDesktop() {\r\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent) && navigator.maxTouchPoints === 0\r\n}\r\n\r\nexport function isIos() {\r\n return matchesIOSLike && !isSafariDesktop()\r\n}\r\n","import { getDate } from '../header/utils'\r\n\r\n// Keep in sync with the original in charts repo in app/constants/common.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\n/*\r\n * Keep in sync with the original (Utils static method) in charts repo in app/utils.ts\r\n * See line 15, we use getDate instead of convertLocalToNyTime\r\n */\r\nexport function isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = getDate()\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n}\r\n","function getSanitizedSingleTicker(rawTicker: string, specialTickers: string[] = []) {\r\n return rawTicker\r\n .replace(/\\.+/gi, '-')\r\n .split('-')\r\n .map((x) => {\r\n if (specialTickers.includes(x.toUpperCase())) return x\r\n return x.replace(/([^a-z0-9@-])+/gi, '')\r\n })\r\n .filter((x) => !!x)\r\n .join('-')\r\n .toUpperCase()\r\n}\r\n\r\nexport function getSanitizedTicker(rawTicker: string, isMulti = false, specialTickers: string[] = []) {\r\n if (isMulti) {\r\n return rawTicker\r\n .replace(/ /g, ',')\r\n .split(',')\r\n .map((x) => getSanitizedSingleTicker(x, specialTickers))\r\n .filter((x) => !!x)\r\n .join(',')\r\n }\r\n\r\n return getSanitizedSingleTicker(rawTicker, specialTickers)\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import { decodeQueryString, encodeQueryString } from '../queryString'\r\nimport { getCookie, setCookie } from './cookie'\r\n\r\nexport const formatDateToStringUS = (date: Date) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })\r\n\r\nconst DRAWING_QUOTE_PAGE_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabledOnQuotePage() {\r\n return getCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport async function setIsDrawingEnabledOnQuotePage(isEnabled: boolean) {\r\n return fetch('/api/set_cookie.ashx?cookie=' + DRAWING_QUOTE_PAGE_COOKIE_NAME + '&value=' + (isEnabled ? 'on' : 'off'))\r\n .catch(() => {})\r\n .then((res) => {\r\n if (!res?.ok) {\r\n // fallback to JS otherwise draw toggle won't work if API don't work\r\n setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled)\r\n }\r\n\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n}\r\n\r\nfunction setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n setCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function parseInitData(elementId: string): T | undefined {\r\n try {\r\n const initDataElement = document.getElementById(elementId)!\r\n return JSON.parse(initDataElement.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return\r\n }\r\n}\r\n\r\nexport function getSidebarFromCookie() {\r\n const chartsUrl = getCookie('chartsUrl')\r\n const decodedCookie = chartsUrl ? decodeQueryString<{ sidebar?: string }>(chartsUrl) : null\r\n return decodedCookie?.sidebar || undefined\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\ninterface RedGreenTextProps {\r\n value?: number | null\r\n children: any\r\n rightContent?: React.ReactNode\r\n className?: string\r\n rightClass?: string\r\n}\r\n\r\n/**\r\n * Component which renders red/green text based on whether the value is positive or negative if value\r\n * is 0, it will not be colored and it will not display the guide triangle\r\n */\r\nexport function RedGreenText({ value, children, className, rightContent, rightClass }: RedGreenTextProps) {\r\n const hasValue = value && Number.isFinite(value)\r\n\r\n return (\r\n 0,\r\n 'text-red-500 dark:text-red-400': hasValue && value < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n {rightContent === undefined && hasValue && value !== 0 ? (\r\n 0 ? 'arrowUpShort' : 'arrowDownShort'} className=\"block\" />\r\n ) : null}\r\n {rightContent}\r\n \r\n \r\n )\r\n}\r\n\r\n/**\r\n * Used to position multiple lines of RedGreen text, this component will make sure all numbers are\r\n * in line with their `rightContent`\r\n */\r\nexport function RedGreenMultiline({ className, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n
\r\n {React.Children.map(children, (child: React.ReactElement) => {\r\n if (React.isValidElement(child) && child.type === RedGreenText) {\r\n return React.cloneElement(child, {\r\n className: classnames(child.props.className, 'table-row'),\r\n rightClass: 'table-cell align-middle',\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport const Table = React.forwardRef(\r\n (props: React.PropsWithChildren>, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableHead(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n\r\ninterface TableBodyProps extends React.HTMLProps {\r\n spacing?: 'regular' | 'large' | 'none'\r\n}\r\n\r\nexport const TableBody = React.forwardRef(\r\n (\r\n { spacing = 'none', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableFooter(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","export enum TableAlign {\r\n Left,\r\n Center,\r\n Right,\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from './types'\r\n\r\nexport interface TableCellProps extends React.HTMLProps {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n}\r\n\r\nexport function TableCell({\r\n isFirst,\r\n isLast,\r\n align = TableAlign.Left,\r\n hasPadding = true,\r\n className,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { TableAlign } from './types'\r\n\r\nconst TABLE_HEADER_DEFAULT_ELEMENT = 'th'\r\n\r\ninterface SortProps {\r\n isActive: boolean\r\n direction: 1 | -1\r\n}\r\n\r\nfunction TableSortIndicator({ isActive, direction, className }: Partial & { className?: string }) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface TableHeaderProps extends Omit, 'as'> {\r\n isActive?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasHover?: boolean\r\n}\r\n\r\nexport function TableHeader({\r\n as: asComponent,\r\n align,\r\n children,\r\n isActive,\r\n hasPadding = true,\r\n hasHover,\r\n ...props\r\n}: Omit, 'align'> & TableHeaderProps) {\r\n const componentToRender = asComponent ?? TABLE_HEADER_DEFAULT_ELEMENT\r\n\r\n return React.createElement(\r\n componentToRender,\r\n {\r\n ...props,\r\n className: classnames(\r\n props.className,\r\n 'whitespace-nowrap font-normal h-5.5 hover:first:rounded-l-md hover:last:rounded-r-md',\r\n {\r\n 'cursor-pointer hover:select-none hover:bg-gray-200/30 dark:hover:bg-gray-500/30':\r\n hasHover && !props.disabled,\r\n 'text-gray-500 dark:text-gray-300': props.disabled,\r\n 'text-gray-600 dark:text-gray-200': !isActive && !props.disabled,\r\n 'font-medium text-gray-800 dark:text-gray-50': isActive,\r\n 'text-left': align === TableAlign.Left,\r\n 'text-center': align === TableAlign.Center,\r\n 'text-right': align === TableAlign.Right,\r\n 'px-1': hasPadding,\r\n 'p-0': !hasPadding,\r\n }\r\n ),\r\n },\r\n children\r\n )\r\n}\r\n\r\nexport function TableHeaderSortable({\r\n direction,\r\n ...props\r\n}: Omit, 'align'> & Partial & TableHeaderProps) {\r\n const isDisabled = props.disabled === true\r\n\r\n return (\r\n \r\n \r\n {props.align === TableAlign.Right && (\r\n \r\n )}\r\n {props.children}\r\n {props.align !== TableAlign.Right && (\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface TableRowProps extends React.PropsWithChildren> {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n isHoverable?: boolean\r\n}\r\n\r\nexport const TableRow = React.forwardRef(\r\n ({ isFirst, isLast, isHoverable = true, ...props }: TableRowProps, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape, isSortByShape, useSortData } from '../../hooks/use-sort-data'\r\nimport { SortableValue } from '../../types'\r\nimport { SortByColumnOptions } from '../../util'\r\n\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport interface TableSort {\r\n column: ColumnType\r\n direction: SortDirection\r\n}\r\n\r\n/**\r\n * Default sort getter which either gets column matching by `defaultSortId` or returns the first column\r\n */\r\nexport function getDefaultSort(\r\n columns: ColumnType[],\r\n defaultSort?: DefaultSort\r\n): TableSort {\r\n if (defaultSort === null) return { column: null as ColumnType, direction: SortDirection.Ascending }\r\n if (defaultSort && typeof defaultSort === 'object') return defaultSort as unknown as TableSort\r\n\r\n const foundColumn = columns.find((column) => isSortByShape(column) && column.id === defaultSort)\r\n\r\n return {\r\n column: foundColumn ?? (defaultSort as unknown as ColumnType | undefined) ?? columns[0],\r\n direction: SortDirection.Ascending,\r\n }\r\n}\r\n\r\n/**\r\n * Get default sorting from url when persisting sort\r\n */\r\nexport function getDefaultSortFromUrl, OrderType extends string | null>(\r\n columns: ColumnType[],\r\n order?: OrderType,\r\n idKey: keyof ColumnType = 'id'\r\n): TableSort {\r\n if (order === null) return { column: null as unknown as ColumnType, direction: SortDirection.Ascending }\r\n\r\n const isDesc = order?.startsWith('-')\r\n const queryParam = isDesc ? order?.substring(1) : order\r\n const column = columns.find((column) => column[idKey] === queryParam)\r\n\r\n if (column) {\r\n return { column, direction: isDesc ? SortDirection.Descending : SortDirection.Ascending }\r\n } else {\r\n return { column: columns[0], direction: SortDirection.Ascending }\r\n }\r\n}\r\n\r\nexport function saveSortToUrl>(\r\n prev: URLSearchParams,\r\n urlPersistKey: string,\r\n newSort: ColumnType | null,\r\n idKey: keyof ColumnType = 'id',\r\n defaultSort: unknown = null\r\n) {\r\n const newParams = new URLSearchParams(prev)\r\n const previousOrder = newParams.get(urlPersistKey) ?? defaultSort\r\n const isDescOrder = previousOrder?.toString().startsWith('-')\r\n\r\n if (newSort === null) {\r\n newParams.delete(urlPersistKey)\r\n } else {\r\n newParams.set(urlPersistKey, `${!isDescOrder && previousOrder === newSort[idKey] ? '-' : ''}${newSort[idKey]}`)\r\n }\r\n\r\n return newParams\r\n}\r\n\r\ninterface UseTableSortProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> {\r\n data: DataType[]\r\n columns: ColumnType[]\r\n\r\n /**\r\n * You can either provide id of the column or whole shape\r\n * defaultSort: { column: columns[0], direction: -1 }\r\n * If your ids are constants (or enums), you will get name suggestions\r\n */\r\n defaultSort?: DefaultSort\r\n\r\n /**\r\n * Custom value getter. By default these can be defined on every column using `getValueForSort`\r\n */\r\n valueGetter?: (column: ColumnType) => (row: DataType) => SortableValue\r\n\r\n /**\r\n * Additional options for sorting, including ignoring null values or sorting null as last\r\n */\r\n options?: SortByColumnOptions\r\n}\r\n\r\n/**\r\n * This hook has multiple\r\n */\r\nexport function useTableSort<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({ data, columns, defaultSort, valueGetter, options }: UseTableSortProps) {\r\n const [sort, setSort] = React.useState(getDefaultSort(columns, defaultSort) as TableSort)\r\n\r\n const changeSort = React.useCallback((newSort: SortType, direction?: SortDirection) => {\r\n setSort((prevSort) => {\r\n if (newSort && direction) {\r\n return { column: newSort, direction }\r\n }\r\n\r\n if (newSort && prevSort.column?.id === newSort.id) {\r\n return { ...prevSort, direction: prevSort.direction * -1 }\r\n }\r\n\r\n return { column: newSort, direction: SortDirection.Ascending }\r\n })\r\n }, [])\r\n\r\n const sortedData = useSortData({ data, direction: sort.direction, sortBy: sort.column, valueGetter, options })\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n\r\ninterface UseTableSortWithUrlProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> extends UseTableSortProps {\r\n /**\r\n * When set, the sorting will be persisted in the URL. Loading the\r\n *\r\n * @default undefined\r\n */\r\n urlPersistKey?: string\r\n\r\n /**\r\n * Key to get value of the URL sort from a column\r\n * @deafult \"id\"\r\n */\r\n idKey?: keyof ColumnType\r\n}\r\n\r\nexport function useTableSortWithUrl<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({\r\n data,\r\n columns,\r\n defaultSort,\r\n valueGetter,\r\n urlPersistKey,\r\n idKey = 'id',\r\n options,\r\n}: UseTableSortWithUrlProps) {\r\n const {\r\n data: sortedData,\r\n changeSort: changeSortState,\r\n sort,\r\n } = useTableSort({ data, columns, defaultSort, valueGetter, options })\r\n const [searchParams, setSearchParams] = useSearchParams()\r\n const defaultSortRef = React.useRef(\r\n urlPersistKey && typeof defaultSort === 'string'\r\n ? getDefaultSortFromUrl(columns, searchParams.get(urlPersistKey) ?? defaultSort, idKey)\r\n : getDefaultSort(columns, defaultSort)\r\n )\r\n\r\n const changeSort = React.useCallback(\r\n (newSort: SortType) => {\r\n if (urlPersistKey) {\r\n const defaultSort: ColumnType | null = defaultSortRef.current.column\r\n setSearchParams(\r\n (prev) =>\r\n saveSortToUrl(prev, urlPersistKey, newSort, idKey, defaultSort === null ? null : defaultSort[idKey]),\r\n {\r\n preventScrollReset: true,\r\n }\r\n )\r\n }\r\n\r\n changeSortState(newSort)\r\n },\r\n [idKey, setSearchParams, urlPersistKey, changeSortState]\r\n )\r\n\r\n /**\r\n * Update sort from url\r\n */\r\n React.useEffect(() => {\r\n if (!urlPersistKey) return\r\n\r\n const newSort = searchParams.get(urlPersistKey)\r\n if (newSort) {\r\n const sort = getDefaultSortFromUrl(columns, newSort, idKey)\r\n changeSortState(sort.column, sort.direction)\r\n }\r\n }, [columns, idKey, searchParams, urlPersistKey, changeSortState])\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport enum BoxRounding {\r\n none = '',\r\n regular = 'rounded-md', // 6px\r\n}\r\n\r\nexport enum BoxTheme {\r\n none = '',\r\n light = 'bg-white dark:bg-gray-800 border border-gray-100 dark:border-gray-600',\r\n dark = 'bg-gray-800 border border-gray-600',\r\n}\r\n\r\nexport interface BoxProps extends Omit, 'ref'> {\r\n rounding?: keyof typeof BoxRounding\r\n theme?: keyof typeof BoxTheme\r\n}\r\n\r\nexport const Box = React.forwardRef(function Box(\r\n { rounding = 'regular', theme = 'light', ...props }: BoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonRounding, ButtonRoundingType } from '../button'\r\n\r\nexport enum GroupTheme {\r\n light,\r\n dark,\r\n}\r\n\r\nexport interface ButtonGroupProps {\r\n children: React.ReactNode\r\n\r\n /**\r\n * Border radius of entire group wrapper\r\n *\r\n * @default \"regular\"\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n className?: string\r\n\r\n /**\r\n * If a pipe divider between buttons should be rendered\r\n *\r\n * @default true\r\n */\r\n hasDivider?: boolean\r\n\r\n /**\r\n * If group wrapper has a border\r\n *\r\n * @default true\r\n */\r\n hasBorder?: boolean\r\n\r\n /**\r\n * Group color theme\r\n *\r\n * @default \"light\"\r\n */\r\n theme?: keyof typeof GroupTheme\r\n\r\n /**\r\n * Custom button component which extends Button\r\n *\r\n * @default undefined\r\n */\r\n childComponent?: string | React.JSXElementConstructor\r\n}\r\n\r\nfunction getGroupTheme(theme: GroupTheme) {\r\n switch (theme) {\r\n case GroupTheme.dark:\r\n return {\r\n wrapper: 'bg-gray-800 border-gray-600',\r\n divider: 'bg-gray-600',\r\n }\r\n default:\r\n return {\r\n wrapper: 'bg-white dark:bg-gray-800 border-gray-100 dark:border-gray-600',\r\n divider: 'bg-gray-100 dark:bg-gray-600',\r\n }\r\n }\r\n}\r\n\r\nexport function ButtonGroup({\r\n className,\r\n children,\r\n theme = 'light',\r\n hasDivider = true,\r\n hasBorder = true,\r\n rounding = 'regular',\r\n childComponent,\r\n}: ButtonGroupProps) {\r\n const buttonRounding = ButtonRounding[rounding]\r\n const groupTheme = React.useMemo(() => getGroupTheme(GroupTheme[theme]), [theme])\r\n return (\r\n \r\n {React.Children.map(children, (child, index) => {\r\n if (!React.isValidElement(child) || ![Button, childComponent].filter(Boolean).includes(child.type)) {\r\n return child\r\n }\r\n\r\n return (\r\n \r\n {hasDivider && index > 0 &&
}\r\n {React.cloneElement(child as React.ReactElement>, {\r\n rounding: child.props.rounding ?? 'none',\r\n theme: child.props.theme ?? (GroupTheme[theme] === GroupTheme.dark ? 'menuItemDark' : 'menuItem'),\r\n })}\r\n \r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { PropsWithAs } from './types'\r\n\r\nexport const BUTTON_DEFAULT_ELEMENT = 'button'\r\n\r\nexport const BUTTON_BASE_CLASS =\r\n 'flex shrink-0 items-center justify-center font-medium whitespace-nowrap focus:outline-none'\r\nexport const BUTTON_SQUARE_BASE_CLASS = 'shrink-0 justify-center'\r\nexport const BUTTON_FOCUS_STYLES = 'focus-visible:ring-2 ring-gray-200 dark:ring-gray-500'\r\n\r\nexport enum ButtonSize {\r\n none = '', // Do not set fixed dimensions\r\n small = 'text-2xs h-6 min-w-6', // 24px height\r\n regular = 'text-2xs h-7 min-w-7', // 28px height\r\n medium = 'text-sm h-8 min-w-8', // 32px height\r\n large = 'text-sm h-9 min-w-9', // 36px height\r\n}\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum ButtonPadding {\r\n none = '',\r\n small = 'px-1.5', // 6px padding\r\n regular = 'px-2', // 8px padding\r\n medium = 'px-2.5', // 10px padding\r\n large = 'px-3', // 12px padding\r\n}\r\n\r\nexport enum ButtonAlign {\r\n none = '',\r\n left = 'text-left',\r\n center = 'text-center',\r\n right = 'text-right',\r\n}\r\n\r\nexport type ButtonSizeType = keyof typeof ButtonSize\r\n\r\nexport enum ButtonSquareSize {\r\n none = '', // Do not set fixed dimensions\r\n small = 'h-6 w-6', // 24x24px\r\n regular = 'h-7 w-7', // 28x28px\r\n medium = 'h-8 w-8', // 32x32px\r\n large = 'h-9 w-9', // 36x36px\r\n}\r\n\r\nexport enum ButtonRounding {\r\n none = '',\r\n small = 'rounded', // 4px\r\n regular = 'rounded-md', // 6px\r\n full = 'rounded-full', // 9999px\r\n}\r\n\r\nexport type ButtonRoundingType = keyof typeof ButtonRounding\r\n\r\nexport enum ButtonTheme {\r\n transparent, // Only basic shape is rendered\r\n light,\r\n lightTransparent,\r\n dark,\r\n blue,\r\n violet,\r\n blueHover,\r\n red,\r\n headerItem,\r\n menuItem,\r\n menuItemDark,\r\n opacity,\r\n outline,\r\n chipTransparent,\r\n chip,\r\n}\r\n\r\nexport type ButtonThemeType = keyof typeof ButtonTheme\r\n\r\n/**\r\n * Get button theme\r\n */\r\nexport function getButtonTheme(theme: ButtonTheme, active = false) {\r\n switch (theme) {\r\n case ButtonTheme.light: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-gray-200/30 disabled:text-gray-400 disabled:hover:bg-gray-200/30 disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-gray-200/30 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.lightTransparent: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-transparent disabled:text-gray-400 disabled:hover:bg-transparent disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-transparent hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.dark: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-gray-50 active:bg-gray-500/90 disabled:bg-gray-500/30 disabled:text-gray-300 disabled:hover:bg-gray-500/30 disabled:hover:text-gray-300',\r\n {\r\n 'bg-gray-500/30 hover:bg-gray-500/50': !active,\r\n 'bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blue: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white hover:text-white active:bg-blue-600 disabled:bg-blue-200 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-blue-400 hover:bg-blue-500': !active,\r\n 'bg-blue-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.violet: {\r\n return {\r\n button: classnames(\r\n 'text-white hover:text-white disabled:bg-violet-200 dark:disabled:text-gray-300 disabled:hover:bg-violet-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-violet-400 hover:bg-violet-500': !active,\r\n 'bg-violet-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blueHover: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-blue-600 disabled:bg-blue-200 disabled:text-gray-400 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 disabled:hover:text-gray-400 dark:disabled:hover:text-gray-300',\r\n {\r\n 'text-blue-600 hover:bg-blue-400 hover:text-white dark:text-blue-500 dark:hover:text-white': !active,\r\n 'bg-blue-400 text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.red: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white active:bg-red-600 disabled:bg-red-200 disabled:text-gray-300 disabled:hover:bg-red-200 disabled:hover:text-gray-300',\r\n {\r\n 'bg-red-400 hover:bg-red-500': !active,\r\n 'bg-red-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.headerItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent bg-gray-800 text-gray-300 hover:bg-gray-900 hover:text-white disabled:hover:text-gray-300 disabled:bg-gray-700 disabled:hover:bg-gray-700' // Base\r\n ),\r\n icon: 'text-white',\r\n }\r\n }\r\n case ButtonTheme.menuItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent dark:disabled:hover:bg-transparent disabled:hover:bg-transparent',\r\n {\r\n 'hover:bg-gray-200/30 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-500/30':\r\n !active,\r\n 'bg-gray-200/30 dark:bg-gray-500/30': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.menuItemDark: {\r\n return {\r\n button: classnames('border border-transparent text-white dark:disabled:hover:bg-transparent', {\r\n 'hover:bg-gray-700': !active,\r\n 'bg-gray-700': active,\r\n }),\r\n }\r\n }\r\n case ButtonTheme.opacity:\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:opacity-50 disabled:hover:opacity-50 dark:text-gray-400',\r\n {\r\n 'opacity-70 hover:opacity-100': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.outline:\r\n return {\r\n button: classnames(\r\n // Base styles\r\n 'border border-gray-100 active:border-blue-400 disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 disabled:hover:border-gray-100 disabled:hover:bg-gray-50 disabled:hover:text-gray-500',\r\n // Dark styles\r\n 'dark:border-gray-600 dark:bg-gray-800 dark:text-gray-50 dark:active:border-blue-400 dark:disabled:border-transparent dark:disabled:bg-gray-700 dark:disabled:text-gray-400 dark:disabled:hover:border-transparent dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-400',\r\n {\r\n 'border-blue-400 dark:border-blue-400': active,\r\n 'hover:border-gray-300 dark:hover:border-gray-400': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chip:\r\n return {\r\n button: classnames('border dark:disabled:hover:bg-gray-700 disabled:hover:bg-gray-50', {\r\n 'border-transparent bg-gray-200/30 hover:bg-gray-200/30 dark:bg-gray-700 dark:hover:bg-gray-500/30': !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-500/30 dark:text-white': active,\r\n }),\r\n }\r\n case ButtonTheme.chipTransparent:\r\n return {\r\n button: classnames(\r\n 'border dark:disabled:hover:bg-transparent disabled:hover:bg-transparent dark:disabled:hover:text-gray-400 disabled:hover:text-gray-500', // Base styles\r\n {\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-500/30 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Export Button html props type so we don’t always have to omit\r\n */\r\nexport type ButtonHTMLProps = Omit, 'ref' | 'type' | 'size' | 'content' | 'align'>\r\n\r\nexport interface ButtonProps {\r\n /**\r\n * Visual appearance of the button\r\n */\r\n theme?: ButtonThemeType\r\n\r\n /**\r\n * Sets if button is square or normal.\r\n *\r\n * @default 'regular'\r\n */\r\n appearance?: 'regular' | 'square'\r\n\r\n /**\r\n * Size of the button\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: ButtonSizeType\r\n\r\n /**\r\n * Override align of the text for a button\r\n *\r\n * @default center, left when `leftContent` or `rightContent` are defined\r\n */\r\n align?: keyof typeof ButtonAlign\r\n\r\n /**\r\n * Override button padding\r\n *\r\n * @default undefined\r\n */\r\n padding?: keyof typeof ButtonPadding\r\n\r\n /**\r\n * Render button in an active state (darker background, etc.)\r\n */\r\n active?: boolean\r\n\r\n /**\r\n * Sets if the button has focus ring\r\n *\r\n * @default true\r\n */\r\n focusRing?: boolean\r\n\r\n /**\r\n * Sets rounded corners for the button\r\n *\r\n * @default regular\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n /**\r\n * Class for the content wrapper\r\n */\r\n contentClass?: string\r\n\r\n /**\r\n * Name of left icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Name of right icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n}\r\n\r\nexport type ButtonComponentProps =\r\n PropsWithAs & ButtonProps\r\n\r\nfunction ButtonComponent(\r\n {\r\n as: asComponent,\r\n theme = 'light',\r\n size = 'regular',\r\n rounding = 'regular',\r\n focusRing = true,\r\n appearance = 'regular',\r\n align,\r\n padding = size, // same as size\r\n active,\r\n contentClass,\r\n leftContent,\r\n rightContent,\r\n className,\r\n children,\r\n ...props\r\n }: ButtonComponentProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSquare = appearance === 'square'\r\n const buttonTheme = React.useMemo(() => getButtonTheme(ButtonTheme[theme], active), [theme, active])\r\n const buttonPadding = React.useMemo(() => (isSquare ? null : ButtonPadding[padding]), [isSquare, padding])\r\n const buttonSize = isSquare ? ButtonSquareSize[size] : ButtonSize[size]\r\n const buttonRounding = ButtonRounding[rounding]\r\n const hasIcons = leftContent || rightContent\r\n\r\n return React.createElement(\r\n asComponent ?? BUTTON_DEFAULT_ELEMENT,\r\n {\r\n ...props,\r\n ref,\r\n className: classnames(\r\n BUTTON_BASE_CLASS,\r\n buttonTheme.button,\r\n buttonPadding,\r\n buttonSize,\r\n buttonRounding,\r\n {\r\n [BUTTON_SQUARE_BASE_CLASS]: isSquare,\r\n [BUTTON_FOCUS_STYLES]: focusRing,\r\n },\r\n className\r\n ),\r\n },\r\n <>\r\n {leftContent && (\r\n
\r\n {isValidIconName(leftContent) ? : leftContent}\r\n
\r\n )}\r\n {children && !isSquare ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n )}\r\n {rightContent && (\r\n
\r\n {isValidIconName(rightContent) ? : rightContent}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const Button = React.forwardRef(ButtonComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & ButtonProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\ninterface CheckboxProps extends Omit, 'label'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n isSmall?: boolean\r\n}\r\n\r\nfunction CheckboxComponent(\r\n { className, label, isSmall, children, ...props }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && }\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\r\n )\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverProps, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Hides color picker when clicked outside of popover,\r\n * works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside: PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Popover overlay click callback, if nothing's provided it calls hide when clicked outside of popover on its overlay\r\n * If false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n hideOnClickOutside = true,\r\n onOverlayClick,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n )\r\n}\r\n","/**\r\n * Used for reakit as the duration of a open/close animation. The animation itself is done using css\r\n */\r\nexport const COMPONENT_ANIMATION_DURATION = 250\r\n","import copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: NodeJS.Timeout\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { CalendarProps } from 'react-calendar'\r\n\r\nimport { Box } from '../box'\r\nimport { ZIndexContext, getExtendedDialogState } from '../dialog'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nconst DatePickerComponent = React.lazy(() => import('./picker'))\r\n\r\ntype RangePickerCallback = (value: [Date, Date], ev: React.ChangeEvent) => void\r\ntype PickerCallback = (value: Date, ev: React.ChangeEvent) => void\r\n\r\ninterface DatePickerProps extends Omit {\r\n /**\r\n * Trigger element for the picker\r\n */\r\n children: JSX.Element\r\n\r\n onChange: PickerCallback | RangePickerCallback\r\n\r\n zIndex?: string\r\n}\r\n\r\nexport function StatelessDatePicker({\r\n state,\r\n children,\r\n zIndex,\r\n ...props\r\n}: DatePickerProps & { state: ReturnType; zIndex?: string }) {\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n return (\r\n <>\r\n \r\n {(triggerProps: React.HTMLProps) =>\r\n React.Children.map(children, (child) => {\r\n if (React.isValidElement(child))\r\n return React.cloneElement(child, { ...triggerProps, ...(child.props as any) })\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n ) => {\r\n state.hide()\r\n props.onChange?.(value, ev)\r\n }}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport function DatePicker(props: DatePickerProps) {\r\n const popover = usePopoverState()\r\n\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport const ZIndexContext = React.createContext('z-50')\r\n\r\nexport function useZIndex() {\r\n return React.useContext(ZIndexContext)\r\n}\r\n\r\nexport type DialogStateReturn = ReturnType\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function useDialogState(settings?: Reakit.DialogInitialState) {\r\n return Reakit.useDialogState({ ...settings, animated: COMPONENT_ANIMATION_DURATION })\r\n}\r\n\r\nexport const DialogDragContext = React.createContext<{\r\n enabled?: boolean\r\n handleRef?: React.RefObject\r\n boxPosition: { x: number; y: number }\r\n resetBoxPosition: () => void\r\n setBoxPosition: React.Dispatch>\r\n}>({\r\n enabled: false,\r\n handleRef: undefined,\r\n boxPosition: { x: 0, y: 0 },\r\n resetBoxPosition: () => {},\r\n setBoxPosition: () => {},\r\n})\r\n\r\n/**\r\n * Hook which allows an element on the page to become draggable\r\n */\r\nexport function useDrag(enabled?: boolean) {\r\n const dragging = React.useRef(false)\r\n const handleRef = React.useRef(null)\r\n const handleElement = handleRef.current\r\n\r\n /**\r\n * Set box position in both state for the component to re-render and as a ref\r\n * so that we don’t have to re-run the whole effect on every change\r\n */\r\n const [boxPosition, setBoxPosition] = React.useState({ x: 0, y: 0 })\r\n const boxPositionRef = React.useRef({ x: 0, y: 0 })\r\n const dragDiff = React.useRef({ x: 0, y: 0 })\r\n\r\n const { current: resetBoxPosition } = React.useRef(() => {\r\n setBoxPosition({ x: 0, y: 0 })\r\n })\r\n\r\n React.useEffect(() => {\r\n boxPositionRef.current = { ...boxPosition }\r\n }, [boxPosition])\r\n\r\n React.useEffect(() => {\r\n if (!enabled || !handleElement || isMobile()) return\r\n\r\n const onMouseDown = (ev: MouseEvent) => {\r\n dragging.current = true\r\n\r\n dragDiff.current = {\r\n x: ev.pageX - boxPositionRef.current.x - window.scrollX,\r\n y: ev.pageY - boxPositionRef.current.y - window.scrollY,\r\n }\r\n }\r\n\r\n const onMouseUp = () => {\r\n dragging.current = false\r\n }\r\n\r\n const onMouseMove = (ev: MouseEvent) => {\r\n if (!dragging.current) return\r\n\r\n const x = ev.pageX - dragDiff.current.x - window.scrollX\r\n const y = ev.pageY - dragDiff.current.y - window.scrollY\r\n\r\n setBoxPosition({ x, y })\r\n }\r\n\r\n handleElement.addEventListener('pointerdown', onMouseDown)\r\n handleElement.addEventListener('dblclick', resetBoxPosition)\r\n window.addEventListener('pointerup', onMouseUp)\r\n document.body.addEventListener('pointermove', onMouseMove)\r\n\r\n return () => {\r\n handleElement.removeEventListener('pointerdown', onMouseDown)\r\n handleElement.removeEventListener('dblclick', resetBoxPosition)\r\n window.removeEventListener('pointerup', onMouseUp)\r\n document.body.removeEventListener('pointermove', onMouseMove)\r\n }\r\n }, [enabled, handleElement, resetBoxPosition])\r\n\r\n return {\r\n enabled,\r\n handleRef,\r\n boxPosition,\r\n setBoxPosition,\r\n resetBoxPosition,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { Box, BoxProps } from '../box'\r\nimport { DialogDragContext } from './hooks'\r\n\r\n/**\r\n * Public props for the component\r\n */\r\nexport type DialogBoxProps = BoxProps\r\n\r\ninterface DialogBoxOwnProps extends DialogBoxProps {\r\n /**\r\n * This callback serves as a way to account for the time between dialog close\r\n * and animation finish. The box isn’t rendered when the dialog closes but we still\r\n * want to display content when the dialog is closing\r\n */\r\n onUnmount?: () => void\r\n}\r\n\r\n/**\r\n * Dialog content container\r\n */\r\nexport function DialogBox({ onUnmount, style, ...props }: React.PropsWithChildren) {\r\n const wrapperRef = React.useRef(null)\r\n const { setElementRef, elementHeight } = useElementMeasure()\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n React.useEffect(() => {\r\n const onResize = () => {\r\n const { top = 0, bottom = 0, left = 0, right = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n const { clientHeight, clientWidth } = window.document.documentElement\r\n if (top < 0 || bottom > clientHeight || left < 0 || right > clientWidth) {\r\n dialogDrag.resetBoxPosition()\r\n }\r\n }\r\n\r\n window.addEventListener('resize', onResize)\r\n onResize()\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n onUnmount?.()\r\n }\r\n // Set up an effect which only calls resetBoxPosition which is ref fn with state setter call and the unmount callback\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n setElementRef(wrapperRef.current)\r\n }, [setElementRef])\r\n\r\n React.useEffect(() => {\r\n dialogDrag.setBoxPosition((prevPosition) => {\r\n const { top = 0 } = dialogDrag.handleRef?.current?.getBoundingClientRect() ?? {}\r\n return { ...prevPosition, y: prevPosition.y - Math.min(top, 0) }\r\n })\r\n // We want to call it only on elementHeight change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [elementHeight])\r\n\r\n const dialogBoxStyle = React.useMemo(() => {\r\n if (dialogDrag.enabled) {\r\n return { ...style, transform: `translate3d(${dialogDrag.boxPosition.x}px, ${dialogDrag.boxPosition.y}px, 0)` }\r\n }\r\n return style\r\n }, [style, dialogDrag])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\n/**\r\n * The backdrop of the dialog, closes the dialog on click\r\n */\r\nexport function DialogOverlay(props: React.HTMLProps) {\r\n return (\r\n \r\n )\r\n}\r\n","export function getExtendedDialogState(state: { visible: boolean; animating: boolean }) {\r\n return {\r\n isFullyOpened: state.visible && !state.animating,\r\n isFullyClosed: !state.visible && !state.animating,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { ChildPosition, getFlexAlignClasses } from '../../util'\r\nimport { DialogBox, DialogBoxProps } from './dialog-box'\r\nimport { DialogOverlay } from './dialog-overlay'\r\nimport { DialogDragContext, DialogStateReturn, ZIndexContext, useDrag } from './hooks'\r\nimport { getExtendedDialogState } from './utils'\r\n\r\nexport enum DialogType {\r\n modal,\r\n drawer,\r\n}\r\n\r\nexport interface DialogProps extends DialogBoxProps, Pick {\r\n /**\r\n * The returned object from `useDialogState`\r\n */\r\n state: DialogStateReturn\r\n\r\n /**\r\n * Any additional props to the Reakit Dialog component\r\n */\r\n finalFocusRef?: React.RefObject\r\n\r\n /**\r\n * Callback which is called when the dialog closes and all animations complete\r\n */\r\n onHide?: () => void\r\n\r\n /**\r\n * Callback which is called when the dialog overlay is clicked\r\n * default behavior (closing the dialog) will be overridden so it has to be called manually\r\n */\r\n onOverlayClick?: () => void\r\n\r\n /**\r\n * Sets if the dialog can be dragged across the screen\r\n *\r\n * @default false\r\n */\r\n isDraggable?: boolean\r\n\r\n /**\r\n * Type of dialog\r\n *\r\n * @default modal\r\n */\r\n type?: keyof typeof DialogType\r\n\r\n /**\r\n * Dialog position on the screen\r\n *\r\n * @default center\r\n */\r\n position?: keyof typeof ChildPosition\r\n\r\n overlayClass?: string\r\n\r\n /**\r\n * Sets if backdrop overlay prevents interaction with rest of page, onOverlayClick will have no effect if isBackdropDisabled is true\r\n *\r\n * @default false\r\n */\r\n isBackdropDisabled?: boolean\r\n}\r\n\r\nconst DIALOG_BACKDROP_WIDTH_CSS_VAR = '--dialog-backgrop-width'\r\n\r\nconst onResize = () => {\r\n // Save to css var because it can change and that could make modal dialog jump on open\r\n document.body.style.setProperty(DIALOG_BACKDROP_WIDTH_CSS_VAR, `${document.documentElement.clientWidth}px`)\r\n}\r\n\r\n/**\r\n * The actual dialog component which renders overlay, box and handles all the\r\n * functionality like focus trapping, etc.\r\n */\r\nexport function Dialog({\r\n state,\r\n finalFocusRef,\r\n onHide,\r\n onOverlayClick,\r\n children,\r\n hide,\r\n hideOnEsc,\r\n isDraggable = false,\r\n position = 'center',\r\n isBackdropDisabled = false,\r\n type = 'modal',\r\n overlayClass,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = useDrag(isDraggable)\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n\r\n React.useEffect(() => {\r\n if (isFullyClosed) {\r\n return\r\n }\r\n\r\n window.addEventListener('resize', onResize)\r\n onResize()\r\n\r\n return () => {\r\n window.removeEventListener('resize', onResize)\r\n }\r\n }, [isFullyClosed])\r\n\r\n if (isFullyClosed) {\r\n return null\r\n }\r\n\r\n const DialogWrapper = state.modal ? React.Fragment : Portal\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n {!isBackdropDisabled && (\r\n \r\n )}\r\n \r\n \r\n {\r\n onHide?.()\r\n dialogDrag.resetBoxPosition()\r\n }}\r\n >\r\n {children}\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\n\r\ninterface DialogBodyProps extends React.HTMLProps {\r\n /**\r\n * Whether or not the dialog body will have padding\r\n *\r\n * @default true\r\n */\r\n hasPadding?: boolean\r\n}\r\n\r\n/**\r\n * Content wrapper which handles scrolling on mobile\r\n */\r\nexport function DialogBody({ hasPadding = true, ...props }: React.PropsWithChildren) {\r\n const scrollDivRef = React.useRef(null)\r\n\r\n React.useEffect(() => {\r\n const scrollBox = scrollDivRef.current\r\n\r\n if (isMobile() && scrollBox) {\r\n disableBodyScroll(scrollBox)\r\n\r\n return () => enableBodyScroll(scrollBox)\r\n }\r\n }, [])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { Dialog, DialogProps } from './dialog'\r\nimport { DialogBody } from './dialog-body'\r\nimport { DialogStateReturn } from './hooks'\r\n\r\ninterface ConfirmationDialogProps {\r\n state: DialogStateReturn\r\n title: React.ReactNode\r\n actions: React.ReactNode\r\n 'aria-label': string\r\n position?: DialogProps['position']\r\n}\r\n\r\nexport function ConfirmationDialog({ position, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n \r\n \r\n {props.title}\r\n \r\n {props.children}\r\n
{props.actions}
\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Dialog'\r\n\r\nimport { DropdownContext } from '../dropdown'\r\nimport { DialogStateReturn } from './hooks'\r\n\r\ninterface DialogButtonProps extends Reakit.DialogDisclosureHTMLProps {\r\n state: DialogStateReturn\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const DialogTrigger = React.forwardRef(\r\n ({ state, ...props }: DialogButtonProps, ref: React.ForwardedRef) => {\r\n const dropdownContext = React.useContext(DropdownContext)\r\n\r\n return (\r\n ) => {\r\n // Close dropdown if we’re inside one\r\n dropdownContext?.root.hide()\r\n props.onClick?.(ev)\r\n }}\r\n >\r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface DialogFooterProps extends React.HTMLProps {\r\n padding?: boolean\r\n}\r\n\r\n/**\r\n * Footer container which renders border and aligns items to right\r\n */\r\nexport function DialogFooter({ padding = true, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { Icon } from '../icon'\r\nimport { Heading } from '../typography'\r\nimport { DialogDragContext } from './hooks'\r\n\r\ninterface DialogHeaderProps {\r\n /**\r\n * Callback when user clicks on close button. The button will be hidden if not set\r\n */\r\n onCloseClick?: () => void\r\n\r\n /**\r\n * Additional class names for the component\r\n */\r\n className?: string\r\n\r\n /**\r\n * Whether or not the dialog header will have default horizontal padding\r\n *\r\n * @default true\r\n */\r\n hasHorizontalPadding?: boolean\r\n\r\n /**\r\n * Whether or not the dialog header will have default min height\r\n *\r\n * @default true\r\n */\r\n hasMinHeight?: boolean\r\n\r\n /**\r\n * Whether or not the dialog header children should be rendered as Heading\r\n *\r\n * @default true\r\n */\r\n asHeading?: boolean\r\n}\r\n\r\n/**\r\n * Component which renders title and a close button\r\n */\r\nexport function DialogHeader({\r\n onCloseClick,\r\n children,\r\n className,\r\n hasHorizontalPadding = true,\r\n hasMinHeight = true,\r\n asHeading = true,\r\n}: React.PropsWithChildren) {\r\n const dialogDrag = React.useContext(DialogDragContext)\r\n\r\n return (\r\n \r\n {children &&\r\n (asHeading ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n ))}\r\n {onCloseClick && (\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type DropdownStateReturn = ReturnType\r\n\r\nexport const DropdownContext = React.createContext<{\r\n parent: Reakit.MenuStateReturn\r\n root: Reakit.MenuStateReturn\r\n} | null>(null)\r\n\r\nexport function useDropdownState(settings?: Reakit.MenuInitialState) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return Reakit.useMenuState({\r\n ...settings,\r\n loop: true,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n unstable_virtual: true,\r\n unstable_offset: context?.root ? [-5, 4] : [0, 5],\r\n modal: false,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { Box, BoxProps, BoxRounding } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { DropdownContext, useDropdownState } from './hooks'\r\n\r\ninterface DropdownBaseProps extends Omit {\r\n /**\r\n * Trigger button for the dropdown\r\n */\r\n label: JSX.Element\r\n\r\n /**\r\n * @private\r\n * Any additional props to the trigger button. Used by nested dropdown wrapper\r\n */\r\n triggerProps?: Reakit.MenuButtonHTMLProps\r\n\r\n /**\r\n * Rounding of all trigger button, dropdown wrapper and dropdown items\r\n */\r\n rounding?: keyof typeof BoxRounding\r\n}\r\n\r\ninterface RootDropdownProps {\r\n /**\r\n * The returned object from `useDropdownState`. For nested dropdowns use the `isNested` prop\r\n */\r\n state: Reakit.MenuStateReturn\r\n isNested?: never\r\n /**\r\n * When set to true the dropdown will not render in Portal and will not use position absolute + transform.\r\n */\r\n isStatic?: boolean\r\n}\r\n\r\ninterface NestedDropdownProps {\r\n state?: never\r\n /**\r\n * When set to true the dropdown will compute its own state. Only usable with\r\n * nested dropdowns\r\n */\r\n isNested: true\r\n\r\n isStatic?: never\r\n}\r\n\r\ntype DropdownProps = DropdownBaseProps & (RootDropdownProps | NestedDropdownProps)\r\n\r\nfunction DropdownComponent(\r\n {\r\n label,\r\n triggerProps,\r\n state,\r\n 'aria-label': ariaLabel,\r\n children,\r\n isNested,\r\n rounding,\r\n isStatic,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const zIndex = useZIndex()\r\n const context = React.useContext(DropdownContext)\r\n // Required due to the way conditional props work\r\n const dropdownState = state!\r\n const { isFullyClosed } = getExtendedDialogState(state ?? { visible: false, animating: false })\r\n\r\n if (!isNested && !dropdownState) {\r\n throw new Error('Dropdowns require either `state` or `isNested` prop defined!')\r\n }\r\n\r\n const ContainerElement = React.useRef(isNested || isStatic ? React.Fragment : Portal).current\r\n\r\n return (\r\n <>\r\n \r\n {(buttonProps) =>\r\n React.cloneElement(label, {\r\n ...buttonProps,\r\n ...label.props,\r\n rounding,\r\n active: label.props.active ?? dropdownState.visible,\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === Dropdown) {\r\n return {child}\r\n }\r\n\r\n return React.cloneElement(child, {\r\n ...child.props,\r\n rounding,\r\n })\r\n })}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(DropdownComponent)\r\n\r\ninterface NestedDropdownWrapperProps {\r\n /**\r\n * State of parrent dropdown to be passed to MenuItem for correct navigation\r\n * handling\r\n */\r\n parentState: Reakit.MenuStateReturn\r\n\r\n /**\r\n * Nested dropdown element\r\n */\r\n children: JSX.Element\r\n}\r\n\r\n/**\r\n * The `useDropdownState` requires parent context to be defined in order to work\r\n * with nested Dropdowns. So we need to create a wrapper to be able to get to the\r\n * parent context\r\n */\r\nfunction NestedDropdownWrapper({ parentState, children }: NestedDropdownWrapperProps) {\r\n const state = useDropdownState()\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(children, { ...children.props, triggerProps: itemProps, state })}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\n/**\r\n * When rendering multiple dropdowns, wrap them in `DropdownBar` so they can be\r\n * navigated between\r\n */\r\nexport function DropdownBar({ children, ...props }: Partial) {\r\n const state = Reakit.useMenuBarState()\r\n\r\n return (\r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n return (\r\n \r\n {(itemProps) => React.cloneElement(child, itemProps)}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Menu'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { Icon, isValidIconName } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { DropdownContext } from './hooks'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\ninterface DropdownItemProps extends ButtonProps {\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Whether clicking the item should also close the dropdown. Only applies to\r\n * items without a submenu\r\n *\r\n * @default true\r\n */\r\n closeOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent(\r\n {\r\n as: asComponent,\r\n state,\r\n subtitle,\r\n closeOnClick = true,\r\n children,\r\n rounding,\r\n size,\r\n ...props\r\n }: PropsWithAs & DropdownItemProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = React.useContext(DropdownContext)\r\n\r\n return (\r\n \r\n {(itemProps) => {\r\n const active = itemProps['aria-selected'] && !context?.parent.animating\r\n const hasSubmenu = Boolean(itemProps['aria-haspopup'])\r\n\r\n const iconTheme = {\r\n 'text-gray-300': !active,\r\n 'text-gray-white dark:text-white': active,\r\n }\r\n\r\n return (\r\n \r\n ) : (\r\n props.leftContent\r\n )\r\n }\r\n rightContent={\r\n isValidIconName(props.rightContent) ? (\r\n \r\n ) : (\r\n props.rightContent\r\n )\r\n }\r\n onClick={(ev: React.MouseEvent) => {\r\n // Close if we clicked on an item which doesn’t have a submenu\r\n if (closeOnClick && !hasSubmenu) {\r\n context?.root.hide()\r\n }\r\n\r\n itemProps.onClick?.(ev)\r\n }}\r\n >\r\n {children}\r\n {subtitle &&
{subtitle}
}\r\n \r\n )\r\n }}\r\n
\r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const DropdownItem = React.forwardRef(DropdownItemComponent) as <\r\n TagType extends React.ElementType = typeof DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & DropdownItemProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Reakit from 'reakit/Menu'\r\n\r\nimport { Paragraph } from '../typography'\r\n\r\nexport function DropdownSeparator(props: Partial) {\r\n return (\r\n \r\n
\r\n {props.children && (\r\n \r\n {props.children}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { Icon } from '../icon'\r\nimport { Dropdown } from './dropdown'\r\nimport { useDropdownState } from './hooks'\r\n\r\ninterface MoreButtonDropdownProps extends ButtonProps {\r\n /**\r\n * Children of the button\r\n */\r\n label?: React.ReactNode\r\n\r\n /**\r\n * Additional handler when user clicks on the button\r\n */\r\n onClick?: (event: React.MouseEvent) => void\r\n\r\n /**\r\n * Accessibility label for the dropdown component\r\n */\r\n 'aria-label': string\r\n}\r\n\r\nexport function MoreButtonDropdown({\r\n label,\r\n children,\r\n onClick,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const state = useDropdownState({ placement: 'bottom-end' })\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {children}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n /**\r\n * Icon name\r\n */\r\n name?: IconNameType\r\n\r\n /**\r\n * Alternative way to pass icon to render if you want to render a custom component\r\n * or use `iconList` object lookup\r\n */\r\n as?: React.FC\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, ...props }: IconProps) {\r\n const Component = name && iconList[name] ? iconList[name] : asComponent\r\n\r\n if (name && asComponent) {\r\n throw new Error('Specifying both \"name\" and \"as\" on Icon component is not supported')\r\n }\r\n\r\n if (!Component) {\r\n throw new Error('No icon to render!')\r\n }\r\n\r\n return \r\n}\r\n","import { IconAdd } from './add'\r\nimport { IconArrowDownShort } from './arrow-down-short'\r\nimport { IconArrowForward } from './arrow-forward'\r\nimport { IconArrowUpShort } from './arrow-up-short'\r\nimport { IconBriefcase } from './briefcase'\r\nimport { IconCalendar } from './calendar'\r\nimport { IconCandleBarBasic } from './candle-bar-basic'\r\nimport { IconCandleBarHeikinAshi } from './candle-bar-heikin-ashi'\r\nimport { IconCandleBarHollow } from './candle-bar-hollow'\r\nimport { IconCaretDown } from './caret-down'\r\nimport { IconCaretLeft } from './caret-left'\r\nimport { IconCaretRight } from './caret-right'\r\nimport { IconCaretUp } from './caret-up'\r\nimport { IconCaretVertical } from './caretVertical'\r\nimport { IconChartBar } from './chart-bar'\r\nimport { IconChartBubble } from './chart-bubble'\r\nimport { IconChartPie } from './chart-pie'\r\nimport { IconChartTable } from './chart-table'\r\nimport { IconChartTreemap } from './chart-treemap'\r\nimport { IconChevronDown } from './chevron-down'\r\nimport { IconChevronRight } from './chevron-right'\r\nimport { IconClose } from './close'\r\nimport { IconDarkMode } from './dark-mode'\r\nimport { IconDiamondOutlined } from './diamond-outlined'\r\nimport { IconDone } from './done'\r\nimport { IconDrag } from './drag'\r\nimport { IconDraw } from './draw'\r\nimport { IconDrawingActionDelete } from './drawing-action-delete'\r\nimport { IconDrawingSettingAutosaveOff } from './drawing-setting-autosave-off'\r\nimport { IconDrawingSettingAutosaveOn } from './drawing-setting-autosave-on'\r\nimport { IconDrawingSettingAutosaveSaving } from './drawing-setting-autosave-saving'\r\nimport { IconDrawingSettingDrawingMode } from './drawing-setting-drawing-mode'\r\nimport { IconDrawingSettingDrawingModeActive } from './drawing-setting-drawing-mode-active'\r\nimport { IconDrawingSettingHide } from './drawing-setting-hide'\r\nimport { IconDrawingSettingLock } from './drawing-setting-lock'\r\nimport { IconDrawingSettingPreserveDrawings } from './drawing-setting-preserve-drawings'\r\nimport { IconDrawingSettingPreserveDrawingsActive } from './drawing-setting-preserve-drawings-active'\r\nimport { IconDrawingSettingShow } from './drawing-setting-show'\r\nimport { IconDrawingSettingUnlock } from './drawing-setting-unlock'\r\nimport { IconExitFullscreen } from './exit-fullscreen'\r\nimport { IconFlash } from './flash'\r\nimport { IconFullscreen } from './fullscreen'\r\nimport { IconGesture } from './gesture'\r\nimport { IconGift } from './gift'\r\nimport { IconHamburger } from './hamburger'\r\nimport { IconHelp } from './help'\r\nimport { IconIdea } from './idea'\r\nimport { IconIdeaLoad } from './idea-load'\r\nimport { IconIdeaSave } from './idea-save'\r\nimport { IconInfo } from './info'\r\nimport { IconInterval } from './interval'\r\nimport { IconLayout1h1v } from './layout-1h1v'\r\nimport { IconLayout1h2v } from './layout-1h2v'\r\nimport { IconLayout1h3v } from './layout-1h3v'\r\nimport { IconLayout1l2r } from './layout-1l2r'\r\nimport { IconLayout1t2b } from './layout-1t2b'\r\nimport { IconLayout2h1v } from './layout-2h1v'\r\nimport { IconLayout2h2v } from './layout-2h2v'\r\nimport { IconLayout3h1v } from './layout-3h1v'\r\nimport { IconLayout3h2v } from './layout-3h2v'\r\nimport { IconLightMode } from './light-mode'\r\nimport { IconLineChartType } from './line-chart-type'\r\nimport { IconLock } from './lock'\r\nimport { IconMenuClose } from './menu-close'\r\nimport { IconMinus } from './minus'\r\nimport { IconMore } from './more'\r\nimport { IconNote } from './note'\r\nimport { IconOhlcChartType } from './ohlc-chart-type'\r\nimport { IconPalette } from './palette'\r\nimport { IconProfile } from './profile'\r\nimport { IconPublish } from './publish'\r\nimport { IconRefresh } from './refresh'\r\nimport { IconRemove } from './remove'\r\nimport { IconRestore } from './restore'\r\nimport { IconSearch } from './search'\r\nimport { IconSettings } from './settings'\r\nimport { IconSettingsWheel } from './settings-wheel'\r\nimport { IconShare } from './share'\r\nimport { IconSignOut } from './sign-out'\r\nimport { IconStar } from './star'\r\nimport { IconStarOutlined } from './star-outlined'\r\nimport { SVG, SVGProps } from './svg'\r\nimport { IconSwitchHorizontal } from './switch-horizontal'\r\nimport { IconSwitchVertical } from './switch-vertical'\r\nimport { IconTabKey } from './tab-key'\r\nimport { IconTemplate } from './template'\r\nimport { IconToolArrow } from './tool-arrow'\r\nimport { IconToolBrush } from './tool-brush'\r\nimport { IconToolCallout } from './tool-callout'\r\nimport { IconToolCurve } from './tool-curve'\r\nimport { IconToolElliottWave } from './tool-elliott-wave'\r\nimport { IconToolEllipse } from './tool-ellipse'\r\nimport { IconToolExpand } from './tool-expand'\r\nimport { IconToolFibonacci } from './tool-fibonacci'\r\nimport { IconToolLine } from './tool-line'\r\nimport { IconToolMeasure } from './tool-measure'\r\nimport { IconToolMidlineH } from './tool-midline-h'\r\nimport { IconToolMidlineV } from './tool-midline-v'\r\nimport { IconToolMouse } from './tool-mouse'\r\nimport { IconToolPitchFork } from './tool-pitchfork'\r\nimport { IconToolPolygon } from './tool-polygon'\r\nimport { IconToolPosition } from './tool-position'\r\nimport { IconToolRect } from './tool-rect'\r\nimport { IconToolRectRotated } from './tool-rect-rotated'\r\nimport { IconToolText } from './tool-text'\r\nimport { IconToolTriangle } from './tool-triangle'\r\nimport { IconToolXABCD } from './tool-xabcd'\r\nimport { IconTrashCan } from './trash-can'\r\nimport { IconTrendingDown } from './trending-down'\r\nimport { IconTrendingUp } from './trending-up'\r\nimport { IconTriangle } from './triangle'\r\nimport { IconTriangleOutlineDown } from './triangle-outline-down'\r\nimport { IconTriangleOutlineUp } from './triangle-outline-up'\r\nimport { IconWarning } from './warning'\r\n\r\n// Export the Icon component itself\r\nexport * from './icon'\r\n\r\nexport function isValidIconName(name?: unknown): name is IconNameType {\r\n if (!name || typeof name !== 'string') return false\r\n\r\n return !!iconList[name as IconNameType]\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n add: IconAdd,\r\n arrowDownShort: IconArrowDownShort,\r\n arrowForward: IconArrowForward,\r\n arrowUpShort: IconArrowUpShort,\r\n briefcase: IconBriefcase,\r\n calendar: IconCalendar,\r\n candleBarBasic: IconCandleBarBasic,\r\n candleBarHeikinAshi: IconCandleBarHeikinAshi,\r\n candleBarHollow: IconCandleBarHollow,\r\n caretDown: IconCaretDown,\r\n caretLeft: IconCaretLeft,\r\n caretRight: IconCaretRight,\r\n caretUp: IconCaretUp,\r\n caretVertical: IconCaretVertical,\r\n chartBar: IconChartBar,\r\n chartBubble: IconChartBubble,\r\n chartPie: IconChartPie,\r\n chartTable: IconChartTable,\r\n chartTreemap: IconChartTreemap,\r\n chevronDown: IconChevronDown,\r\n chevronRight: IconChevronRight,\r\n close: IconMenuClose,\r\n darkMode: IconDarkMode,\r\n diamondOutlined: IconDiamondOutlined,\r\n done: IconDone,\r\n drag: IconDrag,\r\n draw: IconDraw,\r\n drawingActionDelete: IconDrawingActionDelete,\r\n drawingSettingAutosaveOff: IconDrawingSettingAutosaveOff,\r\n drawingSettingAutosaveOn: IconDrawingSettingAutosaveOn,\r\n drawingSettingAutosaveSaving: IconDrawingSettingAutosaveSaving,\r\n drawingSettingDrawingMode: IconDrawingSettingDrawingMode,\r\n drawingSettingDrawingModeActive: IconDrawingSettingDrawingModeActive,\r\n drawingSettingHide: IconDrawingSettingHide,\r\n drawingSettingLock: IconDrawingSettingLock,\r\n drawingSettingPreserveDrawings: IconDrawingSettingPreserveDrawings,\r\n drawingSettingPreserveDrawingsActive: IconDrawingSettingPreserveDrawingsActive,\r\n drawingSettingShow: IconDrawingSettingShow,\r\n drawingSettingUnlock: IconDrawingSettingUnlock,\r\n empty: (props: SVGProps) => ,\r\n exitFullscreen: IconExitFullscreen,\r\n flash: IconFlash,\r\n fullscreen: IconFullscreen,\r\n gesture: IconGesture,\r\n gift: IconGift,\r\n hamburger: IconHamburger,\r\n help: IconHelp,\r\n idea: IconIdea,\r\n ideaLoad: IconIdeaLoad,\r\n ideaSave: IconIdeaSave,\r\n info: IconInfo,\r\n interval: IconInterval,\r\n layout1h1v: IconLayout1h1v,\r\n layout1h2v: IconLayout1h2v,\r\n layout1h3v: IconLayout1h3v,\r\n layout1l2r: IconLayout1l2r,\r\n layout1t2b: IconLayout1t2b,\r\n layout2h1v: IconLayout2h1v,\r\n layout2h2v: IconLayout2h2v,\r\n layout3h1v: IconLayout3h1v,\r\n layout3h2v: IconLayout3h2v,\r\n lightMode: IconLightMode,\r\n lineChartType: IconLineChartType,\r\n lock: IconLock,\r\n menuClose: IconClose,\r\n minus: IconMinus,\r\n more: IconMore,\r\n note: IconNote,\r\n ohlcChartType: IconOhlcChartType,\r\n palette: IconPalette,\r\n profile: IconProfile,\r\n publish: IconPublish,\r\n refresh: IconRefresh,\r\n remove: IconRemove,\r\n restore: IconRestore,\r\n search: IconSearch,\r\n settings: IconSettings,\r\n settingsWheel: IconSettingsWheel,\r\n share: IconShare,\r\n signOut: IconSignOut,\r\n star: IconStar,\r\n starOutlined: IconStarOutlined,\r\n switchHorizontal: IconSwitchHorizontal,\r\n switchVertical: IconSwitchVertical,\r\n tabKey: IconTabKey,\r\n template: IconTemplate,\r\n toolArrow: IconToolArrow,\r\n toolBrush: IconToolBrush,\r\n toolCallout: IconToolCallout,\r\n toolCurve: IconToolCurve,\r\n toolElliottWave: IconToolElliottWave,\r\n toolEllipse: IconToolEllipse,\r\n toolExpand: IconToolExpand,\r\n toolFibonacci: IconToolFibonacci,\r\n toolLine: IconToolLine,\r\n toolMeasure: IconToolMeasure,\r\n toolMidLineH: IconToolMidlineH,\r\n toolMidLineV: IconToolMidlineV,\r\n toolMouse: IconToolMouse,\r\n toolPitchfork: IconToolPitchFork,\r\n toolPolygon: IconToolPolygon,\r\n toolPosition: IconToolPosition,\r\n toolRect: IconToolRect,\r\n toolRectRotated: IconToolRectRotated,\r\n toolText: IconToolText,\r\n toolTriangle: IconToolTriangle,\r\n toolXABCD: IconToolXABCD,\r\n trashCan: IconTrashCan,\r\n trendingDown: IconTrendingDown,\r\n trendingUp: IconTrendingUp,\r\n triangle: IconTriangle,\r\n triangleOutlineDown: IconTriangleOutlineDown,\r\n triangleOutlineUp: IconTriangleOutlineUp,\r\n warning: IconWarning,\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconAdd(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowDownShort(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowForward(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconArrowUpShort(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconBriefcase(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCalendar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarBasic(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarHeikinAshi(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCandleBarHollow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretLeft(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretRight(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconCaretVertical(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartBar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartBubble(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartPie(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartTable(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChartTreemap(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChevronDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconChevronRight(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMenuClose(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDarkMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDiamondOutlined(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDone(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrag(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDraw(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingActionDelete(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveOff(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveOn(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingAutosaveSaving(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingDrawingMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingDrawingModeActive(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingHide(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingLock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingPreserveDrawings(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingPreserveDrawingsActive(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingShow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconDrawingSettingUnlock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconExitFullscreen(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconFlash(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconFullscreen(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconGesture(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconGift(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconHamburger(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconHelp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdea(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdeaLoad(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconIdeaSave(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconInfo(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconInterval(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1h3v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1l2r(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout1t2b(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout2h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout2h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout3h1v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLayout3h2v(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLightMode(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLineChartType(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconLock(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconClose(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMinus(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconMore(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconNote(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconOhlcChartType(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconPalette(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconProfile(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconPublish(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRefresh(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRemove(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconRestore(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSearch(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSettings(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSettingsWheel(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconShare(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSignOut(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconStar(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconStarOutlined(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSwitchHorizontal(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconSwitchVertical(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTabKey(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTemplate(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolArrow(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolBrush(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolCallout(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolCurve(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolElliottWave(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolEllipse(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolExpand(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolFibonacci(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolLine(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMeasure(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMidlineH(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMidlineV(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolMouse(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPitchFork(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPolygon(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolPosition(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolRect(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolRectRotated(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolText(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolTriangle(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconToolXABCD(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrashCan(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrendingDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTrendingUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangle(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangleOutlineDown(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconTriangleOutlineUp(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import { SVG, SVGProps } from './svg'\r\n\r\nexport function IconWarning(props: SVGProps) {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport type SVGProps = React.SVGProps\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef, useMemo } from 'react'\r\n\r\nimport { ButtonPadding } from './button'\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { Label } from './typography'\r\n\r\nexport enum InputTheme {\r\n none,\r\n light,\r\n dark,\r\n navigationBar,\r\n}\r\n\r\nexport enum InputRounding {\r\n none = '',\r\n regular = 'rounded-md',\r\n}\r\n\r\n/**\r\n * Enum for input size. Only set size on larger viewports to avoid page zooming\r\n */\r\nexport enum InputSize {\r\n small = 'h-6 text-2xs', // 24px height\r\n regular = 'h-7 text-2xs', // 28px height\r\n medium = 'h-8 text-sm', // 32px height\r\n large = 'h-9 text-sm', // 36px height\r\n}\r\n\r\nfunction getInputTheme(theme: InputTheme, isError = false) {\r\n switch (theme) {\r\n case InputTheme.none:\r\n return {}\r\n case InputTheme.dark:\r\n return {\r\n input: classnames('border bg-gray-800 text-gray-50 disabled:bg-gray-700 disabled:text-gray-400', {\r\n 'border-gray-600 hover:border-gray-400 focus:border-blue-400 focus:hover:border-blue-400 disabled:border-gray-700':\r\n !isError,\r\n 'border-red-400': isError,\r\n }),\r\n icon: classnames({\r\n 'text-gray-500 group-focus-within:text-blue-400': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n case InputTheme.navigationBar:\r\n return {\r\n input: classnames(\r\n 'border bg-transparent disabled:border-gray-700 disabled:bg-gray-700 disabled:text-gray-400',\r\n {\r\n 'border-gray-100 dark:border-gray-600 text-gray-750 dark:text-gray-50':\r\n !isError && !FinvizSettings.hasUserPremium,\r\n 'border-gray-600 text-gray-50': !isError && FinvizSettings.hasUserPremium,\r\n 'border-red-400': isError,\r\n }\r\n ),\r\n icon: classnames({\r\n 'text-gray-500': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n default:\r\n return {\r\n input: classnames(\r\n 'border', // Base styles\r\n 'bg-white disabled:bg-gray-50 disabled:text-gray-500', // Light\r\n 'dark:bg-gray-800 dark:disabled:bg-gray-700 dark:disabled:text-gray-400', // Dark\r\n {\r\n 'border-gray-100 hover:border-gray-300 focus:border-blue-400 hover:focus:border-blue-400 disabled:hover:border-gray-100 dark:border-gray-600 dark:hover:border-gray-400 dark:focus:border-blue-400 dark:hover:focus:border-blue-400 dark:disabled:border-gray-700':\r\n !isError,\r\n 'border-red-400': isError,\r\n }\r\n ),\r\n icon: classnames({\r\n 'text-gray-300 group-focus-within:text-blue-400 dark:text-gray-500': !isError,\r\n 'text-red-400': isError,\r\n }),\r\n }\r\n }\r\n}\r\n\r\ntype OmitNativeProps = Omit, 'label' | 'size'>\r\n\r\nexport interface InputProps {\r\n /**\r\n * Label which is rendered above the input\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Optional label layout switch\r\n */\r\n isHorizontalLabel?: boolean\r\n\r\n /**\r\n * Optional label className override\r\n */\r\n labelClassName?: string\r\n\r\n /**\r\n * Theme for the input\r\n *\r\n * @default light\r\n */\r\n theme?: keyof typeof InputTheme\r\n\r\n /**\r\n * Input size. This setting is ignored on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof InputSize\r\n\r\n /**\r\n * Border radius of the input\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof InputRounding\r\n\r\n /**\r\n * Hide value stepper for number inputs\r\n */\r\n showNumberStepper?: boolean\r\n\r\n /**\r\n * Element to display on left the side of the input or name of the icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Element to display on right the side of the input or name of the icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Additional class names for the input\r\n */\r\n inputClass?: string\r\n\r\n /**\r\n * Error label to display under the input\r\n */\r\n error?: ReactNode\r\n\r\n /**\r\n * Additional info to display under the input\r\n */\r\n caption?: ReactNode\r\n\r\n /**\r\n * Disables setting text size to 16px on mobile. Only use for pages which aren’t\r\n * responsive\r\n */\r\n isMobileStyleEnabled?: boolean\r\n}\r\n\r\nexport type InputHTMLProps = OmitNativeProps\r\n\r\nexport type InputComponentProps = InputProps & InputHTMLProps\r\n\r\nfunction InputComponent(\r\n {\r\n label,\r\n isHorizontalLabel,\r\n labelClassName,\r\n size = 'regular',\r\n theme = 'light',\r\n rounding = 'regular',\r\n type,\r\n showNumberStepper = type === 'number',\r\n leftContent,\r\n rightContent,\r\n inputClass,\r\n error,\r\n caption,\r\n className,\r\n isMobileStyleEnabled = true,\r\n ...props\r\n }: InputComponentProps,\r\n ref: ForwardedRef\r\n) {\r\n const inputTheme = useMemo(() => getInputTheme(InputTheme[theme], !!error), [theme, error])\r\n const isLeftStringIcon = isValidIconName(leftContent)\r\n const isRightStringIcon = isValidIconName(rightContent)\r\n const inputSize = InputSize[size]\r\n\r\n const commonSideContentClassnames = useMemo(\r\n () => ({\r\n 'flex absolute w-3 items-center justify-center': true,\r\n 'text-gray-500 dark:text-gray-600': theme === 'light',\r\n 'text-gray-600': theme === 'dark',\r\n }),\r\n [theme]\r\n )\r\n\r\n return (\r\n
\r\n
\r\n \r\n {caption && typeof caption !== 'boolean' && (\r\n {caption}\r\n )}\r\n {error && typeof error !== 'boolean' && {error}}\r\n
\r\n )\r\n}\r\n\r\ninterface InputCaptionProps extends Omit, 'size'> {\r\n size?: keyof typeof InputSize\r\n}\r\n\r\nfunction InputCaption({ size = 'regular', ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ntype TextareaProps = Omit & OmitNativeProps\r\n\r\nfunction TextareaComponent(\r\n { label, theme = 'light', rounding = 'regular', inputClass, error, caption, className, ...props }: TextareaProps,\r\n ref: ForwardedRef\r\n) {\r\n const textareaTheme = useMemo(() => getInputTheme(InputTheme[theme], !!error), [theme, error])\r\n\r\n return (\r\n
\r\n \r\n {caption && typeof caption !== 'boolean' && (\r\n {caption}\r\n )}\r\n {error && typeof error !== 'boolean' && {error}}\r\n
\r\n )\r\n}\r\n\r\nexport const Input = forwardRef(InputComponent)\r\nexport const Textarea = forwardRef(TextareaComponent)\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nexport const ListContext = React.createContext(null)\r\n\r\nexport function useListState(options?: Reakit.CompositeInitialState) {\r\n return Reakit.useCompositeState({ ...options, loop: true, unstable_virtual: true })\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps, ButtonTheme } from '../button'\r\nimport { ListContext } from './hooks'\r\n\r\nexport interface ListItemProps {\r\n /**\r\n * Theme when the button is selected\r\n */\r\n activeTheme?: keyof typeof ButtonTheme\r\n\r\n /**\r\n * Close parent popover when the item is clicked\r\n */\r\n closeOnSelect?: boolean\r\n\r\n /**\r\n * OnChange callback when item is clicked or navigated to\r\n * @private\r\n */\r\n onSelectItem?: (item: string, closeOnSelect?: boolean) => void\r\n}\r\n\r\nexport function ListItem({\r\n as,\r\n activeTheme = 'blue',\r\n onSelectItem,\r\n onClick,\r\n onKeyPress,\r\n className,\r\n closeOnSelect = true,\r\n children,\r\n ...props\r\n}: React.PropsWithChildren & ButtonComponentProps) {\r\n const state = React.useContext(ListContext)\r\n\r\n return (\r\n {\r\n onClick?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n onKeyPress={(ev) => {\r\n onKeyPress?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n >\r\n {(itemProps: ButtonComponentProps) => {\r\n const active = Boolean(itemProps['aria-selected'])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { ListContext } from './hooks'\r\nimport { ListItem } from './list-item'\r\n\r\ninterface ListProps extends Omit {\r\n /**\r\n * The returned object from `useListState`\r\n */\r\n state: Reakit.CompositeStateReturn\r\n\r\n /**\r\n * The selected option\r\n */\r\n selectedIndex?: number\r\n\r\n /**\r\n * Callback when selected option index changes\r\n */\r\n onChange?: (selectedIndex: number, closeParent?: boolean) => void\r\n\r\n /**\r\n * Whether or not default styles should be included for the list\r\n * @default true\r\n */\r\n includeBaseStyles?: boolean\r\n}\r\n\r\nexport function List({ state, selectedIndex, includeBaseStyles = true, onChange, children, ...props }: ListProps) {\r\n const prevSelected = React.useRef(null)\r\n\r\n // Select option when `selectedIndex` changes\r\n React.useEffect(() => {\r\n if (\r\n selectedIndex !== undefined &&\r\n selectedIndex >= 0 &&\r\n prevSelected.current !== selectedIndex &&\r\n state.items.length > selectedIndex\r\n ) {\r\n state.move(state.items[selectedIndex].id)\r\n prevSelected.current = selectedIndex\r\n }\r\n }, [selectedIndex, state, state.items.length])\r\n\r\n const onSelectItem = React.useCallback(\r\n (id: string, closeParent: boolean) => {\r\n onChange?.(\r\n state.items.findIndex((item) => item.id === id),\r\n closeParent\r\n )\r\n },\r\n [onChange, state.items]\r\n )\r\n\r\n return (\r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === ListItem) {\r\n return React.cloneElement(child, { ...child.props, onSelectItem: onSelectItem })\r\n }\r\n\r\n return child\r\n })}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\nimport { Dialog, useDialogState } from 'reakit/Dialog'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nfunction getViewport(visualViewport: VisualViewport | null) {\r\n const width = visualViewport?.width ?? window.innerWidth\r\n const height = visualViewport?.height ?? window.innerHeight\r\n const scale = visualViewport?.scale ?? 1\r\n\r\n return {\r\n top: visualViewport?.offsetTop ?? 0,\r\n left: visualViewport?.offsetLeft ?? 0,\r\n scale: Math.round((1 / scale) * 100) / 100,\r\n width: Math.round(width * scale),\r\n height: Math.round(height * scale),\r\n }\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const state = useDialogState({ modal: false, animated: COMPONENT_ANIMATION_DURATION })\r\n const [notification, setNotification] = React.useState(null)\r\n const { isFullyClosed, isFullyOpened } = getExtendedDialogState(state)\r\n const [viewport, setViewport] = React.useState(getViewport(window.visualViewport))\r\n\r\n React.useEffect(() => {\r\n if (!notification) return\r\n\r\n const handleResize = throttle((ev: Event) => {\r\n const viewport = ev.currentTarget as VisualViewport\r\n if (viewport) {\r\n setViewport(() => getViewport(viewport))\r\n }\r\n }, 50)\r\n\r\n window.visualViewport?.addEventListener('resize', handleResize)\r\n window.visualViewport?.addEventListener('scroll', handleResize)\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', handleResize)\r\n window.visualViewport?.removeEventListener('scroll', handleResize)\r\n }\r\n }, [notification])\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n state.show()\r\n },\r\n hide: state.hide,\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n actions?: JSX.Element\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification(props: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: NodeJS.Timeout\r\n if (props.timeoutInMs) {\r\n timeoutId = setTimeout(() => {\r\n notification.hide()\r\n }, props.timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, props.timeoutInMs])\r\n\r\n return (\r\n \r\n
{props.children}
\r\n
{props.actions ?? }
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { useWindowSize } from '../../hooks/use-window-size'\r\nimport { Box, BoxProps, BoxTheme } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { TooltipArrow } from '../tooltip/tooltip-arrow'\r\nimport { PopoverStateReturn } from './hooks'\r\n\r\nexport interface PopoverProps extends BoxProps, Pick {\r\n /**\r\n * The returned object from `usePopoverState`\r\n */\r\n state: PopoverStateReturn\r\n\r\n /**\r\n * Focus the popover when it opens\r\n *\r\n * @default true\r\n */\r\n focusOnShow?: Reakit.PopoverProps['unstable_autoFocusOnShow']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default true\r\n */\r\n focusOnHide?: Reakit.PopoverProps['unstable_autoFocusOnHide']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default undefined\r\n */\r\n finalFocusRef?: Reakit.PopoverProps['unstable_finalFocusRef']\r\n\r\n /**\r\n * Hides when clicked outside of popover, works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside?: Reakit.PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Overlay click callback or if false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Popover wrapper css style object\r\n *\r\n * @default undefined\r\n */\r\n popoverWrapperStyle?: React.CSSProperties\r\n\r\n /**\r\n * Show popover arrow\r\n *\r\n * @default false\r\n */\r\n hasArrow?: boolean\r\n\r\n /**\r\n * Enable or disable backdrop click events\r\n *\r\n * @default true\r\n */\r\n hasBackdrop?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Can be used together with `hasViewportHeightLimit` to limit the height of the popover\r\n *\r\n * @default undefined\r\n */\r\n popoverMaxHeight?: number\r\n}\r\n\r\nexport function Popover({\r\n state,\r\n children,\r\n focusOnShow = true,\r\n focusOnHide = true,\r\n finalFocusRef,\r\n 'aria-label': ariaLabel,\r\n hide,\r\n hideOnClickOutside = true,\r\n hasArrow = false,\r\n hasBackdrop = true,\r\n onOverlayClick,\r\n popoverWrapperStyle,\r\n popoverMaxHeight = Number.MAX_SAFE_INTEGER,\r\n theme = 'light',\r\n hasViewportHeightLimit = false,\r\n hasButtonWidthLimit = false,\r\n ...props\r\n}: PopoverProps) {\r\n const zIndex = useZIndex()\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const { innerHeight } = useWindowSize({ isWatching: !isFullyClosed })\r\n\r\n const buttonElement = state.unstable_referenceRef.current\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: popoverMaxHeight,\r\n hasViewportHeightLimit,\r\n offsets: state.offsets,\r\n state,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !(hasViewportHeightLimit || hasButtonWidthLimit)) return\r\n\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n\r\n // Limit popover max-width to be width of the trigger button\r\n if (hasButtonWidthLimit) {\r\n popoverWrapper?.style.setProperty('max-width', `${buttonRect.width}px`)\r\n }\r\n }, [\r\n state.visible,\r\n state.offsets,\r\n buttonElement,\r\n hasViewportHeightLimit,\r\n hasButtonWidthLimit,\r\n innerHeight,\r\n state.placement,\r\n popoverMaxHeight,\r\n ])\r\n\r\n if (isFullyClosed) return null\r\n\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n <>\r\n {\r\n // prevents from page scroll when clicked outside of popover\r\n event.preventDefault()\r\n }}\r\n />\r\n \r\n \r\n {hasArrow && (\r\n \r\n \r\n \r\n )}\r\n {children}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport type PopoverStateReturn = ReturnType\r\n\r\nconst DEFAULT_OFFSET: [number, number] = [0, 5]\r\nconst HOVER_TIMEOUT = 150\r\n\r\nconst preventDefault = (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n}\r\n\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function usePopoverState(settings?: Reakit.PopoverInitialState) {\r\n const offsets = (settings?.unstable_offset ?? DEFAULT_OFFSET) as [number, number]\r\n const popover = Reakit.usePopoverState({\r\n ...settings,\r\n placement: settings?.placement ?? 'bottom-start',\r\n unstable_offset: offsets,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n })\r\n\r\n return { ...popover, offsets }\r\n}\r\n\r\nexport function useHoverPopover(settings?: Reakit.PopoverInitialState) {\r\n const popover = usePopoverState(settings)\r\n const showTimeout = React.useRef(null)\r\n const hideTimeout = React.useRef(null)\r\n\r\n const clearTimeouts = React.useRef(() => {\r\n if (showTimeout.current !== null) {\r\n window.clearTimeout(showTimeout.current)\r\n }\r\n if (hideTimeout.current !== null) {\r\n window.clearTimeout(hideTimeout.current)\r\n }\r\n })\r\n\r\n const showPopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n showTimeout.current = window.setTimeout(() => {\r\n popover.show()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n const hidePopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n hideTimeout.current = window.setTimeout(() => {\r\n popover.hide()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n // Unmount cleanup\r\n React.useEffect(() => () => clearTimeouts.current(), [])\r\n\r\n return {\r\n ...popover,\r\n show: showPopover.current,\r\n hide: hidePopover.current,\r\n onMouseOver: showPopover.current,\r\n onMouseOut: hidePopover.current,\r\n onMouseDown: preventDefault,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { useZIndex } from '../dialog'\r\n\r\ninterface PopoverButtonProps extends Reakit.PopoverDisclosureHTMLProps {\r\n state: Reakit.PopoverStateReturn\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const PopoverTrigger = React.forwardRef(\r\n ({ state, ...props }: PopoverButtonProps, ref: React.ForwardedRef) => {\r\n const zIndex = useZIndex()\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","// Disable rule as the component is external\r\n\r\n/* eslint-disable react/jsx-pascal-case */\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Combobox'\r\n\r\nimport { Button, ButtonProps } from '../button'\r\nimport { PropsWithAs } from '../types'\r\n\r\nconst DEFAULT_ELEMENT = 'button'\r\n\r\nexport interface ComboBoxItemProps extends ButtonProps {\r\n /**\r\n * The returned object from `useComboBoxState`\r\n */\r\n state?: Reakit.unstable_ComboboxStateReturn\r\n\r\n /**\r\n * Value for the combo box item\r\n */\r\n value: string\r\n}\r\n\r\nexport function ComboBoxItem({\r\n as: asComponent,\r\n state,\r\n children,\r\n ...props\r\n}: PropsWithAs & ComboBoxItemProps) {\r\n return (\r\n \r\n {(itemProps) => {\r\n const selected = state?.currentId === itemProps.id\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n","// Disable rule as the component is external\r\n\r\n/* eslint-disable react/jsx-pascal-case */\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Combobox'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { Box, BoxProps } from '../box'\r\nimport { getExtendedDialogState, useZIndex } from '../dialog'\r\nimport { Input, InputProps } from '../input'\r\nimport { ComboBoxItem } from './combo-box-item'\r\n\r\ninterface ComboBoxProps extends Omit {\r\n /**\r\n * The returned object from `useComboBoxState`\r\n */\r\n state: Reakit.unstable_ComboboxStateReturn\r\n\r\n /**\r\n * Additional props for the input\r\n */\r\n inputProps?: Partial & Omit, 'size'>\r\n\r\n /**\r\n * Additional props for the popover\r\n */\r\n popoverProps?: Partial\r\n\r\n /**\r\n * Callback when user presses enter\r\n */\r\n onChange: (value: string) => void\r\n\r\n /**\r\n * Id for testing purposes\r\n */\r\n inputTestId?: string\r\n}\r\n\r\nexport function ComboBox({\r\n state,\r\n children,\r\n inputProps,\r\n popoverProps,\r\n onChange,\r\n inputTestId,\r\n 'aria-label': ariaLabel,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const zIndex = useZIndex()\r\n\r\n React.useEffect(() => {\r\n if (inputProps?.autoFocus) {\r\n state.unstable_referenceRef.current?.focus({ preventScroll: true })\r\n }\r\n // Only focus input on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n <>\r\n {\r\n if (ev.key === 'Enter') {\r\n onChange(state.inputValue)\r\n }\r\n inputProps?.onKeyDown?.(ev)\r\n }}\r\n data-testid={inputTestId}\r\n />\r\n {!isFullyClosed && (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n
\r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === ComboBoxItem) {\r\n return React.cloneElement(\r\n child as React.ReactElement>,\r\n {\r\n state,\r\n onMouseUp: () => {\r\n onChange(child.props.value)\r\n },\r\n }\r\n )\r\n }\r\n\r\n return child\r\n })}\r\n \r\n
\r\n )}\r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Instrument } from '../../types'\r\n\r\nexport const INSTRUMENT_CATEGORIES = [\r\n { name: 'All', instrument: undefined },\r\n { name: 'Stocks', instrument: Instrument.Stock },\r\n { name: 'Futures', instrument: Instrument.Futures },\r\n { name: 'Forex', instrument: Instrument.Forex },\r\n { name: 'Crypto', instrument: Instrument.Crypto },\r\n]\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren } from 'react'\r\n\r\nexport function Centered(props: PropsWithChildren>) {\r\n return
\r\n}\r\n","import { FallbackProps } from 'react-error-boundary'\r\n\r\nimport { link } from '../../services/routing'\r\nimport { Button } from '../button'\r\nimport { Centered } from '../centered'\r\nimport { Icon } from '../icon'\r\nimport { Heading, Paragraph } from '../typography'\r\n\r\nexport function SearchError(props: FallbackProps) {\r\n return (\r\n \r\n \r\n \r\n Error fetching the results\r\n \r\n \r\n There’s been an error fetching your results. Please try again or{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n \r\n \r\n )\r\n}\r\n","import { useMemo } from 'react'\r\n\r\ninterface HighlightProps {\r\n /**\r\n * Search string that will be highlighted\r\n */\r\n highlight: string\r\n /**\r\n * Text to be highlighted\r\n */\r\n text: string\r\n}\r\n\r\nexport function Highlight({ highlight, text }: HighlightProps) {\r\n const index = text.toLowerCase().indexOf(highlight.toLowerCase())\r\n\r\n const processedText = useMemo(\r\n () => ({\r\n before: text.substring(0, index),\r\n highlight: text.substring(index, index + highlight.length),\r\n after: text.substring(index + highlight.length),\r\n }),\r\n [highlight.length, index, text]\r\n )\r\n\r\n if (index < 0 || highlight.length < 1) return {text}\r\n\r\n return (\r\n <>\r\n {processedText.before}\r\n {!!processedText.highlight.length && (\r\n \r\n {processedText.highlight}\r\n \r\n )}\r\n {processedText.after}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { SearchApiResult } from '../../services/api'\r\nimport { ComboBoxItem, ComboBoxItemProps } from '../combo-box'\r\nimport { Highlight } from '../highlight'\r\nimport { PropsWithAs } from '../types'\r\n\r\ninterface SearchItemProps extends Pick {\r\n item: SearchApiResult\r\n chartIndex?: number\r\n itemProps: Partial>\r\n}\r\n\r\nexport function SearchItem(props: SearchItemProps) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {props.item.exchange}\r\n \r\n )\r\n}\r\n","import { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { link } from '../../services/routing'\r\nimport { Instrument } from '../../types'\r\nimport { cleanTicker, getInstrumentForTicker } from '../../util'\r\n\r\nexport function getRedirectForTicker(tickerRaw: string) {\r\n const ticker = getSanitizedTicker(tickerRaw, true)\r\n const instrument = cleanTicker(ticker) ? getInstrumentForTicker(ticker) : null\r\n let redirectLink = ''\r\n\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n redirectLink = link.toQuote(ticker)\r\n break\r\n case Instrument.Forex:\r\n redirectLink = link.toForexChartDetail(ticker)\r\n break\r\n case Instrument.Futures:\r\n redirectLink = link.toFuturesChartDetail(ticker)\r\n break\r\n case Instrument.Crypto:\r\n redirectLink = link.toCryptoChartDetail(ticker)\r\n break\r\n default:\r\n return link.toSearch(ticker)\r\n }\r\n\r\n return redirectLink + (FinvizSettings.quoteSearchExt ?? '')\r\n}\r\n","import { useQuery } from '@tanstack/react-query'\r\nimport React from 'react'\r\nimport * as Reakit from 'reakit/Combobox'\r\n\r\nimport { searchApiRequest } from '../../services/api'\r\nimport { link } from '../../services/routing'\r\nimport { Instrument } from '../../types'\r\nimport { Button } from '../button'\r\nimport { Centered } from '../centered'\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\nimport { Spinner } from '../spinner'\r\nimport { SearchItem } from './search-item'\r\nimport { getRedirectForTicker } from './util'\r\n\r\ninterface SearchListProps {\r\n state: Reakit.unstable_ComboboxStateReturn\r\n instrument?: Instrument\r\n chartIndex?: number\r\n isShowAllVisible: boolean\r\n isSearchItemLink: boolean\r\n onTickerSelected?: (ticker: string) => void\r\n}\r\n\r\nexport function SearchList(props: SearchListProps) {\r\n const { data, isLoading } = useQuery(\r\n ['search', props.state.inputValue, props.instrument],\r\n () => searchApiRequest(props.state.inputValue, props.instrument),\r\n { enabled: props.state.inputValue.length > 0, keepPreviousData: true, cacheTime: Infinity, staleTime: Infinity }\r\n )\r\n const { setAnimated, hide, animated } = props.state\r\n\r\n React.useEffect(() => {\r\n if (!isLoading && !data?.length && !props.isShowAllVisible) {\r\n setAnimated(1)\r\n hide()\r\n } else if (animated !== COMPONENT_ANIMATION_DURATION) {\r\n setAnimated(COMPONENT_ANIMATION_DURATION)\r\n }\r\n }, [isLoading, data, setAnimated, hide, props.isShowAllVisible, animated])\r\n\r\n if (isLoading) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n return (\r\n
\r\n {data && data.length !== 0 && (\r\n
\r\n {data.map((item) => (\r\n ) => {\r\n ev.preventDefault()\r\n props.onTickerSelected?.(item.ticker)\r\n props.state?.setInputValue('')\r\n },\r\n }\r\n }\r\n />\r\n ))}\r\n
\r\n )}\r\n {props.isShowAllVisible && (\r\n \r\n Show All Results\r\n \r\n )}\r\n
\r\n )\r\n}\r\n","import { Placement } from '@popperjs/core'\r\nimport { useQueryErrorResetBoundary } from '@tanstack/react-query'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\n\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { ComboBox, useComboBoxState } from '../combo-box'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { IconNameType } from '../icon'\r\nimport { InputSize, InputTheme } from '../input'\r\nimport { List, ListItem, useListState } from '../list'\r\nimport { INSTRUMENT_CATEGORIES } from './constants'\r\nimport { SearchError } from './search-error'\r\nimport { SearchList } from './search-list'\r\nimport { getRedirectForTicker } from './util'\r\n\r\ninterface SearchProps {\r\n autoFocus?: boolean\r\n defaultValue?: string\r\n defaultPlacement?: Placement\r\n placeholder?: string\r\n theme?: keyof typeof InputTheme\r\n size?: keyof typeof InputSize\r\n allowCategorySwitching?: boolean\r\n inputClass?: string\r\n popoverClass?: string\r\n chartIndex?: number\r\n isMatchInputAndBoxWidth?: boolean\r\n isSearchIcon?: boolean\r\n isShowAllVisible?: boolean\r\n isSearchItemLink?: boolean\r\n rightContent?: JSX.Element | IconNameType\r\n onTickerSelected?: (ticker: string) => void\r\n}\r\n\r\nexport function Search({\r\n isSearchIcon = true,\r\n isShowAllVisible = true,\r\n isSearchItemLink = true,\r\n ...props\r\n}: SearchProps) {\r\n const { reset } = useQueryErrorResetBoundary()\r\n const state = useComboBoxState({\r\n minValueLength: 1,\r\n inputValue: props.defaultValue,\r\n placement: props.defaultPlacement ?? 'bottom-start',\r\n })\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const listState = useListState({ orientation: 'vertical' })\r\n const [category, setCategory] = React.useState(0)\r\n\r\n const changeCategory = React.useRef((ev: React.KeyboardEvent) => {\r\n switch (ev.key) {\r\n case 'ArrowRight':\r\n state.first()\r\n break\r\n case 'ArrowUp':\r\n setCategory((state) => (state - 1 + INSTRUMENT_CATEGORIES.length) % INSTRUMENT_CATEGORIES.length)\r\n break\r\n case 'ArrowDown':\r\n setCategory((state) => (state + 1) % INSTRUMENT_CATEGORIES.length)\r\n break\r\n }\r\n })\r\n\r\n /**\r\n * The search box can be child of a modal/dialog so we need to handle ESC\r\n * otherwise it would close both the combobox and the parent.\r\n */\r\n const onInputKeyDown = React.useCallback(\r\n (ev: React.KeyboardEvent) => {\r\n if (ev.key === 'Escape' && state.visible) {\r\n ev.stopPropagation()\r\n state.hide()\r\n }\r\n },\r\n // We only use `visible` and `hide` and don’t need the full state\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.visible, state.hide]\r\n )\r\n\r\n /**\r\n * Reset to category \"All\" when the combobox closes\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed) {\r\n setCategory(0)\r\n }\r\n }, [isFullyClosed])\r\n\r\n return (\r\n {\r\n // prevent combobox from setting input value on input blur\r\n e.preventDefault()\r\n },\r\n inputClass: props.inputClass,\r\n rightContent: props.rightContent,\r\n ...(isSearchIcon && { leftContent: 'search' }),\r\n }}\r\n popoverProps={{\r\n className: classnames(props.popoverClass, 'sm:px-0 z-dialog', {\r\n 'w-full sm:w-110 px-2': !props.isMatchInputAndBoxWidth,\r\n 'min-w-[340px]': props.isMatchInputAndBoxWidth,\r\n }),\r\n style: {\r\n width: props.isMatchInputAndBoxWidth\r\n ? state.unstable_referenceRef.current?.getBoundingClientRect().width ?? 340\r\n : undefined,\r\n maxWidth: '100vw',\r\n },\r\n }}\r\n onChange={(value) => {\r\n if (isSearchItemLink) {\r\n window.location.href = getRedirectForTicker(value)\r\n } else {\r\n props.onTickerSelected?.(getSanitizedTicker(value))\r\n state.setInputValue('')\r\n }\r\n }}\r\n {...(props.chartIndex !== undefined && { inputTestId: `chart-${props.chartIndex}-settings-search-input` })}\r\n >\r\n
\r\n {props.allowCategorySwitching && (\r\n setCategory(index)}\r\n onKeyDown={changeCategory.current}\r\n >\r\n {INSTRUMENT_CATEGORIES.map((category) => (\r\n {category.name}\r\n ))}\r\n \r\n )}\r\n {!isFullyClosed && (\r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import * as Reakit from 'reakit/Combobox'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\nexport function useComboBoxState(options?: Reakit.unstable_ComboboxInitialState) {\r\n return Reakit.unstable_useComboboxState({\r\n ...options,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n inline: true,\r\n unstable_offset: [0, 5],\r\n })\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { PopoverStateReturn } from '../popover'\r\nimport { SelectItem } from './types'\r\n\r\nfunction getSelectedItemIndex(items: SelectItem[], value: unknown) {\r\n if (!value && value !== 0) return -1\r\n\r\n return items.findIndex((item) => item.value === value)\r\n}\r\n\r\n/**\r\n * Hook which handles select state and returns onChange handler\r\n */\r\nexport function useSelect>(\r\n state: PopoverStateReturn,\r\n defaultValue: ValueType | undefined,\r\n items: ItemType[],\r\n onChange: (item: ItemType) => void\r\n) {\r\n const [selectedIndex, setSelectedIndex] = React.useState(getSelectedItemIndex(items, defaultValue))\r\n const closePopover = React.useRef(() => state.hide())\r\n\r\n // Update select value on change from outside\r\n React.useEffect(() => {\r\n const newIndex = getSelectedItemIndex(items, defaultValue)\r\n setSelectedIndex(newIndex)\r\n }, [items, selectedIndex, defaultValue])\r\n\r\n const onItemChange = React.useCallback(\r\n (index: number, closeOnSelect = true) => {\r\n const selectedItem = items[index]\r\n setSelectedIndex(index)\r\n\r\n if (closeOnSelect) closePopover.current()\r\n onChange(selectedItem)\r\n\r\n if (!selectedItem.href || !selectedItem.reloadDocument) {\r\n return\r\n }\r\n\r\n if (typeof selectedItem.href === 'string') {\r\n window.location.href = selectedItem.href\r\n return\r\n }\r\n\r\n const newUrl = new URL(selectedItem.href.pathname!, window.location.href)\r\n newUrl.search = selectedItem.href.search ?? ''\r\n newUrl.hash = selectedItem.href.hash ?? ''\r\n\r\n window.location.href = newUrl.toString()\r\n },\r\n [items, onChange, setSelectedIndex]\r\n )\r\n\r\n return { selectedIndex, onItemChange }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps, ButtonTheme, ButtonThemeType } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { PopoverStateReturn, PopoverTrigger } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nfunction getButtonProps(theme: ButtonTheme, active: boolean): Omit {\r\n switch (theme) {\r\n case ButtonTheme.light:\r\n return {\r\n theme: 'transparent',\r\n contentClass: 'font-normal truncate',\r\n className: classnames(\r\n 'border bg-white disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 dark:bg-gray-800',\r\n {\r\n 'border-gray-100 hover:border-gray-300 disabled:hover:border-gray-100 dark:border-gray-600 dark:hover:border-gray-400 dark:disabled:border-gray-700':\r\n !active,\r\n 'border-blue-400 dark:border-blue-400': active,\r\n }\r\n ),\r\n rightContent: ,\r\n }\r\n case ButtonTheme.dark:\r\n return {\r\n theme: 'transparent',\r\n contentClass: 'font-normal truncate',\r\n className: classnames('border bg-gray-800 text-gray-50 disabled:border-gray-700 disabled:text-gray-500', {\r\n 'border-gray-600 hover:border-gray-400': !active,\r\n 'border-blue-400': active,\r\n }),\r\n rightContent: ,\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\nexport interface SelectButtonProps extends ButtonProps, ButtonHTMLProps {\r\n /**\r\n * Theme for the button\r\n *\r\n * @default light\r\n */\r\n theme?: ButtonThemeType\r\n\r\n isLoading?: boolean\r\n\r\n state?: PopoverStateReturn\r\n\r\n isPopoverTrigger?: boolean\r\n}\r\n\r\nexport function SelectButton({\r\n state,\r\n theme = 'light',\r\n isPopoverTrigger = true,\r\n isLoading,\r\n ...props\r\n}: SelectButtonProps) {\r\n const themeProps = React.useMemo(() => getButtonProps(ButtonTheme[theme], !!props.active), [theme, props.active])\r\n\r\n return (\r\n \r\n \r\n \r\n ) : (\r\n props.rightContent ?? themeProps.rightContent\r\n )\r\n }\r\n >\r\n {props.children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { useInRouterContext } from 'react-router-dom'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { ListItem } from '../list'\r\nimport { PopoverStateReturn, usePopoverState } from '../popover'\r\nimport { Label } from '../typography'\r\nimport { useSelect } from './hooks'\r\nimport { NativeSelect, NativeSelectInRouterContext } from './native-select'\r\nimport { SelectButton, SelectButtonProps } from './select-button'\r\nimport { SelectList, SelectListProps } from './select-list'\r\nimport { SelectItem } from './types'\r\n\r\n/**\r\n * All non-select props get passed to the button element, these are the supported props\r\n */\r\ntype ButtonPassthroughProps = Omit\r\n\r\nexport interface SelectProps extends ButtonPassthroughProps {\r\n /**\r\n * Optional popover state settings\r\n */\r\n popoverStateSettings?: Reakit.PopoverInitialState\r\n\r\n /**\r\n * Name of the select, will be included in `onChange` event\r\n */\r\n name?: Name\r\n\r\n /**\r\n * Current selected value\r\n */\r\n value?: ValueType\r\n\r\n /**\r\n * List of items to display in the select\r\n */\r\n items: ItemType[]\r\n\r\n /**\r\n * Callback when selected item changes\r\n */\r\n onChange?: (item: ItemType, name: Name) => void\r\n\r\n /**\r\n * Label to display above the select\r\n */\r\n label?: React.ReactNode\r\n\r\n /**\r\n * Text for the button (usually the selected value). Falls back to placeholder if not set\r\n */\r\n buttonContent?: React.ReactNode\r\n\r\n /**\r\n * Placeholder when no value is selected\r\n */\r\n placeholder?: string\r\n\r\n /**\r\n * Additional props to the popover list\r\n */\r\n listProps?: Omit\r\n\r\n /**\r\n * Optional label className override\r\n */\r\n labelClassName?: string\r\n\r\n /**\r\n * Optional label layout switch\r\n */\r\n isHorizontalLabel?: boolean\r\n\r\n /**\r\n * Optional label title className override\r\n */\r\n labelTitleClassName?: string\r\n\r\n /**\r\n * Should use native select element on mobile devices\r\n *\r\n * @default true\r\n */\r\n isNativeMobileSelect?: boolean\r\n\r\n /**\r\n * Should use native select element\r\n *\r\n * @default false\r\n */\r\n isAlwaysNativeSelect?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasPopoverViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasPopoverButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Triggered when popover state visibility/animating changes\r\n */\r\n onIsInteractingChange?: (isInteracting: boolean) => void\r\n}\r\n\r\nexport function Select, Name = never>({\r\n children,\r\n popoverStateSettings,\r\n onIsInteractingChange,\r\n ...props\r\n}: SelectProps) {\r\n const popoverState = usePopoverState(popoverStateSettings)\r\n const { isFullyClosed } = getExtendedDialogState(popoverState)\r\n\r\n React.useEffect(() => {\r\n onIsInteractingChange?.(!isFullyClosed)\r\n }, [onIsInteractingChange, isFullyClosed])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport interface StatelessSelectProps extends SelectProps {\r\n /**\r\n * Popover state for handling list in popover\r\n */\r\n popoverState: PopoverStateReturn\r\n}\r\n\r\nexport function StatelessSelect, Name = never>({\r\n // Select\r\n name,\r\n label,\r\n isHorizontalLabel,\r\n value,\r\n items = [],\r\n onChange,\r\n labelClassName,\r\n labelTitleClassName,\r\n 'aria-label': ariaLabel,\r\n // Button\r\n theme,\r\n buttonContent,\r\n placeholder = 'Select value',\r\n // Popover\r\n popoverState,\r\n listProps,\r\n isNativeMobileSelect = true,\r\n isAlwaysNativeSelect = false,\r\n hasPopoverViewportHeightLimit = false,\r\n hasPopoverButtonWidthLimit = true,\r\n children,\r\n ...props\r\n}: StatelessSelectProps) {\r\n const { selectedIndex, onItemChange } = useSelect(popoverState, value, items, (item) => onChange?.(item, name!))\r\n const showMobileSelect = isNativeMobileSelect && isMobile()\r\n const isNativeSelect = isAlwaysNativeSelect || showMobileSelect\r\n\r\n /** Items can have `href` and be router Links. We need a way to account for this in native select */\r\n const isInRouterContext = useInRouterContext()\r\n const NativeSelectComponent = isInRouterContext ? NativeSelectInRouterContext : NativeSelect\r\n\r\n return (\r\n \r\n \r\n {buttonContent ?? items[selectedIndex!]?.label ?? placeholder}\r\n \r\n {isNativeSelect ? (\r\n
\r\n }\r\n buttonContent={getSelectedTimeframeLabel()}\r\n data-testid={`chart-${chartIndex}-timeframes-select`}\r\n hasPopoverViewportHeightLimit\r\n isNativeMobileSelect={false}\r\n hasPopoverButtonWidthLimit={false}\r\n listProps={selectWithTooltipListProps}\r\n >\r\n {timeFrameGroups.flatMap(({ timeframes }, groupIndex) => [\r\n ,\r\n ...timeframes.map((item) => {\r\n const isIconButtonActive = favoriteTimeframes.includes(item.value)\r\n let linkProps = {}\r\n if (item.href) {\r\n linkProps = {\r\n as: Link,\r\n to: item.href,\r\n reloadDocument: !!item.withReload,\r\n }\r\n }\r\n return (\r\n ) => {\r\n ev.stopPropagation()\r\n ev.preventDefault()\r\n onFavoriteTimeframeToggle(item)\r\n }}\r\n className={classNames('group -mr-2', {\r\n 'text-gray-300': !isIconButtonActive,\r\n 'text-yellow-200': isIconButtonActive,\r\n })}\r\n >\r\n \r\n \r\n \r\n ) : undefined\r\n }\r\n >\r\n {item.label}\r\n \r\n )\r\n }),\r\n ])}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { BoxRounding } from '../box'\r\nimport { Button, ButtonPadding, ButtonProps, ButtonSize, ButtonSizeType } from '../button'\r\nimport { DateRangeBaseOption, DateRangeSelect } from './daterange-select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\nimport { TimeframeBaseOption, TimeframeSelect } from './timeframe-select'\r\n\r\ninterface Props {\r\n isPremium?: boolean\r\n chartIndex?: number\r\n compactViewMaxBreakpointPx?: number\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedTimeframe: string\r\n selectedDateRange: string | null\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n onDateRangeSelect: (value: DateRange) => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n size?: ButtonSizeType\r\n loadingTimeframe?: string\r\n rounding?: keyof typeof BoxRounding\r\n isDateRangeAvailable?: boolean\r\n containerElement?: HTMLElement\r\n className?: string\r\n isFavoritesEnabled?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n isTimeframeSelectEnabled?: boolean\r\n isCompactOnly?: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nfunction getTimeframeChipElementId({ timeframe, chartIndex }: { timeframe: string; chartIndex: number }) {\r\n return `${chartIndex}-${timeframe}`\r\n}\r\n\r\nfunction getButtonPadding(size: ButtonSize): keyof typeof ButtonPadding {\r\n switch (size) {\r\n case ButtonSize.small:\r\n case ButtonSize.regular:\r\n return 'small'\r\n case ButtonSize.medium:\r\n return 'regular'\r\n case ButtonSize.large:\r\n return 'medium'\r\n case ButtonSize.none:\r\n return 'none'\r\n }\r\n}\r\n\r\nexport function TimeframeBar({\r\n isPremium = FinvizSettings.hasUserPremium,\r\n chartIndex = 0,\r\n compactViewMaxBreakpointPx = 400,\r\n timeFrameGroups,\r\n dateRangeGroups,\r\n selectedTimeframe,\r\n selectedDateRange,\r\n favoriteTimeframes,\r\n loadingTimeframe,\r\n onTimeframeSelect,\r\n onDateRangeSelect,\r\n onFavoriteTimeframeToggle,\r\n size,\r\n rounding = 'regular',\r\n isDateRangeAvailable = true,\r\n containerElement,\r\n className,\r\n isFavoritesEnabled = true,\r\n isScrollIntoViewEnabled = true,\r\n isTimeframeSelectEnabled,\r\n isCompactOnly = false,\r\n theme,\r\n}: Props) {\r\n const [scrollWrapperElement, setScrollWrapperElement] = React.useState(null)\r\n const [timeframeButtonsScrollLocation, setTimeframeButtonsScrollLocation] = React.useState({\r\n isOnLeftEdge: true,\r\n isOnRightEdge: true,\r\n })\r\n const { setElementRef, elementWidth } = useElementMeasure(containerElement)\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const timeframesInExpandedPanel = React.useMemo(\r\n () =>\r\n isFavoritesEnabled\r\n ? flatTimeframes.filter(({ value }) => value === selectedTimeframe || favoriteTimeframes.includes(value))\r\n : flatTimeframes,\r\n [flatTimeframes, selectedTimeframe, favoriteTimeframes, isFavoritesEnabled]\r\n )\r\n\r\n const isCompactView =\r\n isCompactOnly || elementWidth < compactViewMaxBreakpointPx || timeframesInExpandedPanel.length <= 1\r\n const checkTimeframeWrapperScrollPosition = React.useCallback(() => {\r\n if (scrollWrapperElement) {\r\n const isOnLeftEdge = scrollWrapperElement.scrollLeft === 0\r\n const isOnRightEdge =\r\n Math.ceil(scrollWrapperElement.offsetWidth + scrollWrapperElement.scrollLeft) >=\r\n scrollWrapperElement.scrollWidth\r\n\r\n if (\r\n timeframeButtonsScrollLocation.isOnLeftEdge !== isOnLeftEdge ||\r\n timeframeButtonsScrollLocation.isOnRightEdge !== isOnRightEdge\r\n ) {\r\n setTimeframeButtonsScrollLocation({ isOnLeftEdge, isOnRightEdge })\r\n }\r\n }\r\n }, [timeframeButtonsScrollLocation, scrollWrapperElement])\r\n\r\n React.useEffect(() => {\r\n checkTimeframeWrapperScrollPosition()\r\n }, [checkTimeframeWrapperScrollPosition, scrollWrapperElement, elementWidth])\r\n\r\n React.useEffect(() => {\r\n if (!isCompactView && isScrollIntoViewEnabled) {\r\n const timeframeElement = document.getElementById(\r\n getTimeframeChipElementId({ chartIndex, timeframe: selectedTimeframe })\r\n )\r\n\r\n if (timeframeElement && scrollWrapperElement) {\r\n const leftOffset =\r\n timeframeElement.offsetLeft + timeframeElement.clientWidth / 2 - scrollWrapperElement.clientWidth / 2\r\n\r\n scrollWrapperElement.scrollTo(Math.max(0, Math.min(leftOffset, scrollWrapperElement.scrollWidth)), 0)\r\n }\r\n }\r\n }, [isCompactView, chartIndex, selectedTimeframe, elementWidth, isScrollIntoViewEnabled, scrollWrapperElement])\r\n\r\n return (\r\n \r\n {(isTimeframeSelectEnabled ?? isFavoritesEnabled) && (\r\n
\r\n \r\n
\r\n )}\r\n {!isCompactView && (\r\n
\r\n \r\n {\r\n /*\r\n * Vertical scrolling doesn't scroll horizontally by default (it's possible when holding shift)\r\n * When using touchpad we may get values in both delatX and deltaY, so if someone's scrolling horizontally we don't want to do anything\r\n * but if they are scrolling vertically (deltaY > deltaX) we want to scroll horizontally the value they would nativally scroll in vertical direction\r\n * */\r\n const absDx = Math.abs(event.deltaX)\r\n const absDy = Math.abs(event.deltaY)\r\n if (absDy > absDx) {\r\n event.currentTarget.scrollLeft += event.deltaY\r\n }\r\n }}\r\n >\r\n {timeframesInExpandedPanel.map((timeframe) => {\r\n let linkProps = {}\r\n if (timeframe.href) {\r\n linkProps = {\r\n as: Link,\r\n to: timeframe.href,\r\n reloadDocument: timeframe.withReload ?? !isPremium,\r\n onClick: () => onTimeframeSelect(timeframe),\r\n }\r\n } else {\r\n linkProps = {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n onTimeframeSelect(timeframe)\r\n },\r\n }\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n })}\r\n
\r\n \r\n \r\n )}\r\n {isDateRangeAvailable && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { type To } from 'react-router-dom'\r\n\r\nimport { decodeQueryString, encodeQueryString } from '../../../app/queryString'\r\nimport { SpecificChartFunctionality } from '../../../app/shared/chartLayoutConfig'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { DateRangeType, Instrument } from '../../types'\r\nimport { CUSTOM_DATE_RANGE, CustomDateRangePrefixEnum, DATE_RANGE_PREFIX_DELMITER } from './custom-date-range-utils'\r\n\r\ninterface ITimeFrame {\r\n value: TIMEFRAME | 'intraday'\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\nexport interface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\ninterface IDateRange {\r\n value: string\r\n label: string\r\n timeframe?: TIMEFRAME\r\n}\r\n\r\nexport interface IRangeGroup {\r\n label?: string\r\n dateRanges: IDateRange[]\r\n}\r\n\r\nexport const generateTimeframeGroups = (isPremium = true): ITimeframeGroup[] => {\r\n const premiumTimeframes: ITimeframeGroup[] = [\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.i1, label: '1 Minute', labelShort: '1M' },\r\n { value: TIMEFRAME.i2, label: '2 Minutes', labelShort: '2M' },\r\n { value: TIMEFRAME.i3, label: '3 Minutes', labelShort: '3M' },\r\n { value: TIMEFRAME.i5, label: '5 Minutes', labelShort: '5M' },\r\n { value: TIMEFRAME.i10, label: '10 Minutes', labelShort: '10M' },\r\n { value: TIMEFRAME.i15, label: '15 Minutes', labelShort: '15M' },\r\n { value: TIMEFRAME.i30, label: '30 Minutes', labelShort: '30M' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.h, label: '1 Hour', labelShort: '1H', labelPageTitle: 'Hourly' },\r\n { value: TIMEFRAME.h2, label: '2 Hours', labelShort: '2H' },\r\n { value: TIMEFRAME.h4, label: '4 Hours', labelShort: '4H' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'D', labelPageTitle: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'W', labelPageTitle: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'M', labelPageTitle: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n const freeTimeframes = [\r\n {\r\n // intradayTimeframe is only for non premium users used as redirect to elite subscription\r\n label: '',\r\n timeframes: [{ value: 'intraday' as const, label: 'Intraday', labelShort: 'Intraday' }],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n return isPremium ? premiumTimeframes : freeTimeframes\r\n}\r\n\r\nexport function getTimeframeGroups(isPremium: boolean) {\r\n return generateTimeframeGroups(isPremium)\r\n}\r\n\r\nexport const generateDateRangeGroups = ({\r\n isPremium,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n instrument: Instrument\r\n}): IRangeGroup[] => {\r\n const isStock = instrument === Instrument.Stock\r\n const rangeGroups: Array<{ label?: string; dateRanges: IDateRange[] }> = [\r\n {\r\n label: 'Days',\r\n dateRanges: [\r\n { value: DateRangeType.d1, label: '1 Day', timeframe: isStock ? TIMEFRAME.i1 : TIMEFRAME.i5 },\r\n { value: DateRangeType.d5, label: '5 Days', timeframe: isStock ? TIMEFRAME.i5 : TIMEFRAME.i30 },\r\n ],\r\n },\r\n {\r\n label: 'Months',\r\n dateRanges: [\r\n { value: DateRangeType.m1, label: '1 Month', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m3, label: '3 Months', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m6, label: '6 Months', timeframe: TIMEFRAME.d },\r\n ],\r\n },\r\n {\r\n label: 'Years',\r\n dateRanges: [\r\n { value: DateRangeType.ytd, label: 'Year to Date', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y1, label: '1 Year', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y2, label: '2 Years', timeframe: TIMEFRAME.w },\r\n { value: DateRangeType.y5, label: '5 Years', timeframe: isPremium ? TIMEFRAME.w : TIMEFRAME.m },\r\n { value: DateRangeType.max, label: 'Max', timeframe: TIMEFRAME.m },\r\n ],\r\n },\r\n ]\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroups({\r\n isPremium,\r\n customRange,\r\n isCustomAvailable = true,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n customRange?: string\r\n isCustomAvailable?: boolean\r\n instrument: Instrument\r\n}) {\r\n const rangeGroups = generateDateRangeGroups({ isPremium, instrument })\r\n\r\n if (isPremium && isCustomAvailable !== false) {\r\n const [dateRangePrefix] = customRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n rangeGroups.push({\r\n dateRanges: [\r\n {\r\n value:\r\n customRange && Object.values(CustomDateRangePrefixEnum).includes(dateRangePrefix)\r\n ? customRange\r\n : CUSTOM_DATE_RANGE,\r\n label: 'Custom',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n generatePath,\r\n withReload,\r\n isCustomAvailable,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n isCustomAvailable?: boolean\r\n customRange?: string\r\n withReload?: boolean\r\n instrument: Instrument\r\n generatePath: (dateRange: IDateRange) => To\r\n}) {\r\n return getDateRangeGroups({\r\n isPremium,\r\n isCustomAvailable,\r\n customRange,\r\n instrument,\r\n }).map((dateRangeGroup: IRangeGroup) => ({\r\n label: dateRangeGroup.label,\r\n dateRanges: dateRangeGroup.dateRanges.map((dateRange) => ({\r\n ...dateRange,\r\n href:\r\n !isPremium || Object.values(DateRangeType).includes(dateRange.value as DateRangeType)\r\n ? generatePath(dateRange)\r\n : undefined,\r\n withReload: withReload ?? !isPremium,\r\n })),\r\n }))\r\n}\r\n\r\nconst FREE_PERIODS_STOCK = ['d', 'w', 'm']\r\n\r\nexport function generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname,\r\n timeframe,\r\n dateRange,\r\n utmCampaign,\r\n freeTimeframes = FREE_PERIODS_STOCK,\r\n dateRangeQueryKey = 'r',\r\n}: {\r\n isPremium: boolean\r\n pathname: string\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n utmCampaign?: string\r\n freeTimeframes?: string[]\r\n dateRangeQueryKey?: string\r\n}) {\r\n if (isPremium || freeTimeframes.includes(timeframe)) {\r\n return {\r\n pathname,\r\n search: `?${encodeQueryString({\r\n ...decodeQueryString(),\r\n i: undefined,\r\n p: timeframe,\r\n [dateRangeQueryKey]: dateRange ?? undefined,\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n pathname: '/elite.ashx',\r\n search: `?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign || window.location.pathname,\r\n })}`,\r\n }\r\n}\r\n\r\nexport const timeframeUtm: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-timeframe',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe',\r\n}\r\n\r\nexport const daterangeUtm: Partial> = {\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe-daterange',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe-daterange',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe-daterange',\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { generateDateRangeGroups } from './utils'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// charts: app/utils/chart-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange?: string) {\r\n return dateRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nconst DAYS_IN_YEAR = 365\r\n\r\nexport function getCustomStartEndDateRangeUrlParam({ start, end }: { start: Date | null; end: Date | null }) {\r\n const startString = start ? formatDateToStringUS(start) : ''\r\n const endString = end ? formatDateToStringUS(end) : ''\r\n\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Range,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n startString,\r\n CUSTOM_DATE_RANGE_DELIMITER,\r\n endString,\r\n ]\r\n\r\n return stringParts.join('').replace(/\\//g, '-')\r\n}\r\n\r\nexport function getPrevPeriodDateRangeUrlParam({\r\n years,\r\n months,\r\n days,\r\n}: {\r\n years: number\r\n months: number\r\n days: number\r\n}) {\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Prev,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n years,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n months,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n days,\r\n ]\r\n\r\n return stringParts.join('')\r\n}\r\n\r\nexport function getTimeframeForDateRangeType({\r\n dateRange,\r\n isPremium = true,\r\n instrument,\r\n}: {\r\n dateRange: string\r\n isPremium?: boolean\r\n instrument: Instrument\r\n}) {\r\n const dateRanges = generateDateRangeGroups({ isPremium, instrument }).flatMap(({ dateRanges }) => dateRanges)\r\n return dateRanges.find(({ value }) => value === dateRange)?.timeframe ?? null\r\n}\r\n\r\nexport function getTimeframeFromDateRange({\r\n dateRange,\r\n anchorDate,\r\n instrument,\r\n isPremium,\r\n}: {\r\n dateRange: string\r\n anchorDate: Date\r\n instrument: Instrument\r\n isPremium: boolean\r\n}) {\r\n const dateRangeTimeframe = getTimeframeForDateRangeType({ dateRange, instrument })\r\n if (dateRangeTimeframe) {\r\n return dateRangeTimeframe\r\n }\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n const startNyTime = start ?? new Date(0)\r\n const startToReferenceDateNumOfDays = dateFns.differenceInCalendarDays(anchorDate, startNyTime) + 1\r\n const rangeNumOfDays = dateFns.differenceInCalendarDays(end ?? anchorDate, startNyTime) + 1\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n if (rangeNumOfDays > 6 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 4 * DAYS_IN_YEAR) {\r\n return isPremium ? TIMEFRAME.w : TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 1.5 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.w\r\n }\r\n\r\n // Keep these values in sync with values in FetchQuoteIntraday in quote.cs\r\n if (instrument === Instrument.Stock) {\r\n if (rangeNumOfDays <= 1 && startToReferenceDateNumOfDays <= 11) {\r\n return TIMEFRAME.i1\r\n }\r\n\r\n if (rangeNumOfDays <= 5 && startToReferenceDateNumOfDays <= 16) {\r\n return TIMEFRAME.i5\r\n }\r\n\r\n if (rangeNumOfDays <= 7 && startToReferenceDateNumOfDays <= 200) {\r\n return TIMEFRAME.i30\r\n }\r\n } else {\r\n if (startToReferenceDateNumOfDays <= 2) {\r\n return TIMEFRAME.i5\r\n }\r\n if (startToReferenceDateNumOfDays <= 7) {\r\n return TIMEFRAME.i30\r\n }\r\n }\r\n\r\n return TIMEFRAME.d\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { Button } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { DatePicker } from '../date-picker'\r\nimport { Delayed } from '../delayed'\r\nimport { Dialog, DialogBody, DialogFooter, DialogHeader } from '../dialog'\r\nimport { Input } from '../input'\r\nimport { Spinner } from '../spinner'\r\nimport {\r\n CustomDateRangePrefixEnum,\r\n getCustomStartEndDateRangeUrlParam,\r\n getParsedDateRange,\r\n getPrevPeriodDateRangeUrlParam,\r\n parseCustomDateRangeUrlParam,\r\n} from './custom-date-range-utils'\r\n\r\nconst DATA_YEAR_START = 1980\r\nconst DATE_PICKER_MIN_DATE = new Date(`01/01/${DATA_YEAR_START}`)\r\nconst YEARS_MAX_VALUE = new Date().getFullYear() - DATA_YEAR_START\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' } as const\r\n\r\nexport enum CustomRangeType {\r\n StartEnd,\r\n Manual,\r\n}\r\n\r\ninterface StartEndRange {\r\n kind: CustomRangeType.StartEnd\r\n start: Date | null\r\n end: Date | null\r\n}\r\n\r\ninterface ManualRange {\r\n kind: CustomRangeType.Manual\r\n days?: number\r\n months?: number\r\n years?: number\r\n}\r\n\r\nexport type CustomDateRangeType = StartEndRange | ManualRange\r\n\r\ninterface DialogContentProps {\r\n /**\r\n * Dialog state\r\n */\r\n dialogState: any\r\n dateRange?: string\r\n anchorDate: Date\r\n onDialogSubmit: (args: { dateRange: string | null }) => void\r\n isFetching?: boolean\r\n}\r\n\r\nconst DEFAULT_MANUAL_RANGE: ManualRange = {\r\n kind: CustomRangeType.Manual,\r\n days: 0,\r\n months: 0,\r\n years: 0,\r\n}\r\n\r\nconst DEFAULT_START_END_RANGE: StartEndRange = {\r\n kind: CustomRangeType.StartEnd,\r\n start: null,\r\n end: null,\r\n}\r\n\r\nfunction isValidManualRangeState({ years = 0, months = 0, days = 0 }: ManualRange) {\r\n return years + months + days > 0\r\n}\r\n\r\nfunction isValidStartEndRangeState({ start, end }: StartEndRange) {\r\n return !!(start || end)\r\n}\r\n\r\nfunction getDefaultSelectedTab(dateRange?: string) {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return CustomRangeType.StartEnd\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n return CustomRangeType.Manual\r\n }\r\n }\r\n return CustomRangeType.StartEnd\r\n}\r\n\r\nfunction getDefaultSelectedDate({\r\n dateRange,\r\n anchorDate,\r\n}: {\r\n dateRange?: string\r\n anchorDate: Date\r\n}): CustomDateRangeType {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return { kind: CustomRangeType.StartEnd, start, end }\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev && start && end) {\r\n const { years, months, days } = dateFns.intervalToDuration({\r\n start: dateFns.sub(start, { days: 1 }),\r\n end,\r\n })\r\n return { kind: CustomRangeType.Manual, years, months, days }\r\n }\r\n }\r\n\r\n return DEFAULT_START_END_RANGE\r\n}\r\n\r\nexport function CustomDateRange({\r\n dialogState,\r\n dateRange,\r\n anchorDate,\r\n onDialogSubmit,\r\n isFetching,\r\n}: DialogContentProps) {\r\n const [selectedTab, setSelectedTab] = React.useState(getDefaultSelectedTab(dateRange))\r\n\r\n const [state, setState] = React.useState(getDefaultSelectedDate({ dateRange, anchorDate }))\r\n\r\n const { current: onChange } = React.useRef((kind: CustomRangeType, newValue: Partial) => {\r\n setState((prevState) => {\r\n if (kind === CustomRangeType.Manual) {\r\n const defaults = prevState?.kind === CustomRangeType.Manual ? prevState : DEFAULT_MANUAL_RANGE\r\n return { ...defaults, ...newValue } as ManualRange\r\n }\r\n if (kind === CustomRangeType.StartEnd) {\r\n const defaults = prevState?.kind === CustomRangeType.StartEnd ? prevState : DEFAULT_START_END_RANGE\r\n\r\n const newState = { ...defaults, ...newValue }\r\n if (newState.start && newState.end && newState.start.getTime() > newState.end.getTime()) {\r\n const newEnd = new Date(newState.start.getTime())\r\n newState.start = newState.end\r\n newState.end = newEnd\r\n }\r\n return newState\r\n }\r\n return prevState\r\n })\r\n })\r\n\r\n const handleSubmit = (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n\r\n let dateRange = null\r\n\r\n if (state?.kind === CustomRangeType.StartEnd && isValidStartEndRangeState(state)) {\r\n dateRange = getCustomStartEndDateRangeUrlParam({ start: state.start, end: state.end })\r\n } else if (state?.kind === CustomRangeType.Manual && isValidManualRangeState(state)) {\r\n dateRange = getPrevPeriodDateRangeUrlParam({\r\n days: state.days ?? 0,\r\n months: state.months ?? 0,\r\n years: state.years ?? 0,\r\n })\r\n }\r\n\r\n onDialogSubmit({ dateRange })\r\n }\r\n\r\n const isAbsolute = state?.kind === CustomRangeType.StartEnd\r\n const fromDate = isAbsolute ? state.start : DEFAULT_START_END_RANGE.start\r\n const toDate = isAbsolute ? state.end : DEFAULT_START_END_RANGE.end\r\n\r\n const manualRange = {\r\n ...DEFAULT_MANUAL_RANGE,\r\n ...(state?.kind === CustomRangeType.Manual ? state : {}),\r\n }\r\n\r\n return (\r\n \r\n \r\n Custom Date Range\r\n \r\n
\r\n \r\n \r\n setSelectedTab(CustomRangeType.StartEnd)}\r\n >\r\n Start / End\r\n \r\n setSelectedTab(CustomRangeType.Manual)}\r\n >\r\n Range\r\n \r\n \r\n\r\n {selectedTab === CustomRangeType.StartEnd ? (\r\n
\r\n onChange(CustomRangeType.StartEnd, { start })}\r\n >\r\n \r\n \r\n onChange(CustomRangeType.StartEnd, { end })}\r\n >\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n ) =>\r\n onChange(CustomRangeType.Manual, { years: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { months: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { days: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n setState(state.kind === CustomRangeType.Manual ? DEFAULT_MANUAL_RANGE : DEFAULT_START_END_RANGE)\r\n }\r\n >\r\n Reset\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport { To, useNavigate } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { useDialogState } from '../dialog'\r\nimport { getTimeframeFromDateRange } from './custom-date-range-utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\ninterface IUseCustomDateRangeDialogSubmitProps {\r\n anchorDate?: Date\r\n instrument?: Instrument\r\n shouldReloadOnNavigate?: boolean\r\n pathGenerator?: ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n pathname: string\r\n search: string\r\n }\r\n}\r\n\r\nexport function useCustomDateRangeDialog({\r\n anchorDate,\r\n instrument,\r\n pathGenerator,\r\n shouldReloadOnNavigate = false,\r\n}: IUseCustomDateRangeDialogSubmitProps) {\r\n const navigate = useNavigate()\r\n const customDateRangeDialogState = useDialogState()\r\n\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n const handleDateRangeSelect = React.useCallback(\r\n (\r\n { value, timeframe, href }: { value: string; timeframe?: TIMEFRAME; href?: To },\r\n callback?: ({ value, timeframe, href }: { value: string; timeframe: TIMEFRAME; href?: To }) => void\r\n ) => {\r\n if (!timeframe) {\r\n if (isPremium) {\r\n customDateRangeDialogState.show()\r\n }\r\n return\r\n }\r\n\r\n if (!href && pathGenerator) {\r\n const path = pathGenerator({ timeframe, dateRange: value })\r\n if (shouldReloadOnNavigate) {\r\n window.location.href = `${path.pathname}?${path.search}`\r\n } else {\r\n navigate(path)\r\n }\r\n }\r\n\r\n callback?.({ value, timeframe, href })\r\n },\r\n [navigate, customDateRangeDialogState, isPremium, pathGenerator, shouldReloadOnNavigate]\r\n )\r\n\r\n const getDateRangeTimeframe = React.useCallback(\r\n (dateRange: string | null) => {\r\n if (!anchorDate || !instrument || !dateRange) return null\r\n\r\n return {\r\n value: dateRange,\r\n timeframe: getTimeframeFromDateRange({\r\n dateRange: dateRange!,\r\n anchorDate,\r\n isPremium,\r\n instrument,\r\n }),\r\n }\r\n },\r\n [anchorDate, instrument, isPremium]\r\n )\r\n\r\n const onDialogSubmit = React.useCallback(\r\n ({ value: dateRange, timeframe: newTimeframe }: { value: string; timeframe: TIMEFRAME }) => {\r\n handleDateRangeSelect({\r\n value: dateRange,\r\n timeframe: newTimeframe,\r\n })\r\n customDateRangeDialogState.hide()\r\n },\r\n // We only want `customDateRangeDialogState.hide`, not the whole dialog\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [customDateRangeDialogState.hide, handleDateRangeSelect]\r\n )\r\n\r\n return { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { useSyncLocalStorage } from '../../hooks/use-sync-local-storage'\r\n\r\ntype FavoriteTimeframesMap = { [K in TIMEFRAME | 'intraday']?: boolean }\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS = {\r\n [TIMEFRAME.i1]: true,\r\n [TIMEFRAME.i2]: false,\r\n [TIMEFRAME.i3]: true,\r\n [TIMEFRAME.i5]: true,\r\n [TIMEFRAME.i10]: false,\r\n [TIMEFRAME.i15]: true,\r\n [TIMEFRAME.i30]: true,\r\n [TIMEFRAME.h]: true,\r\n [TIMEFRAME.h2]: false,\r\n [TIMEFRAME.h4]: false,\r\n [TIMEFRAME.d]: true,\r\n [TIMEFRAME.w]: true,\r\n [TIMEFRAME.m]: true,\r\n}\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS_FREE = {\r\n ...TIMEFRAME_FAVORITE_DEFAULTS,\r\n intraday: true,\r\n}\r\n\r\nconst LOCAL_STORAGE_KEY = 'favoriteTimeframesMap'\r\n\r\nexport function useFavoriteTimeframes(isPremium = true) {\r\n const { state, setState } = useSyncLocalStorage(\r\n LOCAL_STORAGE_KEY,\r\n isPremium ? TIMEFRAME_FAVORITE_DEFAULTS : TIMEFRAME_FAVORITE_DEFAULTS_FREE\r\n )\r\n\r\n const toggleFavoriteTimeframe = React.useCallback(\r\n (timeframe: TIMEFRAME) => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n [timeframe]: !prevState[timeframe],\r\n }))\r\n },\r\n [setState]\r\n )\r\n\r\n const favoriteTimeframes = React.useMemo(\r\n () => Object.keys(state).filter((key) => state[key as keyof FavoriteTimeframesMap]),\r\n [state]\r\n )\r\n\r\n return {\r\n favoriteTimeframes: isPremium ? favoriteTimeframes : Object.keys(TIMEFRAME_FAVORITE_DEFAULTS_FREE),\r\n toggleFavoriteTimeframe,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { getExtendedDialogState } from './dialog'\r\nimport { Input, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Tooltip text content\r\n */\r\n tooltipContent?: React.ReactNode\r\n tooltipColor?: keyof typeof TooltipColor\r\n tooltipSettings?: Reakit.TooltipInitialState\r\n}\r\n\r\nfunction TooltipInputWrapper({\r\n children,\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n name,\r\n}: TooltipInputWrapperProps) {\r\n const tooltip = useTooltipState({ placement: 'bottom', ...tooltipSettings })\r\n const { isFullyClosed } = getExtendedDialogState(tooltip)\r\n\r\n return (\r\n <>\r\n \r\n {children}\r\n \r\n {tooltipContent && !isFullyClosed && (\r\n \r\n {tooltipContent}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n {\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n isInteractive = true,\r\n ...props\r\n }: TooltipInputProps & Omit,\r\n ref: React.ForwardedRef\r\n) {\r\n const input = \r\n\r\n if (!isInteractive) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n {input}\r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\nexport interface TooltipBoxProps extends Omit, 'ref'> {\r\n /**\r\n * Color of the tooltip. If se to `none`, the tooltip will have default color\r\n * based on light/dark theme\r\n *\r\n * @default 'none'\r\n */\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport const TooltipBox = React.forwardRef(function TooltipBox(\r\n { color = 'none', ...props }: TooltipBoxProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const tooltipColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n})\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { TooltipArrow } from './tooltip-arrow'\r\nimport { TooltipBox, TooltipBoxProps } from './tooltip-box'\r\n\r\ninterface TooltipProps extends TooltipBoxProps {\r\n /**\r\n * The returned object from `useTooltipState`\r\n */\r\n state: Reakit.TooltipStateReturn\r\n}\r\n\r\nexport function Tooltip({ state, children, color = 'none', ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...tooltipProps }) => (\r\n
\r\n \r\n \r\n \r\n \r\n {children}\r\n \r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\ninterface TooltipButtonProps extends Reakit.TooltipReferenceHTMLProps {\r\n state: Reakit.TooltipStateReturn\r\n\r\n /**\r\n * Whether or not should trigger element call blur to return focus back to body after click\r\n *\r\n * @default false\r\n */\r\n isBlurAfterClick?: boolean\r\n\r\n /**\r\n * Whether to ignore default mouse enter/leave tooltip trigger interactions\r\n * and hide tooltip only after clicking outside of the trigger element\r\n *\r\n * @default false\r\n */\r\n isHideOnClickOutside?: boolean\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const TooltipTrigger = React.forwardRef(\r\n (\r\n {\r\n state,\r\n isBlurAfterClick,\r\n isHideOnClickOutside,\r\n onClick,\r\n onMouseEnter,\r\n onMouseLeave,\r\n ...props\r\n }: TooltipButtonProps,\r\n ref: React.ForwardedRef\r\n ) => (\r\n {\r\n if (isBlurAfterClick && document.activeElement instanceof HTMLElement) {\r\n document.activeElement.blur()\r\n }\r\n onClick?.(e)\r\n }}\r\n onMouseEnter={(e) => {\r\n if (isHideOnClickOutside) e.preventDefault()\r\n onMouseEnter?.(e)\r\n }}\r\n onMouseLeave={(e) => {\r\n if (isHideOnClickOutside) e.preventDefault()\r\n onMouseLeave?.(e)\r\n }}\r\n {...props}\r\n {...state}\r\n >\r\n {props.children}\r\n \r\n )\r\n)\r\n","import * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../constants'\r\n\r\n/**\r\n * Hook which provides state to tooltips\r\n */\r\nexport function useTooltipState(settings?: Reakit.TooltipInitialState) {\r\n return Reakit.useTooltipState({\r\n ...settings,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { TooltipColor } from './types'\r\n\r\ntype PositionMain = 'auto' | 'top' | 'bottom' | 'left' | 'right'\r\ntype PositionSecondary = 'start' | 'end'\r\ntype Placement = PositionMain | `${PositionMain}-${PositionSecondary}`\r\n\r\nconst transformMap: Record = {\r\n auto: '',\r\n top: 'rotateZ(180deg)',\r\n right: 'rotateZ(-90deg)',\r\n bottom: 'rotateZ(360deg)',\r\n left: 'rotateZ(90deg)',\r\n}\r\n\r\ninterface TooltipArrowProps {\r\n color?: keyof typeof TooltipColor\r\n placement: Placement\r\n className?: string\r\n}\r\n\r\n/**\r\n * Custom arrow for the dropdown\r\n */\r\nexport function TooltipArrow({ placement, color = 'none', className }: TooltipArrowProps) {\r\n const positionMain = placement.split('-')[0] as PositionMain\r\n const arrowColor = TooltipColor[color]\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","export enum TooltipColor {\r\n none,\r\n green,\r\n red,\r\n orange,\r\n blue,\r\n dark,\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps extends HTMLProps {\r\n /**\r\n * Heading level\r\n */\r\n level: HeadingLevel\r\n}\r\n\r\nfunction getHeadingElement(level: HeadingLevel) {\r\n switch (level) {\r\n case 1:\r\n return 'h1'\r\n case 2:\r\n return 'h2'\r\n case 3:\r\n return 'h3'\r\n case 4:\r\n return 'h4'\r\n case 5:\r\n return 'h5'\r\n default:\r\n return 'h6'\r\n }\r\n}\r\n\r\nexport function Heading({ level, children, ...props }: PropsWithChildren) {\r\n return React.createElement(\r\n getHeadingElement(level),\r\n {\r\n ...props,\r\n className: classnames(props.className, 'font-bold', {\r\n 'text-3xl': level === 1,\r\n 'text-2xl': level === 2,\r\n 'text-xl': level === 3,\r\n 'text-sm': level === 5,\r\n 'text-2xs': level === 6,\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface ParagraphProps extends Omit>, 'size' | 'as'> {\r\n /**\r\n * Determines which element the text should render to\r\n *\r\n * @default p\r\n */\r\n as?: ElementType\r\n\r\n /**\r\n * Font size for the paragraph\r\n * - tiny - 10px\r\n * - small - 12px\r\n * - default - 14px\r\n * - medium - 16px\r\n * - large - 18px\r\n *\r\n * @default default\r\n */\r\n size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n /**\r\n * Paragraph font weight\r\n */\r\n medium?: boolean\r\n}\r\n\r\nexport function Paragraph({\r\n as = 'p',\r\n size = 'default',\r\n medium,\r\n children,\r\n ...props\r\n}: PropsWithChildren>) {\r\n return React.createElement(\r\n as,\r\n {\r\n ...props,\r\n className: classnames(props.className, {\r\n 'font-medium': medium,\r\n 'text-lg': size === 'large',\r\n 'text-sm': size === 'default',\r\n 'text-2xs': size === 'small',\r\n 'text-3xs': size === 'tiny',\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface LabelProps extends Omit, 'title'> {\r\n title?: ReactNode\r\n titleClassName?: string\r\n isHorizontal?: boolean\r\n}\r\n\r\nexport function Label({ title, titleClassName, isHorizontal, children, ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","export const CRYPTO_TICKERS = [\r\n 'BTCUSD',\r\n 'LTCUSD',\r\n 'ETHUSD',\r\n 'XRPUSD',\r\n 'BCHUSD',\r\n 'BTCEUR',\r\n 'LTCEUR',\r\n 'ETHEUR',\r\n 'XRPEUR',\r\n 'BCHEUR',\r\n 'LTCBTC',\r\n 'ETHBTC',\r\n 'XRPBTC',\r\n 'BCHBTC',\r\n]\r\n\r\n// Keep in sync with the copy in Charts repo - app/constants/common.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n","// Copy if this file is in charts repo in app/utils/ folder\r\nimport * as React from 'react'\r\n\r\nexport function useIsMounted() {\r\n const isMountedRef = React.useRef(false)\r\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\r\n\r\n React.useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n\r\n return getIsMounted\r\n}\r\n","import debounce from 'lodash.debounce'\r\nimport * as React from 'react'\r\n\r\nimport { useIsMounted } from './use-is-mounted'\r\nimport { useResizeObserver } from './use-resize-observer'\r\n\r\nexport function useElementMeasure(elementOverride: HTMLElement | null = null) {\r\n const ResizeObserver = useResizeObserver()\r\n const getIsMounted = useIsMounted()\r\n const [elementRef, setElementRef] = React.useState(elementOverride)\r\n const [elementWidth, setElementWidth] = React.useState(elementRef?.offsetWidth ?? 0)\r\n const [elementHeight, setElementHeight] = React.useState(elementRef?.offsetHeight ?? 0)\r\n\r\n React.useEffect(() => {\r\n if (!ResizeObserver) {\r\n return\r\n }\r\n\r\n const measureElement = () => {\r\n if (!getIsMounted()) {\r\n return\r\n }\r\n const newElementWidth = elementRef?.offsetWidth\r\n const newElementHeight = elementRef?.offsetHeight\r\n if (newElementWidth !== elementWidth) {\r\n setElementWidth(newElementWidth ?? 0)\r\n }\r\n if (newElementHeight !== elementHeight) {\r\n setElementHeight(newElementHeight ?? 0)\r\n }\r\n }\r\n const measureElementDebounced = debounce(measureElement, 200)\r\n\r\n const resizeObserver = new ResizeObserver((entries) => {\r\n /**\r\n * the reason for requestAnimationFrame is described here https://github.com/quasarframework/quasar/issues/2233\r\n * their approach was mostly to intercept and silence the error but I managed to avoid the error using requestAnimationFrame\r\n * */\r\n window.requestAnimationFrame(() => {\r\n if (Array.isArray(entries) && entries.length > 0) {\r\n measureElementDebounced()\r\n }\r\n })\r\n })\r\n\r\n if (elementRef) {\r\n resizeObserver.observe(elementRef)\r\n }\r\n\r\n measureElement()\r\n\r\n return () => {\r\n measureElementDebounced.cancel()\r\n resizeObserver?.disconnect()\r\n }\r\n }, [ResizeObserver, elementWidth, elementRef, elementHeight, getIsMounted])\r\n\r\n return { setElementRef: elementOverride ? () => {} : setElementRef, elementWidth, elementHeight }\r\n}\r\n","import * as React from 'react'\r\n\r\n/**\r\n * This hook is used to manually blur & focus first error input (or the one which is focussed now and has error)\r\n * The reason for this workaround is that we use reakit tooltips to show error message but the tooltip wrapper\r\n * is not rendered until there's actually an error but the tooltip trigger is rendered, and also it's open state is true\r\n * if the error input is currently the focused one. Focusing the input sets tooltip open state to true but nothing\r\n * is shown because there's no error thus the wrapper is not rendered.\r\n *\r\n * The issue is that if it's in open state (the input is focussed) and the input becomes invalid (has error)\r\n * it renderes tooltip wrapper with error message, but it doesn't recalculate (actually it doesn't calculate anything\r\n * unless both tooltip trigger and tooltip wrapper are rendered) its position, so it seems nothing is shown.\r\n *\r\n * This magic workaround triggers changes in effect hook inside reakit, so it recalculates tooltip position, it basically\r\n * closes and openes the tooltip again. Btw calling manually hide & show after doesn't work the same way.\r\n *\r\n * */\r\nexport function useFocusInputOnError(errors: unknown) {\r\n const lastFocusedElement = React.useRef(null)\r\n React.useEffect(() => {\r\n let errorInputToFocus = document.querySelector('.is-error input')\r\n const activeElement = document.activeElement\r\n if (lastFocusedElement.current === activeElement) {\r\n // this is done to prevent focusing another element if user types something\r\n // into current error input which resets the input error and triggers this effect\r\n lastFocusedElement.current = null\r\n return\r\n }\r\n if (activeElement?.classList.contains('is-error')) {\r\n errorInputToFocus = activeElement as HTMLInputElement\r\n }\r\n\r\n lastFocusedElement.current = errorInputToFocus\r\n\r\n errorInputToFocus?.blur?.()\r\n setTimeout(() => errorInputToFocus?.focus?.())\r\n }, [errors])\r\n}\r\n","import React from 'react'\r\n\r\nimport { DropdownStateReturn } from '../components/dropdown'\r\nimport { PopoverStateReturn } from '../components/popover'\r\nimport { useWindowSize } from './use-window-size'\r\n\r\ntype Props = {\r\n maxHeightLimit: number\r\n hasViewportHeightLimit: boolean\r\n offsets: [number, number]\r\n state: PopoverStateReturn | DropdownStateReturn\r\n}\r\n\r\nconst MAX_HEIGHT_PROPERTY = '--popover-max-height'\r\nconst POPOVER_HEIGHT_LIMIT_STYLE = {\r\n maxHeight: `calc(var(${MAX_HEIGHT_PROPERTY}) - env(safe-area-inset-bottom))`,\r\n}\r\n\r\n/**\r\n * Limit popover height to be always in viewport is `hasViewportHeightLimit` is true\r\n */\r\nexport function usePopoverMaxHeight({ maxHeightLimit, hasViewportHeightLimit, offsets, state }: Props) {\r\n const { innerHeight } = useWindowSize({ isWatching: state.visible || state.animating })\r\n const buttonElement = state.unstable_referenceRef.current\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !hasViewportHeightLimit) return\r\n\r\n // calculate height\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const [, offsetY] = offsets\r\n let elementMaxHeight = 'auto'\r\n if (state.placement.startsWith('bottom')) {\r\n let height = innerHeight - buttonRect.bottom - offsetY * 2\r\n // when used on pages where is scrollable content, buttonRect.bottom is sometimes negative\r\n // in that case we need to subtract window.scrollY\r\n if (buttonRect.bottom < 0) height -= window.scrollY\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n } else {\r\n const height = buttonRect.top - offsetY * 2\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n }\r\n\r\n // set height\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n popoverWrapper?.style.setProperty(MAX_HEIGHT_PROPERTY, elementMaxHeight)\r\n }, [buttonElement, innerHeight, maxHeightLimit, hasViewportHeightLimit, offsets, state.placement, state.visible])\r\n\r\n return hasViewportHeightLimit ? POPOVER_HEIGHT_LIMIT_STYLE : undefined\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { loadResizeObserverPolyfill } from '../util'\r\n\r\nexport function useResizeObserver() {\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const [ResizeObserver, setResizeObserver] = React.useState(\r\n () => window.ResizeObserver\r\n )\r\n\r\n React.useEffect(() => {\r\n if (typeof ResizeObserver === 'undefined') {\r\n loadResizeObserverPolyfill().then((polyfill) => {\r\n if (!controller.current?.signal.aborted) {\r\n setResizeObserver(() => polyfill)\r\n }\r\n })\r\n }\r\n }, [ResizeObserver])\r\n\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n return ResizeObserver\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SortDirectionValue, SortableValue } from '../types'\r\nimport { SortByColumnOptions, sortByColumn } from '../util'\r\n\r\nexport interface SortByShape {\r\n id: IdType\r\n\r\n /**\r\n * Provide value calculation for sort when value is computed in column renderer\r\n */\r\n getValueForSort?: (row: DataType) => SortableValue\r\n}\r\n\r\nexport function isSortByShape(sortBy?: unknown): sortBy is SortByShape {\r\n return sortBy?.hasOwnProperty?.('id') === true\r\n}\r\n\r\n/**\r\n * Default value getter which gets row data by `getValueForSort` defined on the column\r\n * If no sort value getter is provided, it falls back to getting data by column.id or returns the whole row\r\n */\r\nexport function getDefaultValueGetter(column: SortBy) {\r\n return (row: DataType): SortableValue => {\r\n let value = null\r\n\r\n if (isSortByShape(column)) {\r\n if (typeof column.getValueForSort === 'function') value = column.getValueForSort(row)\r\n else if (typeof row === 'object') value = row?.[column.id as keyof typeof row]\r\n } else {\r\n value = row\r\n }\r\n\r\n return (value as SortableValue) ?? null\r\n }\r\n}\r\n\r\nexport function useSortData({\r\n data,\r\n sortBy,\r\n direction,\r\n valueGetter = getDefaultValueGetter,\r\n options,\r\n}: {\r\n data: DataType[]\r\n sortBy?: SortBy | null\r\n direction: SortDirectionValue\r\n valueGetter?: (sortBy: SortBy) => (row: DataType) => SortableValue\r\n options?: SortByColumnOptions\r\n}) {\r\n return React.useMemo(() => {\r\n if (!sortBy) return [...data]\r\n\r\n return [...data].sort((a, b) =>\r\n sortByColumn({\r\n ...options,\r\n a,\r\n b,\r\n direction,\r\n valueGetter: valueGetter(sortBy),\r\n })\r\n )\r\n }, [data, options, direction, valueGetter, sortBy])\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as storage from '../services/local-storage'\r\n\r\n/**\r\n * Hook to synchronize localStorage.setItem across all components on the page on all open tabs\r\n */\r\nexport function useSyncLocalStorage(storageKey: string, defaultValue: ValueType) {\r\n const [state, setState] = React.useState(storage.getValue(storageKey, defaultValue))\r\n\r\n React.useEffect(() => {\r\n const subscription = storage.subscribeToChanges(storageKey, defaultValue, setState)\r\n\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n }, [storageKey, defaultValue])\r\n\r\n const setValue = React.useCallback(\r\n (valueGetter: React.SetStateAction) => storage.setValue(storageKey, valueGetter, defaultValue),\r\n [defaultValue, storageKey]\r\n )\r\n\r\n return {\r\n state,\r\n setState: setValue,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import * as React from 'react'\r\nimport { usePopper } from 'react-popper'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { Button } from '../button'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { Dropdown, DropdownItem, DropdownSeparator, useDropdownState } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nconst DEFAULT_OFFSETS: [number, number] = [5, 5]\r\n\r\nfunction getVirtualRef(top: number, left: number) {\r\n return {\r\n getBoundingClientRect(): DOMRect {\r\n const rect = {\r\n top: top - window.scrollY,\r\n x: top - window.scrollY,\r\n left: left - window.scrollX,\r\n y: left - window.scrollX,\r\n bottom: top,\r\n right: left,\r\n width: 0,\r\n height: 0,\r\n }\r\n\r\n return {\r\n ...rect,\r\n toJSON: () => rect,\r\n }\r\n },\r\n }\r\n}\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuProps {\r\n /**\r\n * Top coordinate of the click\r\n */\r\n top: number\r\n\r\n /**\r\n * Left coordinate of the click\r\n */\r\n left: number\r\n\r\n /**\r\n * Can limit the max height of the menu\r\n *\r\n * @default undefined\r\n */\r\n menuMaxHeight?: number\r\n\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n\r\n /**\r\n * Callback to hide the menu\r\n */\r\n hide: () => void\r\n}\r\n\r\nexport function ContextMenu({ top, left, menuMaxHeight, hide, items }: ContextMenuProps) {\r\n const [popperElement, setPopperElement] = React.useState(null)\r\n const virtualRef = React.useMemo(() => getVirtualRef(top, left), [left, top])\r\n const dropdownState = useDropdownState({ placement: 'bottom-start' })\r\n const { isFullyClosed } = getExtendedDialogState(dropdownState)\r\n const hasBeenOpen = React.useRef(false)\r\n\r\n const { styles, attributes } = usePopper(virtualRef, popperElement, {\r\n placement: 'auto-end',\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: DEFAULT_OFFSETS,\r\n },\r\n },\r\n ],\r\n })\r\n\r\n /**\r\n * This effect handles closing the context menu (parent element) itself\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed && hasBeenOpen.current) hide()\r\n }, [isFullyClosed, hide])\r\n\r\n /**\r\n * This effect handles opening/closing the inner dropdown\r\n */\r\n React.useEffect(() => {\r\n dropdownState.show()\r\n hasBeenOpen.current = true // This acts as a way to differentiate the first render\r\n\r\n return () => dropdownState.hide()\r\n // This needs to run only on mount/unmount for obvious reasons\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n \r\n }\r\n menuMaxHeight={menuMaxHeight}\r\n state={dropdownState}\r\n items={items}\r\n isStatic\r\n />\r\n \r\n )\r\n}\r\n\r\ninterface ContextMenuInnerProps {\r\n label: JSX.Element\r\n items: ContextMenuItem[]\r\n state: ReturnType\r\n isStatic?: boolean\r\n menuMaxHeight?: number\r\n}\r\n\r\nfunction ContextMenuInner(\r\n { label, items, state, isStatic, menuMaxHeight = Number.MAX_SAFE_INTEGER }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const innerState = useDropdownState({ placement: 'right-start' })\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: menuMaxHeight,\r\n hasViewportHeightLimit: true,\r\n offsets: DEFAULT_OFFSETS,\r\n state,\r\n })\r\n\r\n return (\r\n \r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return {item.label}\r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n items={item.options}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n className=\"shrink-0\"\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst ContextMenuDropdown = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\nconst DEFAULT_VALUE_KEY = 'value'\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { getDefaultValueGetter } from '../../hooks/use-sort-data'\r\nimport { columnMap } from '../../modules/portfolio/constants/columns'\r\nimport {\r\n ColumnId,\r\n PortfolioGroup,\r\n PortfolioSymbolType,\r\n RowKind,\r\n TableColumnDefinition,\r\n} from '../../modules/portfolio/types'\r\nimport { getColumnsByKeys } from '../../modules/portfolio/utils'\r\nimport { SortableValue } from '../../types'\r\nimport { SortDirection, Table, TableCell, TableHead, TableHeaderSortable, TableRow, useTableSort } from '../Table'\r\n\r\ninterface PortfolioWatchlistTableProps {\r\n data: PortfolioGroup[]\r\n selectedPortfolio: number\r\n handleTickerSelect: (ticker: string) => void\r\n chartTicker?: string\r\n isSelectClosed: boolean\r\n tableOrder: ColumnId\r\n handleOrderChange: (column: ColumnId) => void\r\n}\r\n\r\nconst visibleColumns = getColumnsByKeys([\r\n ColumnId.Ticker,\r\n ColumnId.LastClose,\r\n ColumnId.LastChangePct,\r\n ColumnId.LastChange,\r\n])\r\nconst sortableColumns = [columnMap[ColumnId.Order], ...visibleColumns]\r\n\r\nconst IS_MOBILE = isMobile()\r\n\r\nfunction isElementOverflowing(el: HTMLElement, containerElement?: HTMLDivElement) {\r\n if (!containerElement) return false\r\n\r\n const element = el.getBoundingClientRect()\r\n const container = containerElement.getBoundingClientRect()\r\n\r\n return element.top >= container.top && element.bottom <= container.bottom\r\n}\r\n\r\nfunction valueGetter(column: TableColumnDefinition) {\r\n const columnValueGetter = column.getValueForSort\r\n\r\n if (typeof columnValueGetter === 'undefined') return getDefaultValueGetter(column)\r\n\r\n return (row: PortfolioGroup): SortableValue => columnValueGetter({ kind: RowKind.Group, row }) ?? null\r\n}\r\n\r\nexport function PortfolioWatchlistTable({\r\n data,\r\n handleTickerSelect,\r\n chartTicker,\r\n selectedPortfolio,\r\n isSelectClosed,\r\n tableOrder,\r\n handleOrderChange,\r\n}: PortfolioWatchlistTableProps) {\r\n const stockRows = React.useMemo(() => data.filter((group) => group.type !== PortfolioSymbolType.Cash), [data])\r\n const tableSort = useTableSort({\r\n data: stockRows,\r\n columns: sortableColumns,\r\n valueGetter,\r\n defaultSort: ColumnId.Ticker,\r\n })\r\n const [selectedRow, setSelectedRow] = React.useState()\r\n const [containerElement, setContainerElement] = React.useState()\r\n\r\n React.useEffect(() => {\r\n const element = document.querySelector('[data-js=\"portfolio-watchlist-table-sidebar-container\"]')\r\n if (element) setContainerElement(element as HTMLDivElement)\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n const rowElement = document.querySelector(`[data-ticker=\"${chartTicker}\"]`) as HTMLElement\r\n if (isSelectClosed && rowElement !== document.activeElement && data.some(({ ticker }) => chartTicker === ticker)) {\r\n setSelectedRow(chartTicker)\r\n rowElement?.focus()\r\n }\r\n // We want to trigger this only on portfolio change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [selectedPortfolio, isSelectClosed, chartTicker])\r\n\r\n const handleKeyDown = (ev: React.KeyboardEvent, index: number) => {\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault()\r\n } else {\r\n return\r\n }\r\n\r\n const prevSibling = ev.currentTarget.previousElementSibling as HTMLElement | null\r\n const nextSibling = ev.currentTarget.nextElementSibling as HTMLElement | null\r\n const firstElement = ev.currentTarget.parentElement?.firstElementChild as HTMLElement | null\r\n const lastElement = ev.currentTarget.parentElement?.lastElementChild as HTMLElement | null\r\n\r\n if (ev.key === 'ArrowDown') {\r\n nextSibling?.focus({ preventScroll: true })\r\n if (!nextSibling) firstElement?.focus({ preventScroll: true })\r\n const el = document.activeElement as HTMLElement | null\r\n if (el && !isElementOverflowing(el, containerElement)) {\r\n document.activeElement?.scrollIntoView(false)\r\n }\r\n }\r\n if (ev.key === 'ArrowUp') {\r\n prevSibling?.focus({ preventScroll: true })\r\n if (!prevSibling) lastElement?.focus({ preventScroll: true })\r\n const el = document.activeElement as HTMLElement | null\r\n if (el && !isElementOverflowing(el, containerElement)) {\r\n document.activeElement?.scrollIntoView(index <= 1 ? false : true)\r\n }\r\n }\r\n\r\n const ticker = (document.activeElement as HTMLElement | null)?.dataset.ticker\r\n\r\n if (ticker) {\r\n setSelectedRow(ticker)\r\n }\r\n }\r\n\r\n const handleKeyUp = React.useCallback(\r\n (ev: React.KeyboardEvent) => {\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault()\r\n const ticker = (document.activeElement as HTMLElement | null)?.dataset.ticker\r\n if (ticker) {\r\n handleTickerSelect(ticker)\r\n }\r\n }\r\n },\r\n [handleTickerSelect]\r\n )\r\n\r\n const handleTableMouseMove = (ev: React.MouseEvent) => {\r\n if (!selectedRow) {\r\n ev.currentTarget.focus({ preventScroll: true })\r\n }\r\n }\r\n\r\n const handleSortChange = React.useCallback(\r\n (column: TableColumnDefinition) => {\r\n let newSort = column\r\n if (tableSort.sort.column.id === column.id && tableSort.sort.direction === SortDirection.Descending) {\r\n newSort = sortableColumns[0]\r\n }\r\n\r\n tableSort.changeSort(newSort)\r\n handleOrderChange(newSort.id)\r\n },\r\n [handleOrderChange, tableSort]\r\n )\r\n\r\n // Update sort when props change (used for watchlist sidebar header)\r\n React.useEffect(() => {\r\n if (tableOrder !== tableSort.sort.column.id) tableSort.changeSort(columnMap[tableOrder])\r\n // Only run this on props change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [tableOrder])\r\n\r\n return (\r\n \r\n \r\n {visibleColumns.map((column) => (\r\n handleSortChange(column)}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n \r\n {tableSort.data.map((entry, index) => (\r\n {\r\n setSelectedRow(entry.ticker)\r\n handleTickerSelect(entry.ticker)\r\n }}\r\n onMouseMove={handleTableMouseMove}\r\n onKeyDown={(ev) => handleKeyDown(ev, index)}\r\n onKeyUp={handleKeyUp}\r\n >\r\n {visibleColumns.map((column) => (\r\n \r\n {column.renderColumn({ kind: RowKind.Watchlist, row: entry, index })}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center p-1.5 bg-white dark:bg-gray-800', {\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n 'relative z-10 rounded-md border border-gray-100 dark:border-gray-600': isMobile,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n // reason for key is that popover is sealing initial state, description in\r\n // https://github.com/finvizhq/Finviz-Website/pull/402\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport function ToolbarButton({\r\n item,\r\n disabledTooltip,\r\n isInAction: isInActionProp,\r\n isLoading,\r\n ...props\r\n}: PropsWithAs & ToolbarButtonProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n & ToolbarButtonProps)}\r\n appearance={props.appearance ?? 'square'}\r\n title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n size={\r\n buttonSettings.size ??\r\n (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n }\r\n >\r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Icon } from '../icon'\r\nimport { PopoverTrigger, useHoverPopover } from '../popover'\r\nimport { SelectOption } from '../select'\r\nimport { useSelect } from '../select/hooks'\r\nimport { NativeSelect } from '../select/native-select'\r\nimport { SelectList } from '../select/select-list'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n}\r\n\r\nexport function ToolbarGroup({\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobile(),\r\n disabled,\r\n disabledTooltip,\r\n}: ToolbarGroupProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n const popoverState = useHoverPopover({\r\n placement: isAlternativeTheme && isStretched ? 'bottom' : 'right-start',\r\n })\r\n const select = useSelect(\r\n popoverState,\r\n selectedItem.id,\r\n groupItems?.map((i) => ({ value: i.id, label: i.title })) ?? [],\r\n (option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }\r\n )\r\n\r\n return (\r\n \r\n ) => {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n onChange(selectedItem.id, 'group')\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {useNativeSelect ? (\r\n ({ value: item.id, label: item.title }))}\r\n onChange={select.onItemChange}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n ) : (\r\n \r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(buttonClasses, 'mr-auto', getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.blue).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.Step.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog',\r\n // Add offset\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: step.offset ?? [0, 10],\r\n },\r\n },\r\n ],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.Tour.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","import * as time from '../../app/header/time'\r\nimport * as createAlert from '../../app/quote/create-alert'\r\nimport * as saveToPortfolio from '../../app/quote/save-to-portfolio'\r\nimport * as button from './button'\r\nimport * as buttonGroup from './button-group'\r\nimport * as checkbox from './checkbox'\r\nimport * as colorPicker from './color-picker'\r\nimport * as contextMenu from './context-menu'\r\nimport * as copyToClipboard from './copy-to-clipboard'\r\nimport * as datePicker from './date-picker'\r\nimport * as delayed from './delayed'\r\nimport * as dialog from './dialog'\r\nimport * as dropdown from './dropdown'\r\nimport * as grid from './grid'\r\nimport * as icon from './icon'\r\nimport * as innerState from './inner-state'\r\nimport * as input from './input'\r\nimport * as list from './list'\r\nimport * as notification from './notification'\r\nimport * as popover from './popover'\r\nimport * as portfolio from './portfolio'\r\nimport * as range from './range'\r\nimport * as search from './search'\r\nimport * as select from './select'\r\nimport * as spinner from './spinner'\r\nimport * as timeframeBar from './timeframe-bar'\r\nimport * as toolbar from './toolbar'\r\nimport * as tooltip from './tooltip'\r\nimport * as tooltipInput from './tooltip-input'\r\nimport * as tour from './tour'\r\nimport * as typography from './typography'\r\n\r\nfunction exportAsGlobal(win: any, key: string) {\r\n if (!(key in win)) win[key] = {}\r\n\r\n win[key].components = {\r\n ...button,\r\n ...buttonGroup,\r\n ...checkbox,\r\n ...colorPicker,\r\n ...contextMenu,\r\n ...copyToClipboard,\r\n ...delayed,\r\n ...dialog,\r\n ...datePicker,\r\n ...dropdown,\r\n ...grid,\r\n ...icon,\r\n ...innerState,\r\n ...input,\r\n ...list,\r\n ...notification,\r\n ...popover,\r\n ...range,\r\n ...search,\r\n ...select,\r\n ...spinner,\r\n ...time,\r\n ...timeframeBar,\r\n ...toolbar,\r\n ...tooltip,\r\n ...tooltipInput,\r\n ...tour,\r\n ...typography,\r\n ...portfolio,\r\n ...saveToPortfolio,\r\n ...createAlert,\r\n }\r\n}\r\n\r\nexportAsGlobal(window, 'FLibs')\r\n","/**\r\n * Expose loader doesn’t map these to window.FLibs until we import them somewhere.\r\n * Until we figure out a better way, this file needs to be included on the charts page\r\n */\r\n// eslint-disable-next-line react/no-typos\r\nimport 'classnames'\r\nimport { max, nice, scaleLinear, scaleSymlog } from 'd3'\r\nimport {\r\n add,\r\n addBusinessDays,\r\n differenceInCalendarDays,\r\n eachDayOfInterval,\r\n endOfDay,\r\n intervalToDuration,\r\n isSameMonth,\r\n isSameWeek,\r\n isWeekend,\r\n isWithinInterval,\r\n startOfDay,\r\n startOfYear,\r\n sub,\r\n subMonths,\r\n subYears,\r\n} from 'date-fns'\r\nimport 'hammerjs'\r\n// eslint-disable-next-line react/no-typos\r\nimport 'react'\r\nimport 'react-dom'\r\nimport * as ReactRouterDOM from 'react-router-dom'\r\n\r\nimport { getFormattedDateString } from '../app/header/utils'\r\nimport { decodeQueryString, encodeQueryString } from '../app/queryString'\r\nimport logo from '../app/shared/assets/logo.png'\r\nimport logo_light from '../app/shared/assets/logo_light.png'\r\nimport { getHoverChartImg } from '../app/shared/hover-chart'\r\nimport { getSanitizedTicker } from '../app/shared/ticker-sanitizer'\r\nimport { formatDateToStringUS, getIsDrawingEnabledOnQuotePage } from '../app/shared/utils'\r\nimport './components/index'\r\nimport { useSyncLocalStorage } from './hooks/use-sync-local-storage'\r\nimport { useTrackPageView } from './hooks/use-track-pageview'\r\nimport * as localStorage from './services/local-storage'\r\n\r\ndeclare const FLibs: any\r\n\r\nFLibs.ReactRouterDOM = ReactRouterDOM\r\nFLibs.getHoverChartImg = getHoverChartImg\r\nFLibs.getSanitizedTicker = getSanitizedTicker\r\nFLibs.decodeQueryString = decodeQueryString\r\nFLibs.encodeQueryString = encodeQueryString\r\nFLibs.getFormattedDateString = getFormattedDateString\r\nFLibs.formatDateToStringUS = formatDateToStringUS\r\nFLibs.useSyncLocalStorage = useSyncLocalStorage\r\nFLibs.useTrackPageView = useTrackPageView\r\nFLibs.getIsDrawingEnabledOnQuotePage = getIsDrawingEnabledOnQuotePage\r\nFLibs.localStorage = localStorage\r\nFLibs.d3 = { max, nice, scaleLinear, scaleSymlog }\r\nFLibs.DateFns = {\r\n add,\r\n addBusinessDays,\r\n differenceInCalendarDays,\r\n eachDayOfInterval,\r\n endOfDay,\r\n intervalToDuration,\r\n isSameMonth,\r\n isSameWeek,\r\n isWeekend,\r\n isWithinInterval,\r\n startOfDay,\r\n startOfYear,\r\n sub,\r\n subMonths,\r\n subYears,\r\n}\r\nFLibs.assets = {\r\n logo,\r\n logo_light,\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipInput } from '../../../../components/tooltip-input'\r\nimport { getNumberValue } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst MAX_PRICE = 999999999\r\n\r\nexport function CostPerShareEditColumn<\r\n StateType extends {\r\n price?: number\r\n },\r\n ErrorsType extends {\r\n price?: boolean\r\n },\r\n>(props: EditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const [rawValue, setRawValue] = React.useState(props.entry.price ?? '')\r\n const handleBlur = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n setIsInteracting(false)\r\n const price = ev.currentTarget.valueAsNumber\r\n\r\n if (price > 0 && props.errors?.price) props.setErrors((errors) => ({ ...errors, price: false }))\r\n if (price > MAX_PRICE) return\r\n props.setState((entry) => ({ ...entry, price }))\r\n },\r\n [props, setIsInteracting]\r\n )\r\n\r\n const value = getNumberValue(props.entry.price)\r\n const isNaNValue = isNaN(value)\r\n\r\n let tooltipContent = undefined\r\n if (props.errors?.price && isActive) {\r\n if (isNaNValue) tooltipContent = 'Missing price'\r\n if (value <= 0 || typeof rawValue === 'string') tooltipContent = 'Invalid number, please enter a positive number'\r\n }\r\n\r\n const showError = props.errors?.price && (isNaN(Number(rawValue)) || Number(rawValue) <= 0 || rawValue === '')\r\n\r\n React.useEffect(() => {\r\n const priceValue = getNumberValue(props.entry.price)\r\n if (!isNaN(priceValue)) setRawValue(priceValue)\r\n }, [props.entry.price])\r\n\r\n return (\r\n {\r\n if (props.updateOnChange !== false) {\r\n const numberValue = ev.currentTarget.valueAsNumber\r\n props.setState((entry) => ({ ...entry, price: numberValue }))\r\n }\r\n setRawValue(ev.currentTarget.value)\r\n }}\r\n onBlur={handleBlur}\r\n size={props.size}\r\n tooltipColor=\"red\"\r\n tooltipSettings={{ unstable_offset: [10, 10] }}\r\n tooltipContent={showError ? tooltipContent : undefined}\r\n className={classNames(props.className, { 'is-error': props.errors?.price })}\r\n isInteractive={isActive}\r\n onFocus={() => setIsInteracting(true)}\r\n />\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { StatelessDatePicker } from '../../../../components/date-picker'\r\nimport { getExtendedDialogState } from '../../../../components/dialog'\r\nimport { Input, InputComponentProps } from '../../../../components/input'\r\nimport { usePopoverState } from '../../../../components/popover'\r\nimport { Tooltip, TooltipTrigger, useTooltipState } from '../../../../components/tooltip'\r\nimport { PORTFOLIO_DATE_FORMAT_DATA, PORTFOLIO_DATE_FORMAT_VIEW } from '../../constants/general'\r\nimport { parseInputAsDate } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst DATE_MAX_LENGTH = 10\r\n\r\ninterface StateType {\r\n date?: string\r\n}\r\ninterface ErrorsType {\r\n date?: boolean\r\n}\r\n\r\ninterface DateEditColumnWithPickerProps extends EditColumnProps {\r\n onIsInteractingChange: (isInteracting: boolean) => void\r\n inputElement: React.ReactElement\r\n value: { input: string | undefined; picker: Date }\r\n}\r\n\r\nexport function DateEditColumnWithPicker(\r\n props: DateEditColumnWithPickerProps\r\n) {\r\n const pickerState = usePopoverState()\r\n const pickerExtendedState = getExtendedDialogState(pickerState)\r\n const tooltipState = useTooltipState({ placement: 'top', unstable_offset: [-9, 10] })\r\n const tooltipExtendedState = getExtendedDialogState(tooltipState)\r\n const WrapperComponent = props.errors?.date ? TooltipTrigger : React.Fragment\r\n const wrapperProps = props.errors?.date\r\n ? {\r\n state: tooltipState,\r\n tabIndex: -1,\r\n isHideOnClickOutside: true,\r\n }\r\n : {}\r\n\r\n const isInteractingWithDateInput = !pickerExtendedState.isFullyClosed || !tooltipExtendedState.isFullyClosed\r\n React.useEffect(() => {\r\n props.onIsInteractingChange(isInteractingWithDateInput)\r\n // We don't need to pass entire props as we check only if onIsInteractingChange changed\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [props.onIsInteractingChange, isInteractingWithDateInput])\r\n\r\n /**\r\n * Handle date changes\r\n */\r\n const onDateChange = React.useRef((dateValue: Date | string) => {\r\n // Convert input to correct format if valid\r\n const parsedDate = parseInputAsDate({ input: dateValue })\r\n\r\n if (typeof dateValue === 'string' && !dateFns.isValid(parsedDate)) {\r\n props.setState((entry) => ({ ...entry, date: dateValue }))\r\n return\r\n }\r\n\r\n const date = dateFns.format(parsedDate, PORTFOLIO_DATE_FORMAT_DATA)\r\n props.setErrors((errors) => (errors.date ? { ...errors, date: false } : errors))\r\n props.setState((entry) => ({ ...entry, date }))\r\n tooltipState.hide()\r\n })\r\n\r\n /**\r\n * Reset error state on blur when editing manually\r\n */\r\n const handleBlur = React.useRef(() => {\r\n const date = parseInputAsDate({ input: props.entry.date ?? '' })\r\n if (dateFns.isValid(date)) {\r\n props.setErrors((errors) => (errors.date ? { ...errors, date: false } : errors))\r\n }\r\n })\r\n\r\n return (\r\n \r\n \r\n {React.cloneElement(props.inputElement, {\r\n onChange: (ev) => onDateChange.current(ev.currentTarget.value),\r\n onKeyDown: () => pickerState.hide(),\r\n onBlur: handleBlur.current,\r\n })}\r\n \r\n {!tooltipExtendedState.isFullyClosed && (\r\n \r\n Invalid date, please enter date in MM-DD-YYYY format.\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport function DateEditColumn(\r\n props: EditColumnProps\r\n) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n\r\n /**\r\n * Get formatted value for picker and input\r\n */\r\n const value = React.useMemo(() => {\r\n try {\r\n const parsedDate = parseInputAsDate({\r\n input: props.entry.date ?? '',\r\n format: PORTFOLIO_DATE_FORMAT_DATA,\r\n checkFormat: false,\r\n })\r\n\r\n return {\r\n input: dateFns.format(parsedDate, PORTFOLIO_DATE_FORMAT_VIEW),\r\n picker: parsedDate,\r\n }\r\n } catch {\r\n return {\r\n input: props.entry.date,\r\n picker: new Date(),\r\n }\r\n }\r\n }, [props.entry.date])\r\n\r\n const inputElement = (\r\n {}}\r\n error={props.errors?.date}\r\n size={props.size}\r\n maxLength={DATE_MAX_LENGTH}\r\n data-testid=\"input-date\"\r\n />\r\n )\r\n\r\n if (isActive) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return inputElement\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipInput } from '../../../../components/tooltip-input'\r\nimport { getNumberValue } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst MAX_SHARES = 999999999\r\n\r\nexport function SharesEditColumn<\r\n StateType extends {\r\n shares?: number\r\n },\r\n ErrorsType extends {\r\n shares?: boolean\r\n },\r\n>(props: EditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const [rawValue, setRawValue] = React.useState(props.entry.shares ?? '')\r\n const handleBlur = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n setIsInteracting(false)\r\n const shares = ev.currentTarget.valueAsNumber\r\n\r\n if (shares >= 0 && props.errors?.shares) props.setErrors((errors) => ({ ...errors, shares: false }))\r\n if (shares > MAX_SHARES) return\r\n props.setState((entry) => ({ ...entry, shares }))\r\n },\r\n [props, setIsInteracting]\r\n )\r\n\r\n const value = getNumberValue(props.entry.shares)\r\n const isNaNValue = isNaN(value)\r\n\r\n let tooltipContent = undefined\r\n if (props.errors?.shares && isActive) {\r\n if (isNaNValue) tooltipContent = 'Missing number of shares'\r\n if (value < 0 || typeof rawValue === 'string') tooltipContent = 'Invalid number, please enter a positive number'\r\n }\r\n\r\n const showError = props.errors?.shares && (isNaN(Number(rawValue)) || Number(rawValue) <= 0 || rawValue === '')\r\n\r\n React.useEffect(() => {\r\n const sharesValue = getNumberValue(props.entry.shares)\r\n if (!isNaN(sharesValue)) setRawValue(sharesValue)\r\n }, [props.entry.shares])\r\n\r\n return (\r\n {\r\n if (props.updateOnChange !== false) {\r\n const numberValue = ev.currentTarget.valueAsNumber\r\n props.setState((entry) => ({ ...entry, shares: numberValue }))\r\n }\r\n setRawValue(ev.currentTarget.value)\r\n }}\r\n onBlur={handleBlur}\r\n size={props.size}\r\n tooltipColor=\"red\"\r\n tooltipSettings={{ unstable_offset: [10, 10] }}\r\n tooltipContent={showError ? tooltipContent : undefined}\r\n isInteractive={isActive}\r\n onFocus={() => setIsInteracting(true)}\r\n />\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TooltipInput } from '../../../../components/tooltip-input'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\nconst TICKER_MAX_LENGTH = 10\r\n\r\nexport function TickerEditColumn<\r\n StateType extends {\r\n ticker: string\r\n },\r\n ErrorsType extends {\r\n ticker?: boolean\r\n },\r\n>(props: EditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const handleChange = React.useCallback(\r\n (ev: React.ChangeEvent) => {\r\n const ticker = ev.currentTarget.value\r\n if (ticker.trim().length >= 0 && props.errors?.ticker) props.setErrors((errors) => ({ ...errors, ticker: false }))\r\n props.setState((entry) => ({ ...entry, ticker }))\r\n },\r\n [props]\r\n )\r\n\r\n let tooltipContent = undefined\r\n if (props.errors?.ticker && isActive) {\r\n tooltipContent = props.entry.ticker.length === 0 ? 'Missing ticker' : 'Invalid ticker'\r\n }\r\n\r\n return (\r\n setIsInteracting(true)}\r\n onBlur={() => setIsInteracting(false)}\r\n />\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Select, SelectItem, SelectOption, SelectPlaceholder } from '../../../../components/select'\r\nimport { SelectListProps } from '../../../../components/select/select-list'\r\nimport { TRANSACTION_LABEL } from '../../constants/general'\r\nimport { getSymbolType, getTransactionsForSymbolType } from '../../utils'\r\nimport { usePortfolioBulkEditRowContext } from '../PortfolioBulkEditRowContext'\r\nimport { EditColumnProps } from './types'\r\n\r\ninterface TransactionEditColumnProps extends EditColumnProps {\r\n transactions?: Array>\r\n optionListProps?: Omit\r\n}\r\n\r\nexport function TransactionEditColumn<\r\n StateType extends {\r\n ticker: string\r\n transaction?: number\r\n },\r\n ErrorsType extends {\r\n transaction?: boolean\r\n },\r\n>({\r\n transactions,\r\n optionListProps = { className: 'min-w-28' },\r\n ...props\r\n}: TransactionEditColumnProps) {\r\n const { isActive, setIsInteracting } = usePortfolioBulkEditRowContext()\r\n const transactionOptions = React.useMemo[]>(() => {\r\n if (transactions?.length) return transactions\r\n const symbolType = getSymbolType(props.entry.ticker)\r\n const options = getTransactionsForSymbolType(symbolType)\r\n\r\n return options.map((value) => ({ label: TRANSACTION_LABEL[value], value }))\r\n }, [props.entry.ticker, transactions])\r\n\r\n return (\r\n <>\r\n \r\n {isActive ? (\r\n props.setState((entry) => ({ ...entry, transaction: item.value }))}\r\n listProps={optionListProps}\r\n size={props.size}\r\n data-testid=\"transaction-select\"\r\n onIsInteractingChange={setIsInteracting}\r\n >\r\n {transactionOptions.map((item) => (\r\n \r\n {item.label}\r\n \r\n ))}\r\n \r\n ) : (\r\n value === props.entry.transaction)?.label ??\r\n transactionOptions[0].label\r\n }\r\n />\r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\n/*\r\n * Context.\r\n */\r\n\r\nexport interface PortfolioBulkEditRowContextProps {\r\n isActive: boolean\r\n setIsInteracting: React.Dispatch>\r\n setIsInView: React.Dispatch>\r\n}\r\n\r\nexport const PortfolioBulkEditRowContext = React.createContext({\r\n isActive: false,\r\n setIsInteracting: () => {},\r\n setIsInView: () => {},\r\n})\r\n\r\n/*\r\n * Hook.\r\n */\r\n\r\nexport function usePortfolioBulkEditRowContext(): PortfolioBulkEditRowContextProps {\r\n return React.useContext(PortfolioBulkEditRowContext)\r\n}\r\n\r\n/*\r\n * Component.\r\n */\r\n\r\ninterface PortfolioBulkEditRowContextProviderProps {\r\n children: React.ReactNode\r\n hasAlwaysActiveOverride?: boolean\r\n}\r\nexport const PortfolioBulkEditRowContextProvider = ({\r\n children,\r\n hasAlwaysActiveOverride = false,\r\n}: PortfolioBulkEditRowContextProviderProps) => {\r\n const [isInteracting, setIsInteracting] = React.useState(false)\r\n const [isInView, setIsInView] = React.useState(false)\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, PortfolioSymbolType, PortfolioTransaction, RowKind, TableColumnDefinition } from '../types'\r\nimport { PORTFOLIO_DATE_FORMAT_VIEW, TRANSACTION_LABEL } from './general'\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.Spacer]: {\r\n id: ColumnId.Spacer,\r\n urlSort: '',\r\n name: '',\r\n renderColumn: () => null,\r\n },\r\n [ColumnId.Ticker]: {\r\n id: ColumnId.Ticker,\r\n urlSort: 'ticker',\r\n name: 'Ticker',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n if (args.row.type === PortfolioSymbolType.Stock && !args.row.isDelisted) {\r\n return (\r\n ev.stopPropagation()}\r\n >\r\n {args.row.ticker}\r\n \r\n )\r\n }\r\n\r\n return {args.row.ticker}\r\n default:\r\n return {args.row.ticker}\r\n }\r\n },\r\n },\r\n [ColumnId.Company]: {\r\n id: ColumnId.Company,\r\n urlSort: 'company',\r\n name: 'Company',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n case RowKind.Summary:\r\n return (\r\n \r\n Summary:{' '}\r\n \r\n {args.row.tickers} Ticker{args.row.tickers === 1 ? '' : 's'}\r\n \r\n / \r\n \r\n {args.row.transactions} Transaction{args.row.transactions === 1 ? '' : 's'}\r\n \r\n \r\n )\r\n default:\r\n return
{args.row.company}
\r\n }\r\n },\r\n },\r\n [ColumnId.CostAvg]: {\r\n id: ColumnId.CostAvg,\r\n urlSort: 'costavg',\r\n name: 'Avg. Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.costAvg)\r\n }\r\n default:\r\n return formatNumber(args.row.costAvg)\r\n }\r\n },\r\n },\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n urlSort: 'price',\r\n name: 'Price',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n return formatNumber(args.row.lastClose)\r\n }\r\n },\r\n },\r\n [ColumnId.LastChange]: {\r\n id: ColumnId.LastChange,\r\n urlSort: 'lastchange',\r\n name: 'Change $',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => (args.kind === RowKind.Group ? args.row.lastClose - args.row.prevClose : null),\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n if (args.row.isDelisted) return '-'\r\n\r\n const lastChange = args.row.lastClose - args.row.prevClose\r\n return (\r\n \r\n {formatNumber(lastChange, {\r\n showPlusSign: true,\r\n fractions: args.row.lastClose < 1 ? 4 : 2,\r\n })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastChangePct]: {\r\n id: ColumnId.LastChangePct,\r\n urlSort: 'changepct',\r\n name: 'Change %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n default:\r\n return (\r\n \r\n {formatNumber(args.row.lastChangePct, { showPlusSign: true })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastVolume]: {\r\n id: ColumnId.LastVolume,\r\n urlSort: 'volume',\r\n name: 'Volume',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n return formatNumber(args.row.lastVolume, { fractions: 0 })\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Transaction]: {\r\n id: ColumnId.Transaction,\r\n urlSort: 'transaction',\r\n name: 'Transaction',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return TRANSACTION_LABEL[args.row.transaction]\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Date]: {\r\n id: ColumnId.Date,\r\n urlSort: 'date',\r\n name: 'Date',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return (\r\n \r\n {dateFns.format(new Date(args.row.date), PORTFOLIO_DATE_FORMAT_VIEW)}\r\n \r\n )\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Shares]: {\r\n id: ColumnId.Shares,\r\n urlSort: 'shares',\r\n name: 'Shares',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n default:\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n },\r\n },\r\n [ColumnId.Price]: {\r\n id: ColumnId.Price,\r\n urlSort: 'cost',\r\n name: 'Cost / Share',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return formatNumber(args.row.price)\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.ValuePaid]: {\r\n id: ColumnId.ValuePaid,\r\n urlSort: 'totalcost',\r\n name: 'Total Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valuePaid)\r\n },\r\n },\r\n [ColumnId.Amount]: {\r\n id: ColumnId.Amount,\r\n urlSort: 'amount',\r\n name: 'Amount',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.valuePaid,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Trade && args.kind !== RowKind.Transaction) return null\r\n return formatNumber(args.row.price)\r\n },\r\n },\r\n [ColumnId.ValueMarket]: {\r\n id: ColumnId.ValueMarket,\r\n urlSort: 'marketvalue',\r\n name: 'Market Value',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valueMarket)\r\n },\r\n },\r\n [ColumnId.GainMarketUsd]: {\r\n id: ColumnId.GainMarketUsd,\r\n urlSort: 'gainusd',\r\n name: 'Total Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketPct]: {\r\n id: ColumnId.GainMarketPct,\r\n urlSort: 'gainpct',\r\n name: 'Total Gain %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketCombined]: {\r\n id: ColumnId.GainMarketCombined,\r\n urlSort: 'gainmarket',\r\n name: 'Total Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.gainMarketPct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.GainTodayUsd]: {\r\n id: ColumnId.GainTodayUsd,\r\n urlSort: 'changeusd',\r\n name: 'Today’s Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainTodayCombined]: {\r\n id: ColumnId.GainTodayCombined,\r\n urlSort: 'gaintoday',\r\n name: 'Today’s Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.lastChangePct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n {formatNumber(args.row.lastChangePct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.Order]: {\r\n id: ColumnId.Order,\r\n urlSort: 'order',\r\n name: 'Order',\r\n align: TableAlign.Right,\r\n renderColumn: () => null,\r\n },\r\n})\r\n\r\nexport const columns = Object.values(columnMap)\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { PortfolioEntryTransaction, PortfolioSymbolType, PortfolioTransaction } from '../types'\r\n\r\nexport const PORTFOLIO_CASH_SYMBOL = '$CASH'\r\n\r\nexport const PORTFOLIO_DATE_FORMAT_VIEW = 'MM-dd-yyyy'\r\nexport const PORTFOLIO_DATE_FORMAT_DATA = \"yyyy-MM-dd'T00:00:00'\"\r\n\r\nexport const PORTFOLIO_REFRESH_INTERVAL_ELITE = 20 * 1000\r\nexport const PORTFOLIO_REFRESH_INTERVAL_FREE = 60 * 1000\r\n\r\nexport const TRANSACTION_LABEL: Record = {\r\n [PortfolioTransaction.Watch]: 'Watch',\r\n\r\n // Stock transactions\r\n [PortfolioTransaction.Buy]: 'Buy',\r\n [PortfolioTransaction.Short]: 'Short Sell',\r\n\r\n // Cash transactions\r\n [PortfolioTransaction.CashDeposit]: 'Cash Deposit',\r\n [PortfolioTransaction.CashWithdraw]: 'Cash Withdraw',\r\n [PortfolioTransaction.CashIncome]: 'Income',\r\n [PortfolioTransaction.CashFee]: 'Fee',\r\n}\r\n\r\nexport const STOCK_TRANSACTIONS = [PortfolioTransaction.Buy, PortfolioTransaction.Short]\r\n\r\nexport const CASH_TRANSACTIONS = [\r\n PortfolioTransaction.CashDeposit,\r\n PortfolioTransaction.CashWithdraw,\r\n PortfolioTransaction.CashIncome,\r\n PortfolioTransaction.CashFee,\r\n]\r\n\r\nexport const EMPTY_FORM_ENTRY = {\r\n ticker: '',\r\n date: `${dateFns.format(new Date(), PORTFOLIO_DATE_FORMAT_DATA)}`,\r\n shares: undefined,\r\n price: undefined,\r\n transaction: PortfolioTransaction.Buy,\r\n}\r\n\r\nexport const EMPTY_TRANSACTION: Omit = {\r\n ...EMPTY_FORM_ENTRY,\r\n shares: 0,\r\n price: 0,\r\n type: PortfolioSymbolType.Stock,\r\n valuePaid: null,\r\n valueMarket: null,\r\n valueMarketPrev: null,\r\n gainMarket: null,\r\n gainMarketPct: null,\r\n gainMarketUsd: null,\r\n gainTodayUsd: null,\r\n lastChangePct: null,\r\n}\r\n\r\nexport const PORTFOLIO_INPUT_NAME = 'portfolio_name'\r\nexport const PORTFOLIO_INPUT_EMPTY_ERROR = 'Please enter portfolio name.'\r\nexport const PORTFOLIO_INPUT_EXISTS_ERROR = 'Portfolio with that name already exists.'\r\nexport const TICKERS_INPUT_NAME = 'tickers'\r\nexport const TICKERS_INPUT_FORMAT_TIP = 'Separate multiple tickers by a comma, e.g.: AAPL, MSFT, GOOG.'\r\n","import { getSanitizedTicker } from '../../../../app/shared/ticker-sanitizer'\r\nimport { ContentType, apiRequest } from '../../../services/api'\r\nimport { PORTFOLIO_CASH_SYMBOL } from '../constants/general'\r\nimport {\r\n PortfolioDefinition,\r\n PortfolioEntryBase,\r\n PortfolioFormGroup,\r\n PortfolioInitData,\r\n PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionWatch,\r\n} from '../types'\r\n\r\nexport const EMPTY_RESPONSE: PortfolioInitData = {\r\n limit: 0,\r\n selectedPortfolio: 0,\r\n limitTransactions: 0,\r\n portfolio: [],\r\n news: [],\r\n portfolios: [],\r\n}\r\n\r\nexport function portfolioData(portfolioId?: string | number | null) {\r\n return apiRequest('/api/portfolio_data.ashx', { query: { pid: portfolioId ?? '' } })\r\n}\r\n\r\nexport function deletePortfolio(portfolioId?: string | number) {\r\n return apiRequest('/request_portfolio_delete.ashx', { query: { pid: portfolioId } })\r\n}\r\n\r\nexport function portfolioEntry(\r\n query?: Record,\r\n method?: string,\r\n body?: Omit, 'type'>\r\n) {\r\n return apiRequest(\r\n '/api/portfolio_entry.ashx',\r\n {\r\n query,\r\n method,\r\n body: JSON.stringify(body),\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport const QUOTE_INVALID_TICKER_REQUEST = '_UNKNOWN'\r\nexport const QUOTE_INVALID_TICKER_RESPONSE = 'NA'\r\nexport const QUOTE_TICKER_DELIMITER = ','\r\n\r\nexport function quoteData(tickers: string[]) {\r\n return apiRequest('request_quote.ashx', {\r\n query: { t: tickers.filter((ticker) => ticker.length).join(',') },\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n}\r\n\r\nexport async function validateTickers(tickers: string[]) {\r\n const response = await apiRequest<{ tickers: string; specialSymbols: Record }>(\r\n '/portfolio_tickers.ashx',\r\n {\r\n query: { json: true },\r\n },\r\n true\r\n )\r\n\r\n const parsedTickers = response?.tickers.split('|') ?? []\r\n const specialTickers = Object.keys(response?.specialSymbols ?? [])\r\n\r\n return tickers.map((ticker) => [...specialTickers, ...parsedTickers].includes(ticker))\r\n}\r\n\r\nexport async function recalculatePortfolio(\r\n rows: PortfolioFormGroup[],\r\n numberOfTransactions: number,\r\n totalValue = 100000.0\r\n): Promise {\r\n const tickers = Object.values(rows).map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n return ticker.length ? ticker : QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const pricePerColumn = totalValue / numberOfTransactions\r\n\r\n const response = await quoteData(tickers)\r\n const prices = response?.split(QUOTE_TICKER_DELIMITER)\r\n\r\n if (prices?.length !== tickers.length) {\r\n window.Sentry?.captureMessage('Invalid recalculated data', {\r\n extra: {\r\n requestTickers: tickers,\r\n requestTickersLength: tickers.length,\r\n responseLength: prices?.length,\r\n },\r\n })\r\n\r\n return []\r\n }\r\n\r\n const tickerPrices = Object.fromEntries(\r\n prices.map((price, index) => {\r\n const tickerPrice = price === QUOTE_INVALID_TICKER_RESPONSE ? NaN : parseFloat(price)\r\n\r\n return [tickers[index], isNaN(tickerPrice) ? NaN : tickerPrice]\r\n })\r\n )\r\n\r\n return rows.map((row) => ({\r\n id: row.id,\r\n ticker: row.ticker,\r\n transactions: row.transactions.map((transaction) => {\r\n const price = tickerPrices[row.ticker]\r\n const shares = Math.round((pricePerColumn / price) * 10000) / 10000\r\n\r\n const calculatedPrice = isNaN(price) ? transaction.price : price\r\n const calculatedShares = isNaN(shares) ? transaction.shares : shares\r\n\r\n return {\r\n ...transaction,\r\n transaction:\r\n transaction.transaction === PortfolioTransaction.Watch ? PortfolioTransaction.Buy : transaction.transaction,\r\n price: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedPrice,\r\n shares: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedShares,\r\n }\r\n }),\r\n }))\r\n}\r\n\r\nexport function submitForm(data: URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport type TickersApiResponse = {\r\n portfolioId: number\r\n message?: string\r\n portfolioEntries: Record>\r\n}\r\n\r\nexport enum ErrorSource {\r\n Portfolio,\r\n Tickers,\r\n}\r\n\r\nexport type TickersApiErrorResponse = {\r\n source: ErrorSource\r\n message: string\r\n isNotification?: boolean\r\n}\r\n\r\nexport function portfolioTickers({\r\n tickers,\r\n portfolioName,\r\n portfolioId,\r\n}: {\r\n tickers: string\r\n portfolioName?: string\r\n portfolioId?: number\r\n}) {\r\n const query = Object.assign(\r\n { tickers },\r\n typeof portfolioName !== 'undefined' && { portfolio_name: portfolioName },\r\n typeof portfolioId !== 'undefined' && { pid: portfolioId }\r\n )\r\n\r\n return apiRequest(\r\n '/api/portfolio_tickers.ashx',\r\n {\r\n method: 'POST',\r\n query,\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport function submitEditForm(data: string | URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport function reorderPortfolios(body: PortfolioDefinition[]) {\r\n return apiRequest('/api/portfolio_reorder.ashx', {\r\n method: 'PUT',\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { NullableNumbers } from '../../types'\r\n\r\nexport enum PortfolioQuery {\r\n View = 'v',\r\n TableView = 'tv',\r\n PortfolioId = 'pid',\r\n Order = 'o',\r\n Tickers = 't',\r\n Map = 'map',\r\n Size = 'mapSize',\r\n Subtype = 'subtype',\r\n Group = 'group',\r\n}\r\n\r\nexport enum PortfolioMapSizeKey {\r\n MarketValue = 'market',\r\n Gain = 'gain',\r\n}\r\n\r\nexport enum PortfolioView {\r\n View = '1',\r\n Edit = '2',\r\n}\r\n\r\nexport enum PortfolioTableView {\r\n Ticker = '1',\r\n Trade = '2',\r\n}\r\n\r\nexport const PortfolioTableViewLabels = {\r\n [PortfolioTableView.Ticker]: 'Tickers',\r\n [PortfolioTableView.Trade]: 'Trades',\r\n}\r\n\r\nexport enum PortfolioSymbolType {\r\n Stock = 'stock',\r\n Cash = 'cash',\r\n}\r\n\r\nexport enum PortfolioTransaction {\r\n Watch = 0,\r\n\r\n // Stock transactions\r\n Buy = 1,\r\n Short = 2,\r\n\r\n // Cash transactions\r\n CashDeposit = 200,\r\n CashWithdraw = 201,\r\n CashIncome = 202,\r\n CashFee = 203,\r\n}\r\n\r\nexport enum NumberOfShares {\r\n None = 0,\r\n /**\r\n * The usage of this is technically incorrect. The value for `PositiveNumber` is 1.\r\n * But we don’t care in this context, because we only want to differentiate betwen zero/non-zero values,\r\n * which helps us get correct types.\r\n *\r\n * # Don’t compare `entry.shares === NumberOfShares.PositiveNumber`\r\n */\r\n PositiveNumber = 1,\r\n}\r\n\r\nexport interface PortfolioEntryBase {\r\n id: number\r\n ticker: string\r\n date: string\r\n transaction: PortfolioTransaction\r\n shares: number\r\n price: number\r\n type: PortfolioSymbolType\r\n}\r\n\r\n/**\r\n * Base type which lists all common properties\r\n */\r\nexport interface PortfolioEntryComputed {\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketPrev: number\r\n gainMarket: number\r\n gainMarketPct: number\r\n gainMarketUsd: number\r\n gainTodayUsd: number\r\n lastChangePct: number\r\n}\r\n\r\n/**\r\n * Transaction with > 0 shares\r\n */\r\nexport interface PortfolioTransactionStake extends PortfolioEntryBase, PortfolioEntryComputed {\r\n shares: NumberOfShares.PositiveNumber\r\n}\r\n\r\n/**\r\n * Transaction with 0 shares\r\n */\r\nexport interface PortfolioTransactionWatch\r\n extends Omit,\r\n NullableNumbers {\r\n shares: NumberOfShares.None\r\n transaction: PortfolioTransaction\r\n}\r\n\r\nexport type PortfolioEntryTransaction = PortfolioTransactionStake | PortfolioTransactionWatch\r\n\r\nexport type PortfolioActionType = PortfolioEntryTransaction & { isNotification?: boolean; message?: string }\r\n\r\n/**\r\n * Top level portfolio entry\r\n */\r\nexport interface PortfolioGroup extends PortfolioEntryComputed {\r\n ticker: string\r\n shares: number\r\n industry: string\r\n country: string\r\n company: string\r\n marketCap: number\r\n prevClose: number\r\n lastClose: number\r\n lastVolume: number\r\n perfWeek: number\r\n costAvg: number\r\n transactions: PortfolioEntryTransaction[]\r\n order: number\r\n id: number\r\n date: string\r\n type: PortfolioSymbolType\r\n isDelisted?: true\r\n}\r\n\r\nexport type PortfolioTrade = Omit & PortfolioEntryTransaction\r\n\r\nexport type PortfolioMapEntry = Omit & PortfolioTransactionStake\r\n\r\n/**\r\n * Summary row for the whole portfolio\r\n */\r\nexport interface PortfolioSummary {\r\n tickers: number\r\n transactions: number\r\n shares: number\r\n lastChangePct: number\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketStocks: number\r\n valueMarketStocksPrev: number\r\n gainMarketUsd: number\r\n gainMarketPct: number\r\n gainTodayUsd: number\r\n}\r\n\r\nexport interface PortfolioDefinition {\r\n id: number\r\n name: string\r\n order: number\r\n}\r\n\r\nexport interface PortfolioInitData {\r\n limit: number\r\n limitTransactions: number\r\n selectedPortfolio: number\r\n portfolios: PortfolioDefinition[]\r\n portfolio: PortfolioGroup[]\r\n news: string[]\r\n version?: number\r\n}\r\n\r\nexport interface PortfolioFormEntry\r\n extends Pick,\r\n Partial> {\r\n uuid: string\r\n}\r\n\r\nexport interface PortfolioFormGroup extends Pick {\r\n id: string\r\n transactions: PortfolioFormEntry[]\r\n}\r\n\r\nexport enum ColumnId {\r\n Spacer = 'spacer',\r\n Ticker = 'ticker',\r\n Company = 'company',\r\n LastClose = 'lastClose',\r\n CostAvg = 'costAvg',\r\n LastChange = 'lastChange',\r\n LastChangePct = 'lastChangePct',\r\n LastVolume = 'lastVolume',\r\n Transaction = 'transaction',\r\n Date = 'date',\r\n Shares = 'shares',\r\n Price = 'price',\r\n ValuePaid = 'valuePaid',\r\n Amount = 'amount',\r\n ValueMarket = 'valueMarket',\r\n GainMarketUsd = 'gainMarketUsd',\r\n GainMarketPct = 'gainMarketPct',\r\n GainMarketCombined = 'gainMarketCombined',\r\n GainTodayUsd = 'gainTodayUsd',\r\n GainTodayCombined = 'gainTodayCombined',\r\n Order = 'order',\r\n}\r\n\r\nexport enum RowKind {\r\n Group, // A group of transactions\r\n Transaction, // A transaction made inside ticker\r\n Summary, // Portfolio summary\r\n Watchlist, // Charts portfolio watchlist table\r\n Trade,\r\n}\r\n\r\ninterface GroupProps {\r\n kind: RowKind.Group\r\n row: PortfolioGroup\r\n}\r\ninterface TradeProps {\r\n kind: RowKind.Trade\r\n row: PortfolioTrade\r\n}\r\n\r\ninterface TransactionProps {\r\n kind: RowKind.Transaction\r\n row: PortfolioEntryTransaction\r\n}\r\n\r\ninterface SummaryProps {\r\n kind: RowKind.Summary\r\n row: PortfolioSummary\r\n}\r\n\r\ninterface WatchlistProps {\r\n index: number\r\n kind: RowKind.Watchlist\r\n row: PortfolioGroup\r\n}\r\n\r\nexport interface TableColumnDefinition<\r\n PropsType = GroupProps | TradeProps | TransactionProps | SummaryProps | WatchlistProps,\r\n> extends SortByShape {\r\n urlSort: string\r\n name: string\r\n align?: TableAlign\r\n\r\n /**\r\n * Get the value of the column and render it\r\n */\r\n renderColumn: (props: PropsType) => React.ReactNode\r\n}\r\n\r\nexport enum ActionKind {\r\n AddTickers,\r\n RemoveTicker,\r\n AddTransaction,\r\n EditTransaction,\r\n RemoveTransaction,\r\n ReorderTickers,\r\n PortfoliosReorder,\r\n}\r\n\r\nexport interface Action {\r\n kind: ActionKind\r\n payload: PayloadType\r\n}\r\n\r\nexport type AddTickersError = {\r\n tickers?: string\r\n}\r\n\r\nexport interface CreatePortfolioErrors extends AddTickersError {\r\n portfolioName?: string\r\n}\r\n\r\nexport interface CreatePortfolioData {\r\n tickers: string\r\n portfolioName: string\r\n}\r\n\r\nexport type FormErrors = Partial>\r\n\r\nexport interface PortfolioBulkEditErrors {\r\n portfolioName: boolean\r\n rows: Record\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { MapDataNode, MapDataRoot, MapSubtypeId, PerfData } from '../../../app/maps/types'\r\nimport { getMapsRefreshInterval } from '../../../app/maps/utils'\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { parseInitData } from '../../../app/shared/utils'\r\nimport * as storage from '../../services/local-storage'\r\nimport { formatNumber, getUuid } from '../../util'\r\nimport { columnMap } from './constants/columns'\r\nimport {\r\n CASH_TRANSACTIONS,\r\n EMPTY_FORM_ENTRY,\r\n PORTFOLIO_CASH_SYMBOL,\r\n PORTFOLIO_DATE_FORMAT_DATA,\r\n PORTFOLIO_DATE_FORMAT_VIEW,\r\n PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n STOCK_TRANSACTIONS,\r\n} from './constants/general'\r\nimport * as api from './services/api'\r\nimport {\r\n ColumnId,\r\n FormErrors,\r\n PortfolioEntryBase,\r\n PortfolioEntryTransaction,\r\n PortfolioFormEntry,\r\n PortfolioFormGroup,\r\n PortfolioGroup,\r\n PortfolioInitData,\r\n PortfolioMapEntry,\r\n PortfolioMapSizeKey,\r\n PortfolioQuery,\r\n PortfolioSummary,\r\n PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionStake,\r\n PortfolioView,\r\n} from './types'\r\n\r\nexport enum PortfolioDataKey {\r\n Cash = 'cash',\r\n LongGainers = 'longGainers',\r\n LongLosers = 'longLosers',\r\n ShortGainers = 'shortGainers',\r\n ShortLosers = 'shortLosers',\r\n}\r\n\r\nconst industryLabelKey = 'description'\r\n\r\nconst groupPrefix = {\r\n long: 'Long',\r\n short: 'Short',\r\n}\r\n\r\nconst groupLabel = {\r\n gainers: 'Gainers',\r\n losers: 'Losers',\r\n}\r\n\r\nexport const LOCAL_STORAGE_KEY = 'portfolio-map'\r\n\r\ntype PortfolioMapData = { [key in PortfolioDataKey]: MapDataNode[] }\r\n\r\nexport interface PortfolioSavedSettings {\r\n tableView: '1' | '2'\r\n showMap: boolean\r\n showIndustries: boolean\r\n subtype: MapSubtypeId\r\n tableOrder: string\r\n}\r\n\r\nexport const DEFAULT_SETTINGS: PortfolioSavedSettings = {\r\n tableView: '1',\r\n showMap: true,\r\n showIndustries: true,\r\n subtype: MapSubtypeId.PortfolioGainPct,\r\n tableOrder: columnMap[ColumnId.Order].urlSort,\r\n}\r\n\r\n/**\r\n * Map param in query/local storage is string but we need a boolean\r\n */\r\nexport function parseBoolFromValue(value?: string | null) {\r\n try {\r\n if (value) {\r\n return Boolean(JSON.parse(value))\r\n }\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function getMapSettingFromLocalStorage() {\r\n const savedSettings = storage.getValue(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS)\r\n\r\n return { ...DEFAULT_SETTINGS, ...savedSettings }\r\n}\r\n\r\nexport function saveMapSettingToLocalStorage(\r\n key: keyof PortfolioSavedSettings,\r\n value: PortfolioSavedSettings[typeof key]\r\n) {\r\n storage.setValue(\r\n LOCAL_STORAGE_KEY,\r\n (prevState) => {\r\n const itemToStore = { ...prevState, [key]: value }\r\n // TODO: remove - temporary code to remove removed property from settings\r\n if ('customTickersOrder' in itemToStore) delete itemToStore.customTickersOrder\r\n return itemToStore\r\n },\r\n DEFAULT_SETTINGS\r\n )\r\n}\r\n\r\nconst SUMMARY_DEFAULT: PortfolioSummary = {\r\n tickers: 0,\r\n transactions: 0,\r\n shares: 0,\r\n lastChangePct: 0,\r\n valuePaid: 0,\r\n valueMarket: 0,\r\n valueMarketStocks: 0,\r\n valueMarketStocksPrev: 0,\r\n gainMarketUsd: 0,\r\n gainMarketPct: 0,\r\n gainTodayUsd: 0,\r\n}\r\n\r\nexport function getSummary(data: PortfolioGroup[]) {\r\n let transactions = 0\r\n\r\n const computed = data.reduce((prev, current) => {\r\n transactions += current.transactions.length || 1\r\n\r\n if (current.isDelisted) return prev\r\n\r\n const valueMarket = prev.valueMarket + current.valueMarket\r\n const valueMarketStocks =\r\n prev.valueMarketStocks + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarket)\r\n const valueMarketStocksPrev =\r\n prev.valueMarketStocksPrev + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarketPrev)\r\n const valuePaid = prev.valuePaid + current.valuePaid\r\n const lastChangePct = valueMarketStocksPrev <= 0 ? 0 : (valueMarketStocks / valueMarketStocksPrev - 1) * 100\r\n const gainMarketPct = valuePaid <= 0 ? 0 : (valueMarketStocks / valuePaid - 1) * 100\r\n\r\n return {\r\n ...prev,\r\n valueMarket: valueMarket,\r\n valueMarketStocks,\r\n valueMarketStocksPrev,\r\n lastChangePct,\r\n gainMarketPct,\r\n shares: prev.shares + current.shares,\r\n valuePaid: prev.valuePaid + current.valuePaid,\r\n gainMarketUsd: prev.gainMarketUsd + current.gainMarketUsd,\r\n gainTodayUsd: prev.gainTodayUsd + current.gainTodayUsd,\r\n }\r\n }, SUMMARY_DEFAULT)\r\n\r\n return {\r\n ...computed,\r\n transactions,\r\n tickers: data.length,\r\n }\r\n}\r\n\r\nfunction isMapTransaction(entry: PortfolioEntryTransaction): entry is PortfolioTransactionStake {\r\n return entry.shares > 0 || entry.type === PortfolioSymbolType.Cash\r\n}\r\n\r\n/**\r\n * Goes through all the items and merges them together so that we don’t end up\r\n * with multiple map tiles with same ticker & transaction\r\n */\r\nexport function flattenAndDedupe(data: PortfolioGroup[]) {\r\n const result: PortfolioMapEntry[] = []\r\n\r\n data.forEach((group) => {\r\n group.transactions.forEach((entry) => {\r\n if (!isMapTransaction(entry)) return\r\n\r\n const previouslyAdded = result.findIndex(\r\n (prev) =>\r\n prev.ticker === entry.ticker &&\r\n (entry.type === PortfolioSymbolType.Cash ? true : prev.transaction === entry.transaction)\r\n )\r\n\r\n if (previouslyAdded < 0) {\r\n const newEntry = { ...group, ...entry, transactions: undefined }\r\n delete newEntry.transactions\r\n result.push(newEntry)\r\n } else {\r\n const prevEntry = result[previouslyAdded]\r\n const valueMarket = prevEntry.valueMarket + entry.valueMarket\r\n const valuePaid = prevEntry.valuePaid + entry.valuePaid\r\n\r\n result[previouslyAdded] = {\r\n ...prevEntry,\r\n valuePaid,\r\n valueMarket,\r\n shares: prevEntry.shares + entry.shares,\r\n valueMarketPrev: prevEntry.valueMarketPrev + entry.valueMarketPrev,\r\n gainMarketUsd: prevEntry.gainMarketUsd + entry.gainMarketUsd,\r\n gainMarketPct: (valueMarket / valuePaid - 1) * 100,\r\n gainTodayUsd: prevEntry.gainTodayUsd + entry.gainTodayUsd,\r\n }\r\n }\r\n })\r\n })\r\n\r\n return Object.values(result)\r\n}\r\n\r\n/**\r\n * Checks if item is loser/gainer and returns the appropriate flag\r\n */\r\nfunction getEntryGroup(type: PortfolioSymbolType, gain: number, transaction: PortfolioTransaction) {\r\n if (type === PortfolioSymbolType.Cash) return PortfolioDataKey.Cash\r\n\r\n switch (transaction) {\r\n case PortfolioTransaction.Short: {\r\n return gain > 0 ? PortfolioDataKey.ShortGainers : PortfolioDataKey.ShortLosers\r\n }\r\n\r\n default:\r\n case PortfolioTransaction.Buy: {\r\n return gain >= 0 ? PortfolioDataKey.LongGainers : PortfolioDataKey.LongLosers\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates industry node with children\r\n */\r\nexport function getIndustries(industries: Record) {\r\n return Object.keys(industries).map((industry) => ({\r\n name: industry,\r\n children: industries[industry],\r\n }))\r\n}\r\n\r\n/**\r\n * Group items by key\r\n * @see https://stackoverflow.com/a/47385953\r\n */\r\nexport function groupByKey(list: Item[], key: keyof Item) {\r\n return list.reduce>((hash, obj) => {\r\n if (obj[key] === undefined) return hash\r\n return Object.assign(hash, { [obj[key] as string]: (hash[obj[key] as string] || []).concat(obj) })\r\n }, {})\r\n}\r\n\r\n/**\r\n * Creates long/short gainers/losers group with all the children, optionally grouping them by industry\r\n */\r\nfunction createGroup(key: PortfolioDataKey, data: PortfolioMapData, groupByIndustry = true) {\r\n let groupName = ''\r\n switch (key) {\r\n case PortfolioDataKey.Cash:\r\n groupName = 'Other'\r\n break\r\n default:\r\n const isLong = [PortfolioDataKey.LongGainers, PortfolioDataKey.LongLosers].includes(key)\r\n const isGainer = [PortfolioDataKey.LongGainers, PortfolioDataKey.ShortGainers].includes(key)\r\n const longPrefix = data.shortGainers.length || data.shortLosers.length ? `${groupPrefix.long}: ` : ''\r\n const shortPrefix = data.longGainers.length || data.longLosers.length ? `${groupPrefix.short}: ` : ''\r\n groupName = `${isLong ? longPrefix : shortPrefix}${isGainer ? groupLabel.gainers : groupLabel.losers}`\r\n break\r\n }\r\n\r\n if (groupByIndustry) {\r\n let children: Array<{ name: string; children: MapDataNode[] }> = []\r\n if (key === PortfolioDataKey.Cash && data[key].length) children = [{ name: 'Cash', children: data[key] }]\r\n else children = getIndustries(groupByKey(data[key], industryLabelKey))\r\n return { name: groupName, children }\r\n }\r\n\r\n return { name: groupName, children: data[key] }\r\n}\r\n\r\nexport function getPerfText(node: PortfolioMapEntry, subtype: MapSubtypeId) {\r\n switch (subtype) {\r\n case MapSubtypeId.PortfolioGainPct:\r\n return node.gainMarketPct\r\n case MapSubtypeId.PortfolioGainUsd:\r\n return node.gainMarketUsd\r\n case MapSubtypeId.PortfolioChangePct:\r\n return node.lastChangePct\r\n case MapSubtypeId.PortfolioChangeUsd:\r\n return node.gainTodayUsd\r\n }\r\n}\r\n\r\nfunction getPerfForTicker | any[]>(\r\n ticker: string,\r\n list?: ListType,\r\n group?: PortfolioDataKey\r\n) {\r\n if (Array.isArray(list)) {\r\n return list.find((item) => item.name === ticker && item.data?.group === group)?.perf\r\n }\r\n\r\n return list?.[ticker]\r\n}\r\n\r\n/**\r\n * Returns data for the map. This data is deduped and split into gainers/losers & industries\r\n */\r\nexport function getMapData({\r\n data,\r\n perfData,\r\n size,\r\n subtype,\r\n groupByIndustry,\r\n}: {\r\n data?: PortfolioGroup[]\r\n perfData?: PerfData\r\n size: PortfolioMapSizeKey\r\n subtype: MapSubtypeId\r\n groupByIndustry?: boolean\r\n}) {\r\n if (!data) return { hasData: false }\r\n\r\n const dedupedData = flattenAndDedupe(data)\r\n\r\n const parsedData = dedupedData.reduce(\r\n (prev: PortfolioMapData, current) => {\r\n const group = getEntryGroup(current.type, current.gainMarketPct / 100, current.transaction)\r\n // The map can’t display negative values so we need to Math.abs\r\n let value = Math.abs(size === PortfolioMapSizeKey.MarketValue ? current.valueMarket : current.gainMarketUsd)\r\n if (!Number.isFinite(value)) value = 0\r\n\r\n const subtypePerf = getPerfText(current, subtype)\r\n const perfText = subtype.startsWith('portfolio')\r\n ? subtypePerf\r\n : getPerfForTicker(current.ticker, perfData?.nodes, group)\r\n\r\n const entry = {\r\n name: current.ticker,\r\n value,\r\n perf: current.type === PortfolioSymbolType.Cash ? null : perfText ?? subtypePerf,\r\n additional:\r\n current.type === PortfolioSymbolType.Cash\r\n ? formatNumber(current.valueMarket)\r\n : getPerfForTicker(current.ticker, perfData?.additional, group),\r\n description: current.industry,\r\n data: { perfWeek: current.perfWeek, group },\r\n } as MapDataNode\r\n\r\n if (value > 0) {\r\n return { ...prev, [group]: [...prev[group], entry] }\r\n }\r\n\r\n return prev\r\n },\r\n {\r\n [PortfolioDataKey.Cash]: [],\r\n [PortfolioDataKey.LongGainers]: [],\r\n [PortfolioDataKey.LongLosers]: [],\r\n [PortfolioDataKey.ShortGainers]: [],\r\n [PortfolioDataKey.ShortLosers]: [],\r\n }\r\n )\r\n\r\n return {\r\n hasData: Object.values(parsedData).some((arr) => arr.length > 0),\r\n data: {\r\n name: 'Portfolio',\r\n children: Object.keys(parsedData)\r\n .map((key) => createGroup(key as PortfolioDataKey, parsedData, groupByIndustry))\r\n .filter((category) => category.children.length),\r\n } as MapDataRoot,\r\n }\r\n}\r\n\r\nexport function parsePortfolioQuery(params: URLSearchParams, defaultPortfolioId: number) {\r\n const currentPortfolio = Number.parseInt(params.get(PortfolioQuery.PortfolioId) ?? '')\r\n const portfolioId =\r\n Number.isFinite(currentPortfolio) && currentPortfolio !== 0 ? currentPortfolio : defaultPortfolioId\r\n\r\n return {\r\n portfolioId,\r\n params: Object.fromEntries(params.entries()) as Record, // Re-export the original query as key/val\r\n view: params.get(PortfolioQuery.View) ?? PortfolioView.View,\r\n tableView: params.get(PortfolioQuery.TableView) ?? undefined,\r\n map: parseBoolFromValue(params.get(PortfolioQuery.Map)) ?? getMapSettingFromLocalStorage().showMap,\r\n size: (params.get(PortfolioQuery.Size) ?? PortfolioMapSizeKey.MarketValue) as PortfolioMapSizeKey,\r\n subtype: (params.get(PortfolioQuery.Subtype) ?? getMapSettingFromLocalStorage().subtype) as MapSubtypeId,\r\n group: params.get(PortfolioQuery.Group)?.toUpperCase().split(',') ?? [],\r\n tickers: params.get(PortfolioQuery.Tickers)?.split(',') ?? [],\r\n }\r\n}\r\n\r\nexport function getColumnsByKeys(keys: ColumnId[]) {\r\n return keys.map((key) => columnMap[key])\r\n}\r\n\r\nexport function getFormattedDate(format = PORTFOLIO_DATE_FORMAT_DATA) {\r\n return `${dateFns.format(new Date(), format)}`\r\n}\r\n\r\nexport function validateEditRow(\r\n state: Partial,\r\n dateFormat = PORTFOLIO_DATE_FORMAT_DATA,\r\n checkFormat = true\r\n) {\r\n const formErrors: FormErrors = {}\r\n\r\n if (state.ticker !== undefined && state.ticker.trim().length === 0) {\r\n formErrors.ticker = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (!state.date || !dateFns.isValid(parseInputAsDate({ input: state.date, format: dateFormat, checkFormat })))\r\n ) {\r\n formErrors.date = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.shares === undefined || isNaN(state.shares) || state.shares < 0)\r\n ) {\r\n formErrors.shares = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.price === undefined || isNaN(state.price) || state.price <= 0)\r\n ) {\r\n formErrors.price = true\r\n }\r\n\r\n return { isValid: Object.keys(formErrors).length === 0, errors: formErrors }\r\n}\r\n\r\nexport function parseInputAsDate({\r\n input,\r\n format = PORTFOLIO_DATE_FORMAT_VIEW,\r\n checkFormat = true,\r\n}: {\r\n input: Date | string\r\n format?: string\r\n checkFormat?: boolean\r\n}) {\r\n if (checkFormat && typeof input === 'string' && input.length !== format.length) {\r\n return new Date('Invalid Date')\r\n }\r\n if (input instanceof Date && dateFns.isValid(input)) return input\r\n\r\n return dateFns.parse(input.toString(), format, new Date())\r\n}\r\n\r\nexport const FORM_ENTRY_KEYS = Object.keys(EMPTY_FORM_ENTRY)\r\n\r\nfunction appendRowToFormData(serializer: URLSearchParams, row: Partial, index: number) {\r\n FORM_ENTRY_KEYS.forEach((key) => serializer.append(`${key}${index}`, `${row[key as keyof PortfolioEntryBase] ?? ''}`))\r\n}\r\n\r\nexport function getBulkEditData(\r\n data: Array,\r\n options: { resetCash?: boolean } = {}\r\n): Record {\r\n return data.reduce(\r\n (acc, row) => {\r\n const existingId = (row as PortfolioFormGroup).id\r\n const id = existingId ? `${existingId}` : getUuid()\r\n const transactions =\r\n row.transactions.length === 0 || (options.resetCash && getSymbolType(row.ticker) === PortfolioSymbolType.Cash)\r\n ? [getNewTransaction(row.ticker, PortfolioTransaction.Watch)]\r\n : row.transactions.map((transaction) => ({\r\n ...transaction,\r\n uuid: transaction.id ? `${transaction.id}` : getUuid(),\r\n }))\r\n return {\r\n ...acc,\r\n [id]: { ...row, id, transactions },\r\n }\r\n },\r\n {} as Record\r\n )\r\n}\r\n\r\nexport function serializeFormData<\r\n EntryType extends { ticker: string; transactions?: Array> },\r\n>(entries: EntryType[]) {\r\n const serializer = new URLSearchParams()\r\n entries\r\n .flatMap((entry) => {\r\n if (!entry.transactions || entry.transactions?.length === 0) {\r\n return getNewTransaction(entry.ticker, PortfolioTransaction.Watch)\r\n }\r\n\r\n return entry.transactions\r\n })\r\n .forEach((entry, index) => {\r\n if (entry.ticker.length) appendRowToFormData(serializer, entry, index)\r\n })\r\n\r\n return serializer\r\n}\r\n\r\nexport async function validateFormData(data: PortfolioFormGroup[], validateFields = true) {\r\n if (data.length === 0) return { isValid: true, errors: {} }\r\n\r\n let isValid = true\r\n const errors: Record = {}\r\n\r\n try {\r\n const tickers = data.map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n return ticker.length ? ticker : api.QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const validatedTickers = await api.validateTickers(tickers)\r\n\r\n isValid = tickers.length === validatedTickers.length\r\n\r\n // Validate fields\r\n if (validateFields) {\r\n data.forEach((row, index) => {\r\n const validationResult = row.transactions.map((transaction) =>\r\n validateEditRow(transaction, PORTFOLIO_DATE_FORMAT_DATA, false)\r\n )\r\n\r\n const hasInvalidEntries = validationResult.some((result) => !result.isValid)\r\n const isInvalidTicker = validatedTickers[index] !== true\r\n\r\n if (hasInvalidEntries || isInvalidTicker) {\r\n isValid = false\r\n }\r\n\r\n errors[row.id] = validationResult.map((result) => ({ ...result.errors, ticker: isInvalidTicker }))\r\n })\r\n }\r\n } catch {\r\n return {\r\n isValid: false,\r\n errors: {},\r\n }\r\n }\r\n\r\n return { isValid, errors }\r\n}\r\n\r\nexport function getNumberValue(value?: number) {\r\n if (value === undefined || isNaN(value)) return NaN\r\n return value\r\n}\r\n\r\nexport function getNewTransaction(ticker: string, transaction = PortfolioTransaction.Buy): PortfolioFormEntry {\r\n const symbolType = getSymbolType(ticker)\r\n const allowedTransactions = getTransactionsForSymbolType(symbolType)\r\n\r\n return {\r\n ...EMPTY_FORM_ENTRY,\r\n uuid: getUuid() as string,\r\n ticker,\r\n type: getSymbolType(ticker),\r\n date: getFormattedDate(PORTFOLIO_DATE_FORMAT_DATA),\r\n transaction: [PortfolioTransaction.Watch, ...allowedTransactions].includes(transaction)\r\n ? transaction\r\n : allowedTransactions[0],\r\n shares: transaction === PortfolioTransaction.Watch || symbolType === PortfolioSymbolType.Cash ? 0 : undefined,\r\n price: transaction === PortfolioTransaction.Watch ? 0 : undefined,\r\n }\r\n}\r\n\r\nexport function getPortfolioInitData() {\r\n let returnData = { isInitData: false, initData: api.EMPTY_RESPONSE }\r\n const initDataElement = document.getElementById('portfolio-init-data')\r\n if (initDataElement) {\r\n const initData = parseInitData('portfolio-init-data')\r\n initDataElement.remove()\r\n returnData = { isInitData: !!initData, initData: initData ?? api.EMPTY_RESPONSE }\r\n }\r\n return returnData\r\n}\r\n\r\nconst EMPTY_TRANSACTION = { transaction: PortfolioTransaction.Watch, index: 0, price: 0 }\r\n\r\nexport function getTradesStructureData(portfolioData: PortfolioGroup[]) {\r\n return portfolioData\r\n .flatMap((ticker) => {\r\n const transactions = [...ticker.transactions]\r\n if (transactions.length === 0) {\r\n transactions.push(EMPTY_TRANSACTION as unknown as PortfolioEntryTransaction)\r\n }\r\n return transactions.map((transaction) => {\r\n const obj = { ...ticker } as Omit & {\r\n transactions?: PortfolioEntryTransaction[]\r\n }\r\n delete obj.transactions\r\n return { ...obj, ...transaction }\r\n })\r\n })\r\n .sort((a, b) => a.id - b.id)\r\n}\r\n\r\nexport function getSymbolType(symbol?: string) {\r\n if (symbol?.toUpperCase() === PORTFOLIO_CASH_SYMBOL) return PortfolioSymbolType.Cash\r\n\r\n return PortfolioSymbolType.Stock\r\n}\r\n\r\nexport function isStockTransaction(transaction: PortfolioTransaction) {\r\n return STOCK_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function isCashTransaction(transaction: PortfolioTransaction) {\r\n return CASH_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function getTransactionsForSymbolType(symbolType: PortfolioSymbolType) {\r\n switch (symbolType) {\r\n case PortfolioSymbolType.Cash:\r\n return CASH_TRANSACTIONS\r\n default:\r\n return STOCK_TRANSACTIONS\r\n }\r\n}\r\n\r\nexport function getPortfolioRefreshInterval() {\r\n return getMapsRefreshInterval({\r\n base: PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n free: PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n })\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { CreateAlertEntry } from '../../app/quote/create-alert/types'\r\nimport { PortfolioDefinition } from '../modules/portfolio/types'\r\nimport { Instrument } from '../types'\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/charts/blob/master/app/utils/fetch_api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nexport class ThrowableError extends Error {\r\n status: number\r\n isServerError = false\r\n body: unknown\r\n extra: Record = {}\r\n\r\n constructor(status: number, message = 'ThrowableError', body = '', extra: Record = {}) {\r\n super(`${status} ${message}`)\r\n this.status = status\r\n this.isServerError = status >= 500\r\n this.body = body\r\n this.extra = extra\r\n }\r\n}\r\n\r\nexport interface CancelablePromise extends Promise {\r\n cancel?: () => void\r\n}\r\n\r\n/**\r\n * General api fetch utility which returns a cancelable promise\r\n */\r\nexport function apiRequest(\r\n url: string,\r\n { query, headers = {}, ...options }: RequestInit & { query?: Record } = {},\r\n throwOnAllErrors = false\r\n): CancelablePromise {\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n const requestUrl = query ? `${url}?${new URLSearchParams(query)}` : url\r\n const contentType: ContentType = (headers as any)['Content-Type'] ?? ContentType.ApplicationJson\r\n\r\n const requestOptions = {\r\n ...options,\r\n headers: {\r\n 'Content-Type': contentType,\r\n ...headers,\r\n },\r\n }\r\n const request = fetch(requestUrl, { ...requestOptions, signal: controller?.signal })\r\n\r\n const cancelableRequest: CancelablePromise = request\r\n .then(async (response) => {\r\n const textResponse = await response.text()\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n\r\n try {\r\n const parsedResponse = parseResponseForContentType(textResponse, responseContentType)\r\n if (!response.ok || response.status >= 500) {\r\n throw new ThrowableError(response.status, response.statusText, parsedResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n\r\n return parsedResponse\r\n } catch (error: any) {\r\n if (error instanceof ThrowableError) {\r\n throw error\r\n }\r\n throw new ThrowableError(500, error.message, textResponse, { rayId: response.headers.get('cf-ray') })\r\n }\r\n })\r\n .catch((error: ThrowableError) => {\r\n if (error.status >= 500) {\r\n Sentry.withScope((scope) => {\r\n scope.setContext('Cloudflare', error.extra)\r\n\r\n if (error.status === 500) {\r\n Sentry.captureException(error)\r\n } else {\r\n Sentry.captureMessage(`${error.status} ${error.message}`)\r\n }\r\n })\r\n }\r\n if (throwOnAllErrors) {\r\n throw error\r\n }\r\n })\r\n\r\n if (controller) {\r\n cancelableRequest.cancel = () => controller.abort()\r\n }\r\n\r\n return cancelableRequest\r\n}\r\n\r\nexport interface SearchApiResult {\r\n ticker: string\r\n company: string\r\n exchange: string\r\n}\r\n\r\nexport function searchApiRequest(input = '', instrument?: Instrument) {\r\n return apiRequest('/api/suggestions.ashx', { query: { input, instrument } }, true)\r\n}\r\n\r\nexport function portfoliosRequest() {\r\n return apiRequest<{ portfolios: PortfolioDefinition[] }>('/api/portfolio_data.ashx', {\r\n query: {\r\n fields: 'portfolios',\r\n },\r\n })\r\n}\r\n\r\nexport function lastCloseRequest(ticker: string) {\r\n return apiRequest('/request_quote.ashx', {\r\n query: {\r\n t: ticker,\r\n },\r\n })\r\n}\r\n\r\ninterface PortfolioLimitResult {\r\n transactions: number\r\n limitTransactions: number\r\n}\r\n\r\nexport function portfolioLimitRequest(portfolioId: number) {\r\n return apiRequest('/api/portfolio_data.ashx', {\r\n query: {\r\n pid: portfolioId,\r\n fields: 'transactions,limitTransactions',\r\n },\r\n })\r\n}\r\n\r\nexport function createAlertRequest(state: CreateAlertEntry) {\r\n return apiRequest(\r\n '/create_alert.ashx',\r\n {\r\n method: 'POST',\r\n body: JSON.stringify(state),\r\n },\r\n true\r\n )\r\n}\r\n","import { EventEmitter } from 'events'\r\nimport * as React from 'react'\r\n\r\nlet emitter: EventEmitter | undefined\r\n\r\n/**\r\n * Get the emitter which is used to sync components across the page, subscibe to\r\n * changes and attach event which handles changes across windows\r\n */\r\nexport function subscribeToChanges(\r\n key: string,\r\n defaultValue: ValueType,\r\n changeCallback?: (value: React.SetStateAction) => void\r\n) {\r\n if (!emitter) emitter = new EventEmitter()\r\n\r\n const onChange = (value: React.SetStateAction) => {\r\n const newValue = value ?? getValue(key, defaultValue)\r\n setValue(key, newValue, defaultValue, false)\r\n changeCallback?.(newValue)\r\n }\r\n\r\n const onStorageChange = (ev: StorageEvent) => {\r\n if (ev.key === key) {\r\n try {\r\n const value = ev.newValue ? JSON.parse(ev.newValue) : null\r\n onChange(value ?? defaultValue)\r\n } catch {\r\n onChange(defaultValue)\r\n }\r\n }\r\n }\r\n\r\n emitter.addListener(key, onChange)\r\n window.addEventListener('storage', onStorageChange)\r\n\r\n return {\r\n emitter,\r\n unsubscribe: () => {\r\n emitter?.removeListener(key, onChange)\r\n window.removeEventListener('storage', onStorageChange)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Get value from local storage or fall back to `defaultValue`\r\n */\r\nexport function getValue(key: string, defaultValue: ValueType): ValueType {\r\n try {\r\n const value = localStorage.getItem(key)\r\n const parsedValue = value ? JSON.parse(value) : null\r\n return parsedValue ?? defaultValue\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\n/**\r\n * Set value to local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function setValue(\r\n key: string,\r\n valueGetter: React.SetStateAction,\r\n defaultValue: ValueType,\r\n emit = true\r\n) {\r\n try {\r\n const state = getValue(key, defaultValue)\r\n const valueToStore = valueGetter instanceof Function ? valueGetter(state) : valueGetter\r\n\r\n localStorage.setItem(key, JSON.stringify(valueToStore))\r\n if (emit) emitter?.emit(key, valueToStore)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Removes value from local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function removeValue(key: string, emit = true) {\r\n try {\r\n localStorage.removeItem(key)\r\n if (emit) emitter?.emit(key, undefined)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Helper function to migrate old value type to new one (eg. boolean to object)\r\n */\r\nexport function migrateValue(\r\n key: string,\r\n /**\r\n * The migrate function might get called multiple times on the page, so `oldValue` in the callback\r\n * can actually be the already migrated value. Make sure to add a condition to only migrate once.\r\n */\r\n transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue),\r\n defaultValue: NewValue\r\n) {\r\n try {\r\n const oldValue = getValue(key, undefined)\r\n if (typeof oldValue === 'undefined') return\r\n const migratedValue = transformValue instanceof Function ? transformValue(oldValue) : transformValue\r\n setValue(key, migratedValue, defaultValue, false) // don’t emit to other components\r\n } catch {}\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: Record,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.TokensToFunctionOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker?',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }, { validate: false }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) => compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) => compilePath(path.backtestDetail, { backtestId }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","export enum Instrument {\r\n Stock = 'stock',\r\n Forex = 'forex',\r\n Crypto = 'crypto',\r\n Futures = 'futures',\r\n MarketSentiment = 'market_sentiment',\r\n Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record\r\n\r\nexport type PartialBy = Omit & Partial>\r\n\r\nexport type NullableNumbers = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport type SortableValue = string | null | number | Date\r\nexport type SortDirectionValue = 1 | -1\r\n","import isPlainObject from 'lodash.isplainobject'\r\nimport { ComponentType, LazyExoticComponent, lazy } from 'react'\r\nimport { ShouldRevalidateFunction } from 'react-router-dom'\r\n\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { parseInitData } from '../app/shared/utils'\r\nimport { CRYPTO_TICKERS } from './constants'\r\nimport { Instrument, SortDirectionValue, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\n/**\r\n * Function which wraps React.lazy and checks whether a chunk is preloaded\r\n * from async-manifest. If yes, kick in the promise resolve early so we can\r\n * instantly render the component\r\n */\r\nexport function lazyLoadComponent({\r\n chunkName,\r\n load,\r\n}: {\r\n chunkName: string\r\n load: () => Promise<{ default: ComponentType }>\r\n}): LazyExoticComponent> {\r\n // Resolve earlier if prefetch element is present\r\n const hasPreloadElement = document.querySelector(`[data-chunk-id=${chunkName}]`)\r\n\r\n if (hasPreloadElement) {\r\n const componentLoader = load()\r\n\r\n return lazy(() => componentLoader)\r\n }\r\n\r\n return lazy(load)\r\n}\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON(value: unknown | Shape): Shape | undefined {\r\n if (isObject(value)) {\r\n return value as Shape\r\n }\r\n\r\n let parsedValue\r\n try {\r\n if (typeof value === 'string') {\r\n parsedValue = JSON.parse(value)\r\n }\r\n } catch (e) {\r\n return\r\n }\r\n return parsedValue\r\n}\r\n\r\n/**\r\n * remove @ symbol from a ticker\r\n */\r\nexport function cleanTicker(ticker: string) {\r\n return ticker.startsWith('@') ? ticker.substring(1) : ticker\r\n}\r\n\r\n/**\r\n * Get instrument for a ticker.\r\n *\r\n * - If ticker doesn’t start with `@` - stock\r\n * - Otherwise\r\n * - one of `CRYPTO_TICKERS` - crypto\r\n * - has length of 6 - forex\r\n * - none of above - future\r\n *\r\n * NOTE: counterpart in charts 'charts/app/utils/chart.js'\r\n */\r\n\r\nexport function getInstrumentForTicker(ticker: string): Instrument {\r\n if (!ticker?.startsWith('@')) return Instrument.Stock\r\n\r\n const cleanedTicker = cleanTicker(ticker)\r\n\r\n if (CRYPTO_TICKERS.includes(cleanedTicker.toUpperCase())) return Instrument.Crypto\r\n if (cleanedTicker.length === 6) return Instrument.Forex\r\n\r\n return Instrument.Futures\r\n}\r\n\r\n/**\r\n * Async load Resize observer polyfill when we need it\r\n */\r\nlet resizeObserverPolyfill: typeof window.ResizeObserver\r\nexport async function loadResizeObserverPolyfill() {\r\n if (typeof window.ResizeObserver === 'undefined') {\r\n const polyfill = await import('resize-observer-polyfill')\r\n resizeObserverPolyfill = polyfill.default\r\n window.ResizeObserver = resizeObserverPolyfill\r\n return resizeObserverPolyfill as typeof window.ResizeObserver\r\n }\r\n}\r\n\r\nexport async function getIsBrave() {\r\n return (navigator.brave && (await navigator.brave.isBrave())) || false\r\n}\r\n\r\nexport function hasDarkModeFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('dark:1')\r\n}\r\n\r\nexport function hasRedesignFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('redesign:1')\r\n}\r\n\r\nexport function isRedesignFeatureEnabled() {\r\n return hasRedesignFeature() || hasDarkModeFeature()\r\n}\r\n\r\nexport function isDarkModeFeatureEnabled() {\r\n const theme = getCookie('chartsTheme')\r\n return isRedesignFeatureEnabled() && theme.includes('dark')\r\n}\r\n\r\nexport enum ChildPosition {\r\n topLeft,\r\n topRight,\r\n bottomLeft,\r\n bottomRight,\r\n center,\r\n topCenter,\r\n rightCenter,\r\n bottomCenter,\r\n leftCenter,\r\n}\r\n\r\nexport function getFlexAlignClasses(position: ChildPosition) {\r\n return {\r\n 'justify-start': [ChildPosition.topLeft, ChildPosition.bottomLeft, ChildPosition.leftCenter].includes(position),\r\n 'justify-center': [ChildPosition.center, ChildPosition.topCenter, ChildPosition.bottomCenter].includes(position),\r\n 'justify-end': [ChildPosition.topRight, ChildPosition.bottomRight, ChildPosition.rightCenter].includes(position),\r\n 'items-start': [ChildPosition.topLeft, ChildPosition.topRight, ChildPosition.topCenter].includes(position),\r\n 'items-center': [ChildPosition.center, ChildPosition.rightCenter, ChildPosition.leftCenter].includes(position),\r\n 'items-end': [ChildPosition.bottomLeft, ChildPosition.bottomRight, ChildPosition.bottomCenter].includes(position),\r\n }\r\n}\r\n\r\ninterface NumberFormatOptions {\r\n fractions: number\r\n showPlusSign: boolean\r\n defaultValue: string\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\r\nfunction getIntl(fractions: number) {\r\n if (!intlCache[fractions])\r\n intlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n })\r\n return intlCache[fractions]\r\n}\r\n\r\nexport function shortFormatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n let suffix = ''\r\n if (num >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (num >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (num >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix\r\n}\r\n\r\nexport function formatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const prefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {prefix + fixedValue}\r\n }\r\n\r\n const formatted = getIntl(fractions).format(value)\r\n\r\n return prefix + formatted\r\n}\r\n\r\nexport interface SortByColumnOptions {\r\n /**\r\n * Change order of `null` values.\r\n * - `false` Force sort null as first (asc) and last (desc)\r\n * - `true` Always sort null as last regardless of order\r\n * @default false\r\n */\r\n sortNullAsLast?: boolean\r\n\r\n /**\r\n * When true, null values will not be treated as special values\r\n * @default false\r\n */\r\n ignoreNullForComparison?: boolean\r\n}\r\n\r\nexport function sortByColumn(\r\n options: SortByColumnOptions & {\r\n a: ItemType\r\n b: ItemType\r\n direction: SortDirectionValue\r\n valueGetter?: (row: ItemType) => SortableValue\r\n }\r\n) {\r\n const valueA = options.valueGetter?.(options.a)\r\n const valueB = options.valueGetter?.(options.b)\r\n // Compare as strings\r\n if (typeof valueA === 'string' && typeof valueB === 'string') return valueA.localeCompare(valueB) * options.direction\r\n\r\n // Always sort null last if enabled\r\n if (options.sortNullAsLast && valueA === null) return Infinity\r\n if (options.sortNullAsLast && valueB === null) return -Infinity\r\n\r\n // Sort null first/last depending on direction\r\n if (!options.ignoreNullForComparison && valueA === null) return -options.direction\r\n if (!options.ignoreNullForComparison && valueB === null) return options.direction\r\n\r\n // Compare as numbers\r\n return (Number(valueA) - Number(valueB)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n // make sure sourceIndex and destinationIndex are inside of arr\r\n const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n const items = [...arr]\r\n const [removed] = items.splice(from, 1)\r\n items.splice(to, 0, removed)\r\n\r\n return items\r\n}\r\n\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n/**\r\n * This fn creates a revalidator rule which always revalidates loader when the\r\n * specified keys change but ignores changes to other keys. It also allows\r\n * `revalidator.revalidate` to work even if the query didn’t\r\n */\r\nexport function revalidateOnQueryChange(keys: string[]): ShouldRevalidateFunction {\r\n return (args) => {\r\n const prevParams = args.currentUrl.searchParams\r\n const nextParams = args.nextUrl.searchParams\r\n const requiredChanged = keys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n const otherQueryKeys = [...prevParams.keys(), ...nextParams.keys()].filter(\r\n (key, index, arr) => !keys.includes(key) && arr.indexOf(key) === index\r\n )\r\n const otherChanged = otherQueryKeys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n\r\n if (!requiredChanged && otherChanged) {\r\n return false\r\n }\r\n\r\n return args.defaultShouldRevalidate\r\n }\r\n}\r\n\r\nexport function parseRouteInitData({\r\n elementId = 'route-init-data',\r\n fallback,\r\n removeElement = true,\r\n}: { elementId?: string; fallback?: DataType; removeElement?: boolean } = {}): DataType | null {\r\n const element = document.getElementById(elementId)\r\n let initialData = fallback\r\n\r\n if (!element) return fallback ?? null\r\n\r\n try {\r\n const parsedData = parseInitData(elementId)\r\n if (removeElement) element.remove()\r\n\r\n if (parsedData) initialData = parsedData\r\n } catch {\r\n initialData = fallback\r\n }\r\n\r\n return initialData ?? null\r\n}\r\n"],"names":["module","exports","white","black","inherit","transparent","current","finviz","blue","gray","red","orange","amber","yellow","brightYellow","lime","green","emerald","teal","violet","purple","pink","MarketBadgeType","getMarketBadgeText","type","_date","Open","label","Closed","Premarket","Aftermarket","getMarketBadgeType","time","hasUserPremium","isHoliday","isPremarket","isAftermarket","None","MarketBadge","_ref","badge","className","_jsx","classnames","includes","TimeBreakpointMode","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","getTimeState","fixedTime","arguments","length","undefined","FinvizSettings","getDate","TooltipBadge","props","state","useTooltipState","placement","_jsxs","_Fragment","children","TooltipTrigger","Tooltip","Heading","level","StaticBadge","findMatchingBreakpoint","compareWidth","breakpoints","filter","breakpoint","pop","getCurrentWidth","mode","element","window","innerWidth","clientWidth","Time","breakpointMode","ResizeObserver","useResizeObserver","rootRef","React","setState","currentBreakpoint","setBreakpoint","interval","setInterval","clearInterval","currentWidth","handleResize","throttle","foundBreakpoint","observer","entries","requestAnimationFrame","Array","isArray","observe","addEventListener","disconnect","removeEventListener","ref","getFormattedDateString","seed","date","Date","dateAsNY","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","isDst","dayNumber","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","setUTCHours","getWeekDay","toLocaleDateString","weekday","uppercase","name","month","toUpperCase","toString","padStart","getTime","toLocaleString","hour","minute","hour12","TimeFormat","format","long","getFullYear","short","dateOnly","timeOnly","formatDate","value","inputOrOutputFormat","outputFormat","dateFns","isPremium","dayOfWeek","min","getMinutes","hours","getHours","HOLIDAY_DATES","test","day","getHoliday","find","holiday","EXPANDED_MAP_BODY_CLASSS","FALLBACK_PERF_RESPONSE","nodes","additional","subtype","MapSubtypeId","MAP_SUBTYPES_COMPANIES_BY_ID","id","scaleId","ScaleId","tooltip","countIndustryPerf","countSectorPerf","MAP_SUBTYPES_ETF_BY_ID","MAP_SUBTYPES_COMPANIES","Object","values","MAP_SUBTYPES_ETF","MAP_TYPES","pageTitle","description","MapTypeId","subtypes","nameShort","MAP_TYPE_SCREENER","MAP_TYPE_ETF_HOLDINGS_WIDGET","MAP_MIN_WIDTH","MAP_MIN_HEIGHT","SECTOR_MIN_HEIGHT","LEGEND_HEIGHT","LARGE_MAP_HEIGHT_RATIO","SMALL_MAP_GEO_HEIGHT_RATIO","SMALL_MAP_HEIGHT_RATIO","LARGE_NODE_SIZE","dx","dy","LARGE_NODE_MIN_HEIGHT","ORDER_SP500","Technology","Financial","Healthcare","Industrials","Energy","Utilities","ORDER_SEC_ALL","ORDER_ETF","US","Global","International","Commodity","Strategy","Forex","ORDER_SCREENER","ORDER_SCREENER_ETF","ORDER_WORLD","Ireland","Spain","France","Belgium","Netherlands","Switzerland","China","Japan","India","Taiwan","Colombia","Chile","Argentina","WORLD_INDUSTRIES","x","y","countries","scaleMinMax","_5","_10","_15","_20","_25","_relvol","_pe","_fpe","_peg","_ps","_pb","_div","_eps5y","_short","_rec","_earndate","_portfolioPct","_portfolioUsd","scaleStepFormat","Settings","padding","top","right","bottom","left","background","tailwindColors","sector","border","header","color","height","fontSize","fontWeight","margin","industry","hover","scaleFontSizes","fontSizePadding","fontSizePairs","SettingsSmall","SettingsSmallDark","SettingsSmallGeo","SettingsSmallGeoDark","SettingsScreener","SettingsScreenerDark","LayoutGenerator","width","settings","layout","sectors","industries","isSmall","minSectorHeight","static","getSizeRatio","constants","ratio","calculateWidth","Math","round","node","deltaX","x1","x0","deltaY","y1","y0","isLargeNode","showHeader","constructor","this","getExportData","mapRoot","_rootsToRoot","data","filterVisibleNodes","stringified","JSON","stringify","key","parse","getLayoutData","arr","isVisible","isNodeVisible","d","depth","NodeDepth","getLayout","options","_generateSP500","descendants","_generateFull","_generateScreener","_generateWorld","_generateETF","forEach","_transformNode","parent","push","assign","perf","roots","duplicateTickers","_getPadding","isNodeHeaderVisible","smallIndustryPadding","_getPaddingGeo","smallIndustryGeoPadding","_getHierarchySort","a","b","order","heightB","Number","isFinite","hasOwnProperty","_getHierarchy","d3","sum","sort","_getTreemap","paddingFn","size","tile","paddingTop","paddingRight","paddingBottom","paddingLeft","_getIndustriesRoots","some","i","_getSectorsRoots","s","_generateLayout","recountSectors","treemapHeight","calculateHeight","treemap","hierarchy","recalculateHeight","financialSector","technologySector","financialHeight","technologyHeight","eachAfter","showETF","industryIndex","industryX","industryY","industryWidth","industryHeight","countriesRoots","root","treemapNodes","each","brazil","colombia","brazilWidth","colombiaWidth","concat","getOffset","e","rect","currentTarget","getBoundingClientRect","offsetX","clientX","offsetY","clientY","getIsSmall","URLSearchParams","location","search","get","getSettingsForMapType","restoreDataKeys","perfData","map","row","newRow","getMapData","mapData","company","splitData","async","fetchBaseData","filename","cacheBuster","fetch","json","getRatioSizeForWidth","mapWidth","max","getSize","canvasWrapper","document","getElementById","query","has","parsedRatio","parseFloat","body","classList","contains","wrapper","style","removeProperty","elementHeight","innerHeight","newWidth","maxWidth","getSizeForExpandedMap","clientHeight","scrollbarWidth","documentElement","getSizeRatioBasedMap","getDefaultZoomLevels","isMobile","navigator","userAgent","parseInitDataAsPerf","version","getVisibleTooltipTickers","industryTickers","rowHeight","visibleRows","floor","slice","n","onNodeClick","open","set","ScreenerQuery","ScreenerView","tickers","flatMap","join","replace","toLowerCase","MapsPollingIntervalInMs","getMapsRefreshInterval","base","Elite","reduced","EliteStocksReduced","free","Free","customRefreshInterval","isStockFastRefreshAvailable","decodeQueryString","vars","substring","split","obj","pair","delimiterPos","indexOf","decodeURIComponent","encodeQueryString","whitelistedValues","keys","reduce","prev","encodeURIComponent","EVENTS","EventCheckboxes","handleChange","ev","checked","errors","isEmpty","setErrors","event","Checkbox","onChange","PriceInput","rawValue","setRawValue","handleBlur","price","valueAsNumber","tooltipContent","priceValue","isNaN","TooltipInput","isMobileStyleEnabled","showNumberStepper","error","classNames","onBlur","tooltipColor","isInteractive","DEFAULT_STATE","ticker","news","rating","insider","priceAbove","priceBelow","FormContent","onSubmit","onClose","apiError","setApiError","formRef","useFocusInputOnError","PortfolioBulkEditRowContextProvider","hasAlwaysActiveOverride","DialogBody","noValidate","autoComplete","preventDefault","isValid","formErrors","trim","validatedTickers","validateTickers","eventTriggers","every","trigger","Boolean","validateState","alert","result","createAlertRequest","isSuccess","message","submit","Paragraph","TickerEditColumn","entry","DialogFooter","Button","onClick","form","theme","SuccessContent","as","href","CreateAlert","isInlined","isSubmitted","setIsSubmitted","DialogHeader","onCloseClick","handleFromSubmitted","PortfolioInput","portfolio","portfolioName","handleSelect","option","portfolioId","portfolios","Select","isHorizontalLabel","labelClassName","listProps","items","hasPopoverViewportHeightLimit","item","SelectOption","maxLength","PORTFOLIO_BASE_URL","transaction","PortfolioTransaction","PORTFOLIO_DATE_FORMAT_DATA","shares","TRANSACTION_OPTIONS","getTransactionsForSymbolType","PortfolioSymbolType","TRANSACTION_LABEL","setPortfolios","response","portfoliosRequest","p","fetchPortfolios","lastClose","lastCloseRequest","fetchLastClose","commonProps","validateEditRow","limitResponse","portfolioLimitRequest","transactions","limitTransactions","pid","createdPortfolioResponse","portfolioTickers","Error","portfolioEntry","submitForm","TransactionEditColumn","optionListProps","DateEditColumn","SharesEditColumn","inputClassName","CostPerShareEditColumn","portfolioUrl","SaveToPortfolio","setPortfolioUrl","ScreenerFilter","ScreenerAddtionalQuery","eventListenerRegister","el","eventName","handler","textContent","innerText","ScreenerRenderCustomModal","select","getAttribute","customWrapper","display","input","len","j","optionEl","ScreenerGetOptionsList","DATE_REGEX","getIsOptionDateRange","from","to","isValidFromDate","isValidToDate","getInitialDateFromSelectedValues","selectedValues","initialDate","dateRangeToFilterString","getQueryForView","view","allowedParams","baseQuery","allowList","delete","originalView","View","match","parseScreenerFilters","filtersString","Filters","fromEntries","f","lastUnderscore","lastIndexOf","stringifyScreenerFilters","filters","_ref2","String","_ref3","rangesToFilter","ranges","rangeSuffixes","delimiter","rangeDelimiter","range","index","currentFilter","SpecificChartFunctionality","getStaticChartConfig","timeframe","paneElements","specificChartFunctionality","default","colorsOverride","colors","getCustomColorsFromCookies","refreshData","barWidth","barMargin","scrollable","editable","charts","scale","leftOffset","instrument","stretch","panes","elements","getParsedCookies","cookieName","parseCookies","cookie","cookieString","acc","v","getCookie","re","RegExp","DEFAULT_OVERLAYS","getHoverChartUrl","escaped","hoverCharts","stock","dateRange","overlays","patterns","cs","t","tf","ct","r","tm","imgUrl","nodeChartsDomain","timeframeToDeprecatedTimeframe","timeframeString","getOldChartsUrl","oldPeriod","Instrument","cleanTicker","getHoverChartDimensions","getReferrerPolicy","getHoverChartImg","useOldCharts","hasForexFuturesCryptoNodeCharts","chartSize","referrerPolicy","url","srcSet","getSrcSet","srcsetString","img","hasUserRetinaNodeCharts","matchesAndroid","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","isMobileDevice","isIphone","isIpad","isSafariDesktop","isIos","hasPremarket","hasAftermarket","bufferMinutes","MARKET_START","minutes","MARKET_END","currentDayMinutes","premarketMinutes","PREMARKET_AFTERMARKET_HOURS","aftermarketMinutes","isWeekend","isOpen","isClosed","getSanitizedSingleTicker","rawTicker","specialTickers","getSanitizedTicker","isMulti","AdsProvider","getAdsProvider","adsProvider","Freestar","InvestingChannel","trackPageView","pathname","freestarPageView","gtag","freestar","queue","trackPageview","formatDateToStringUS","year","DRAWING_QUOTE_PAGE_COOKIE_NAME","getIsDrawingEnabledOnQuotePage","parseInitData","elementId","initDataElement","Sentry","captureException","getSidebarFromCookie","chartsUrl","sidebar","RedGreenText","rightContent","rightClass","hasValue","Icon","RedGreenMultiline","child","Table","TableHead","TableBody","spacing","TableFooter","TableAlign","TableCell","isFirst","isLast","align","Left","hasPadding","Center","Right","TableSortIndicator","isActive","direction","invisible","TableHeader","asComponent","hasHover","componentToRender","disabled","TableHeaderSortable","isDisabled","TableRow","isHoverable","SortDirection","getDefaultSort","columns","defaultSort","column","Ascending","isSortByShape","getDefaultSortFromUrl","idKey","isDesc","startsWith","queryParam","Descending","useTableSort","valueGetter","setSort","changeSort","newSort","prevSort","useSortData","sortBy","useTableSortWithUrl","urlPersistKey","sortedData","changeSortState","searchParams","setSearchParams","useSearchParams","defaultSortRef","newParams","previousOrder","isDescOrder","saveSortToUrl","preventScrollReset","BoxRounding","BoxTheme","Box","rounding","GroupTheme","ButtonGroup","hasDivider","hasBorder","childComponent","buttonRounding","ButtonRounding","groupTheme","dark","divider","getGroupTheme","role","BUTTON_DEFAULT_ELEMENT","BUTTON_BASE_CLASS","BUTTON_SQUARE_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","ButtonPadding","ButtonAlign","ButtonSquareSize","ButtonTheme","getButtonTheme","active","light","button","lightTransparent","blueHover","headerItem","icon","menuItem","menuItemDark","opacity","outline","chip","chipTransparent","ButtonComponent","focusRing","appearance","contentClass","leftContent","isSquare","buttonTheme","buttonPadding","buttonSize","hasIcons","isValidIconName","center","none","small","regular","medium","large","CheckboxComponent","defaultChecked","forwardRef","clamp","num","isTouch","getRelativePosition","pointer","touches","pageX","pageXOffset","pageY","pageYOffset","preventDefaultMove","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onTouchStart","onMouseDown","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","g","hexStringToHSVA","rgbaToHSVA","hexStringToHSLA","rgbaToHSLA","alphaToHex","alpha","rgbaToHexString","hsvaToHEXString","rgbaColor","hsvaToRGBA","hslaToHexString","hslaToRGBA","c","h","abs","l","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","parseInt","hslaToHSLAString","strColor","isValidColor","isRgb","Option","convertColorToHEX","getIsRgb","isAlphaAllowed","rgbKeys","getHSVAFromColor","stringifyHSVAColor","output","canSelectAlpha","getLumaFromRGBA","getIsColorTooLightOrTransparent","getHEXWithSpecificAplha","getRGBAValueFromValidColorString","Alpha","changeLightness","pos","gradientPreview","useMemo","backgroundImage","DEFAULT_COLORS","title","ColorPalette","lowerCaseColor","colorObj","isSelected","HueSaturation","position","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","isTooLight","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","colorValue","Input","ColorPicker","canSelectCustom","onPaletteItemClick","cachedColor","hsvaColor","setColor","currentColor","newColor","onChangeCallback","stringColor","onSetCustomCodeClick","prompt","_hex","orignalColor","InputColorPicker","inputDataTestId","popoverState","usePopoverState","PopoverTrigger","Popover","focusOnShow","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonColorPicker","buttonPickerDataTestId","hideOnClickOutside","onOverlayClick","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","visible","_ref4","_ref5","COMPONENT_ANIMATION_DURATION","CopyToClipboard","text","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","clearTimeout","setTimeout","Textarea","readOnly","DatePickerComponent","StatelessDatePicker","zIndex","isFullyClosed","getExtendedDialogState","triggerProps","ZIndexContext","fallback","Spinner","locale","minDetail","DatePicker","popover","Delayed","delay","throwOnTimeout","delayComponent","timeoutComponent","setVisible","hasTimedOut","setHasTimedOut","visibilityTimeout","failedTimeout","useZIndex","useDialogState","Reakit","animated","DialogDragContext","enabled","handleRef","boxPosition","resetBoxPosition","setBoxPosition","useDrag","dragging","handleElement","boxPositionRef","dragDiff","scrollX","scrollY","onMouseUp","onMouseMove","DialogBox","onUnmount","wrapperRef","setElementRef","useElementMeasure","dialogDrag","onResize","prevPosition","dialogBoxStyle","transform","DialogOverlay","isFullyOpened","animating","DialogType","DIALOG_BACKDROP_WIDTH_CSS_VAR","setProperty","Dialog","finalFocusRef","onHide","hideOnEsc","isDraggable","isBackdropDisabled","overlayClass","ariaLabel","DialogWrapper","modal","Portal","unstable_finalFocusRef","onTransitionEnd","onAnimationEnd","innerProps","drawer","getFlexAlignClasses","ChildPosition","Provider","scrollDivRef","scrollBox","disableBodyScroll","enableBodyScroll","ConfirmationDialog","actions","DialogTrigger","dropdownContext","DropdownContext","hasHorizontalPadding","hasMinHeight","asHeading","useDropdownState","context","loop","unstable_virtual","unstable_offset","DropdownComponent","isNested","isStatic","dropdownState","ContainerElement","buttonProps","orientation","Dropdown","NestedDropdownWrapper","parentState","itemProps","DropdownBar","DropdownItemComponent","subtitle","closeOnClick","hasSubmenu","iconTheme","DropdownItem","DropdownSeparator","MoreButtonDropdown","Component","iconList","add","SVG","viewBox","arrowDownShort","arrowForward","arrowUpShort","briefcase","fillRule","calendar","candleBarBasic","candleBarHeikinAshi","candleBarHollow","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","cx","cy","chartPie","chartTable","chartTreemap","chevronDown","chevronRight","close","darkMode","diamondOutlined","done","drag","draw","clipRule","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","info","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","lightMode","lineChartType","lock","menuClose","minus","more","note","ohlcChartType","palette","profile","publish","refresh","remove","restore","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","toolArrow","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","fill","stroke","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","xmlns","InputTheme","InputRounding","InputSize","getInputTheme","isError","navigationBar","InputComponent","caption","inputTheme","isLeftStringIcon","isRightStringIcon","inputSize","commonSideContentClassnames","Label","isHorizontal","InputCaption","TextareaComponent","textareaTheme","ListContext","useListState","ListItem","activeTheme","onSelectItem","onKeyPress","closeOnSelect","List","selectedIndex","includeBaseStyles","prevSelected","move","closeParent","findIndex","NotificationPosition","NotificationContext","show","useNotification","getViewport","visualViewport","offsetTop","offsetLeft","NotificationWrapper","notification","setNotification","viewport","setViewport","positionClass","WrapperComponent","inline","unstable_autoFocusOnShow","willChange","withNotificationContext","WrappedComponent","displayName","WithNotificationContext","notificationContext","Notification","timeoutId","timeoutInMs","focusOnHide","hasArrow","hasBackdrop","popoverWrapperStyle","popoverMaxHeight","MAX_SAFE_INTEGER","hasViewportHeightLimit","hasButtonWidthLimit","useWindowSize","isWatching","buttonElement","unstable_referenceRef","maxHeightStyle","usePopoverMaxHeight","maxHeightLimit","offsets","buttonRect","popoverId","popoverWrapper","unstable_autoFocusOnHide","TooltipArrow","DEFAULT_OFFSET","useHoverPopover","showTimeout","hideTimeout","clearTimeouts","showPopover","hidePopover","onMouseOver","onMouseOut","ComboBoxItem","selected","currentId","ComboBox","inputProps","popoverProps","inputTestId","autoFocus","focus","preventScroll","inputValue","INSTRUMENT_CATEGORIES","Centered","SearchError","link","resetErrorBoundary","Highlight","highlight","processedText","before","after","SearchItem","chartIndex","exchange","getRedirectForTicker","tickerRaw","redirectLink","getInstrumentForTicker","quoteSearchExt","SearchList","isLoading","useQuery","searchApiRequest","keepPreviousData","cacheTime","staleTime","setAnimated","isShowAllVisible","isSearchItemLink","onTickerSelected","setInputValue","currentValue","Search","isSearchIcon","reset","useQueryErrorResetBoundary","minValueLength","defaultValue","defaultPlacement","listState","category","setCategory","changeCategory","first","onInputKeyDown","stopPropagation","placeholder","autoCorrect","autoCapitalize","popoverClass","isMatchInputAndBoxWidth","allowCategorySwitching","ErrorBoundary","FallbackComponent","onReset","resetKeys","getSelectedItemIndex","useSelect","setSelectedIndex","closePopover","newIndex","onItemChange","selectedItem","reloadDocument","newUrl","URL","hash","SelectButton","isPopoverTrigger","themeProps","getButtonProps","popoverStateSettings","onIsInteractingChange","StatelessSelect","labelTitleClassName","buttonContent","isNativeMobileSelect","isAlwaysNativeSelect","hasPopoverButtonWidthLimit","showMobileSelect","isNativeSelect","NativeSelectComponent","useInRouterContext","NativeSelectInRouterContext","NativeSelect","titleClassName","relative","SelectList","SelectPlaceholder","SelectWithTooltip","tooltipLabel","unstable_timeout","isTooltipIgnored","visibilityState","activeElement","onSelectFocus","onSelectBlur","onFocus","isBlurAfterClick","showPlaceholder","handleNativeSelectChange","itemIndex","target","hidden","navigate","useNavigate","onChangeWithNavigate","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","PI","strokeDasharray","strokeDashoffset","strokeLinecap","DATERANGE_TOOLTIP","DateRangeSelect","dateRangeGroups","selectedDateRange","onDateRangeSelect","flatDateRanges","dateRanges","selectWithTooltipListProps","withReload","linkProps","Link","_createElement","LabelWithDelayedSpinner","TIMEFRAME_TOOLTIP","TimeframeSelect","timeFrameGroups","selectedTimeframe","favoriteTimeframes","isCompactView","isCompactOnly","onTimeframeSelect","onFavoriteTimeframeToggle","isFavoritesEnabled","flatTimeframes","timeframes","getSelectedTimeframeLabel","selectedTimeframeItem","labelShort","groupIndex","isIconButtonActive","getTimeframeChipElementId","getButtonPadding","TimeframeBar","compactViewMaxBreakpointPx","loadingTimeframe","isDateRangeAvailable","containerElement","isScrollIntoViewEnabled","isTimeframeSelectEnabled","scrollWrapperElement","setScrollWrapperElement","timeframeButtonsScrollLocation","setTimeframeButtonsScrollLocation","isOnLeftEdge","isOnRightEdge","elementWidth","timeframesInExpandedPanel","checkTimeframeWrapperScrollPosition","scrollLeft","ceil","offsetWidth","scrollWidth","timeframeElement","scrollTo","onScroll","onWheel","absDx","generateTimeframeGroups","premiumTimeframes","TIMEFRAME","labelPageTitle","freeTimeframes","getTimeframeGroups","generateDateRangeGroups","isStock","DateRangeType","getDateRangeGroups","customRange","isCustomAvailable","rangeGroups","dateRangePrefix","DATE_RANGE_PREFIX_DELMITER","CustomDateRangePrefixEnum","CUSTOM_DATE_RANGE","getDateRangeGroupsWithHref","generatePath","dateRangeGroup","FREE_PERIODS_STOCK","generatePathForTimeframeDateRange","utmCampaign","dateRangeQueryKey","utm_source","utm_medium","utm_campaign","timeframeUtm","daterangeUtm","getParsedDateRange","parseCustomDateRangeUrlParam","anchorDate","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","start","end","Prev","years","months","days","getCustomStartEndDateRangeUrlParam","startString","endString","getPrevPeriodDateRangeUrlParam","getTimeframeForDateRangeType","_ref6","getTimeframeFromDateRange","_ref7","dateRangeTimeframe","startNyTime","startToReferenceDateNumOfDays","rangeNumOfDays","DATE_PICKER_MIN_DATE","YEARS_MAX_VALUE","TAB_BUTTON_COMMON_PROPS","CustomRangeType","DEFAULT_MANUAL_RANGE","kind","Manual","DEFAULT_START_END_RANGE","StartEnd","CustomDateRange","dialogState","onDialogSubmit","isFetching","selectedTab","setSelectedTab","getDefaultSelectedTab","getDefaultSelectedDate","newValue","prevState","newState","newEnd","isAbsolute","fromDate","toDate","manualRange","isValidStartEndRangeState","isValidManualRangeState","minDate","useCustomDateRangeDialog","pathGenerator","shouldReloadOnNavigate","customDateRangeDialogState","handleDateRangeSelect","callback","path","getDateRangeTimeframe","newTimeframe","TIMEFRAME_FAVORITE_DEFAULTS","TIMEFRAME_FAVORITE_DEFAULTS_FREE","intraday","LOCAL_STORAGE_KEY","useFavoriteTimeframes","useSyncLocalStorage","toggleFavoriteTimeframe","TooltipInputWrapper","tooltipSettings","isHideOnClickOutside","TooltipInputComponent","TooltipBox","TooltipColor","tooltipProps","onMouseEnter","onMouseLeave","HTMLElement","blur","transformMap","auto","positionMain","arrowColor","getHeadingElement","CRYPTO_TICKERS","useIsMounted","isMountedRef","getIsMounted","elementOverride","elementRef","setElementWidth","setElementHeight","offsetHeight","measureElement","newElementWidth","newElementHeight","measureElementDebounced","debounce","resizeObserver","cancel","lastFocusedElement","errorInputToFocus","querySelector","MAX_HEIGHT_PROPERTY","POPOVER_HEIGHT_LIMIT_STYLE","maxHeight","elementMaxHeight","controller","AbortController","setResizeObserver","loadResizeObserverPolyfill","then","polyfill","signal","aborted","abort","getDefaultValueGetter","getValueForSort","sortByColumn","storageKey","storage","subscription","unsubscribe","useTrackPageView","trackInitial","trackAutomatically","initialRender","useLocation","handleTrackView","tracking","throttleWaitInMs","setSize","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","popperElement","setPopperElement","virtualRef","toJSON","getVirtualRef","hasBeenOpen","styles","attributes","usePopper","modifiers","offset","popper","ContextMenuDropdown","ContextMenuInner","innerState","menu_option","ChartGridCell","gridArea","GridLayout","rows","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","valueKey","changeKey","valueAccessor","visibleColumns","getColumnsByKeys","ColumnId","sortableColumns","columnMap","IS_MOBILE","isElementOverflowing","columnValueGetter","RowKind","PortfolioWatchlistTable","handleTickerSelect","chartTicker","selectedPortfolio","isSelectClosed","tableOrder","handleOrderChange","stockRows","group","tableSort","selectedRow","setSelectedRow","setContainerElement","rowElement","handleKeyUp","dataset","handleTableMouseMove","handleSortChange","prevSibling","previousElementSibling","nextSibling","nextElementSibling","firstElement","parentElement","firstElementChild","lastElement","lastElementChild","scrollIntoView","onKeyUp","renderColumn","RangeSize","RangeSlider","step","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","ToolbarTheme","ToolbarDirection","ToolbarContext","vertical","isWrapped","isStretched","useToolbarContext","Toolbar","toolbarRef","contextProviderValue","alternative","horizontal","toolbarSettings","hasRedesignEnabled","getToolbarSettings","forceReflow","originalWidth","ToolbarButton","disabledTooltip","isInAction","isInActionProp","iconAction","buttonSettings","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","titleActive","ToolbarGroup","defaultItem","groupItems","groupTitle","useNativeSelect","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","ToolbarItem","isItemActive","ToolbarDivider","StepContent","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","getStepButtons","tour","action","complete","classes","back","backButton","next","nextButton","processSteps","steps","attachTo","on","popperOptions","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","getTourKey","getStepsForUser","tours","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","skip","toursToView","hasNewTours","initialTour","completeTour","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","loadingSetter","startTour","definition","setComplete","tourUtils","Tour","removeStep","processedSteps","addSteps","event_label","win","components","buttonGroup","checkbox","colorPicker","contextMenu","copyToClipboard","delayed","dialog","datePicker","dropdown","grid","list","spinner","timeframeBar","toolbar","tooltipInput","typography","saveToPortfolio","createAlert","FLibs","ReactRouterDOM","nice","scaleLinear","scaleSymlog","DateFns","addBusinessDays","differenceInCalendarDays","eachDayOfInterval","endOfDay","intervalToDuration","isSameMonth","isSameWeek","isWithinInterval","startOfDay","startOfYear","sub","subMonths","subYears","assets","logo","logo_light","MAX_PRICE","setIsInteracting","usePortfolioBulkEditRowContext","getNumberValue","isNaNValue","showError","updateOnChange","numberValue","DateEditColumnWithPicker","pickerState","pickerExtendedState","tooltipState","tooltipExtendedState","wrapperProps","isInteractingWithDateInput","onDateChange","dateValue","parsedDate","parseInputAsDate","picker","inputElement","checkFormat","PORTFOLIO_DATE_FORMAT_VIEW","MAX_SHARES","sharesValue","transactionOptions","symbolType","getSymbolType","PortfolioBulkEditRowContext","setIsInView","isInteracting","isInView","freeze","urlSort","args","isDelisted","formatNumber","costAvg","prevClose","lastChange","showPlusSign","fractions","lastChangePct","lastVolume","valuePaid","valueMarket","gainMarketUsd","gainMarketPct","gainTodayUsd","PORTFOLIO_CASH_SYMBOL","PORTFOLIO_REFRESH_INTERVAL_ELITE","PORTFOLIO_REFRESH_INTERVAL_FREE","STOCK_TRANSACTIONS","CASH_TRANSACTIONS","EMPTY_FORM_ENTRY","EMPTY_TRANSACTION","valueMarketPrev","gainMarket","PORTFOLIO_INPUT_NAME","PORTFOLIO_INPUT_EMPTY_ERROR","PORTFOLIO_INPUT_EXISTS_ERROR","TICKERS_INPUT_NAME","TICKERS_INPUT_FORMAT_TIP","EMPTY_RESPONSE","limit","portfolioData","apiRequest","deletePortfolio","method","QUOTE_INVALID_TICKER_REQUEST","QUOTE_INVALID_TICKER_RESPONSE","quoteData","headers","ContentType","parsedTickers","specialSymbols","recalculatePortfolio","numberOfTransactions","totalValue","pricePerColumn","prices","captureMessage","extra","requestTickers","requestTickersLength","responseLength","tickerPrices","tickerPrice","NaN","calculatedPrice","calculatedShares","ErrorSource","portfolio_name","submitEditForm","reorderPortfolios","PortfolioQuery","PortfolioMapSizeKey","PortfolioView","PortfolioTableView","PortfolioTableViewLabels","Ticker","Trade","ActionKind","PortfolioDataKey","industryLabelKey","groupPrefix","groupLabel","DEFAULT_SETTINGS","tableView","showMap","showIndustries","parseBoolFromValue","getMapSettingFromLocalStorage","savedSettings","saveMapSettingToLocalStorage","itemToStore","customTickersOrder","SUMMARY_DEFAULT","valueMarketStocks","valueMarketStocksPrev","getSummary","flattenAndDedupe","isMapTransaction","previouslyAdded","newEntry","prevEntry","getIndustries","groupByKey","getPerfForTicker","groupByIndustry","hasData","parsedData","gain","Cash","ShortGainers","ShortLosers","LongGainers","LongLosers","getEntryGroup","subtypePerf","getPerfText","perfText","perfWeek","groupName","isLong","isGainer","longPrefix","shortGainers","shortLosers","shortPrefix","longGainers","longLosers","createGroup","parsePortfolioQuery","params","defaultPortfolioId","currentPortfolio","getFormattedDate","dateFormat","FORM_ENTRY_KEYS","getBulkEditData","existingId","getUuid","resetCash","getNewTransaction","uuid","serializeFormData","serializer","append","appendRowToFormData","validateFormData","validateFields","api","validationResult","hasInvalidEntries","isInvalidTicker","allowedTransactions","getPortfolioInitData","returnData","isInitData","initData","getTradesStructureData","symbol","getPortfolioRefreshInterval","parseResponseForContentType","contentType","ApplicationJson","ApplicationJsonUTF","FormUrlEncoded","ThrowableError","status","isServerError","super","throwOnAllErrors","requestUrl","requestOptions","request","cancelableRequest","textResponse","responseContentType","Html","parsedResponse","ok","statusText","rayId","catch","scope","setContext","fields","emitter","subscribeToChanges","changeCallback","EventEmitter","getValue","setValue","onStorageChange","addListener","removeListener","emit","valueToStore","Function","removeValue","removeItem","migrateValue","transformValue","oldValue","compilePath","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toSearch","validate","toQuote","toContact","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toFuturesChartDetail","toForex","toForexPerf","toForexCharts","toForexChartDetail","toCrypto","toCryptoPerf","toCryptoCharts","toCryptoChartDetail","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","lazyLoadComponent","chunkName","load","componentLoader","lazy","cleanedTicker","resizeObserverPolyfill","getIsBrave","brave","isBrave","topLeft","bottomLeft","leftCenter","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","getIntl","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","shortFormatNumber","suffix","formatted","fixedValue","toFixed","prefix","valueA","valueB","localeCompare","sortNullAsLast","ignoreNullForComparison","moveItemInArray","sourceIndex","destinationIndex","removed","splice","crypto","randomUUID","getRandomValues","Uint8Array","revalidateOnQueryChange","prevParams","currentUrl","nextParams","nextUrl","requiredChanged","otherChanged","defaultShouldRevalidate","parseRouteInitData","removeElement","initialData"],"sourceRoot":""}