{"version":3,"file":"main.js","mappings":"yBAAA,MAAMA,YAAc,CAClBC,UAAWC,OAAOC,WAAa,IAAM,IAAM,IAC3CC,mBAAoB,YAAaC,iBAAiBC,UAClDC,oBAAqB,YAAaC,kBAAkBF,UAEpDG,iBAAkB,SAASC,SACzB,IAAIA,QAAQC,aAAa,SAAUD,QAAQC,aAAa,UAmBxD,OAdID,QAAQC,aAAa,aACvBD,QAAQE,aAAa,MAAOF,QAAQG,aAAa,aAG/CH,QAAQC,aAAa,gBACvBD,QAAQE,aAAa,SAAUF,QAAQG,aAAa,gBAGlDH,QAAQC,aAAa,eACvBD,QAAQE,aAAa,QAASF,QAAQG,aAAa,eAGrDH,QAAQE,aAAa,oBAAoB,IAElC,CACT,EAEAE,OAAQ,WAMN,OAJKC,KAAKX,oBAAuBW,KAAKR,qBACpCL,OAAOc,iBAAiBF,SAGnBd,YAAYiB,MACrB,EAEAA,KAAM,WACJ,MAAMC,WAAaC,SAASC,iBAAiB,YACvCC,YAAcF,SAASC,iBAAiB,eA6B9C,GA3BIpB,YAAYI,oBACdc,WAAWI,SAAQC,QACjBvB,YAAYS,iBAAiBc,MAAK,IAIlCvB,YAAYO,qBACdc,YAAYC,SAAQE,SAClBxB,YAAYS,iBAAiBe,OAAM,IAKnCxB,YAAYI,qBAAuBJ,YAAYO,qBACjDW,WAAWI,SAAQC,QACjBA,MAAME,UAAUC,OAAO,OAAM,KAI5B1B,YAAYI,oBAAsBJ,YAAYO,qBACjDc,YAAYC,SAAQE,SAClBA,OAAOC,UAAUC,OAAO,OAAM,KAM7B1B,YAAYI,qBAAuBJ,YAAYO,oBAAqB,CACvE,MAAMoB,OAASR,SAASS,cAAc,UACtCD,OAAOf,aAAa,SAAS,GAC7Be,OAAOE,IAAM,+BACbV,SAASW,KAAKC,YAAYJ,QAE1BzB,OAAO8B,gBAAkB,CACvBC,kBAAmB,QACnBhC,UAAWD,YAAYC,WAGzBC,OAAOgC,iBAAiB,yBAAyBC,QAC/CjC,OAAOc,iBAAmBmB,MAAMC,OAAOC,WACtC,CAAEC,SAAS,GAChB,CAEA,OAAOpC,OAAOqC,SAAWvC,WAC3B,GAGF,4BCvEA,iBAjBqB,CACnBiB,KAAM,WACJ,MAAMuB,SAAWrB,SAASC,iBAAiB,oDACrCqB,SAAW,IAAIC,sBAAqBC,UAExC,GADqBA,QAAQC,QAAOC,QAAW,GAAIA,MAAMC,eAAgB,OAAOD,SAC/DE,OAAS,EAAG,CAC3B,MAAMC,SAAW7B,SAASS,cAAc,UACxCoB,SAASnB,IAAM3B,OAAO+C,eACtB9B,SAASW,KAAKC,YAAYiB,UAC1BP,SAASS,YACX,KAGF,OAAOV,SAASlB,SAAQ6B,UAAaV,SAASW,QAAQD,QAAO,GAAK,CAAElD,UAAW,IACjF,GCVK,SAASoD,SAASC,OAAQC,gBAC/B,IAAKD,QAAqB,KAAXA,OAAe,OAAOE,QAAQC,MAAM,mCAEnD,GAAIH,OAAOI,SAAS,OAAQ,CAC1B,MAAMC,UAAYxC,SAASS,cAAc,UAOzC,OANA+B,UAAU/C,aAAa,MAAO0C,QAE1BC,gBAA4C,mBAAnBA,iBAC3BI,UAAUC,OAASL,gBAGdpC,SAASW,KAAKC,YAAY4B,UACnC,CAAO,GAAIL,OAAOI,SAAS,QAAS,CAClC,MAAMG,QAAU1C,SAASS,cAAc,QAIvC,OAHAiC,QAAQjD,aAAa,MAAO,cAC5BiD,QAAQjD,aAAa,OAAQ,YAC7BiD,QAAQjD,aAAa,OAAQ0C,QACtBnC,SAAS2C,KAAK/B,YAAY8B,QACnC,CAAO,CACL,MAAMJ,MAAQ,kHACd,OAAOD,QAAQC,MAAMA,MAAOH,OAC9B,CACF,CAwBO,SAASS,eAAeC,MAC7B,MAAMC,SAAW,IAAIC,SAASF,MACxBG,KAAO,CAAC,EAEd,IAAK,MAAOC,KAAMC,SAAUJ,SAC1BE,KAAKC,MAAQC,MAGf,MAAMC,SAAW,GAEjB,IAAK,MAAMC,OAAOJ,KAAM,CACtB,MAAMK,UAAYC,mBAAmBF,KAC/BG,YAAcD,mBAAmBN,KAAKI,MAC5CD,SAASK,KAAK,GAAGH,aAAaE,cAChC,CAEA,OAAOJ,SAASM,KAAK,IACvB,CA6LO,SAASC,YAAYR,OAE1B,MACE,MACAA,MACGS,QAAQ,GACRC,QAAQ,IAAK,KACbA,QAAQ,sBAAuB,MAEtC,CAwKOC,eAAeC,eAAeC,YACnC,MAAMC,WAnZDH,iBACL,IACE,MAAMI,eAAiBC,MAAM,YAAa,CACxCC,QAAS,CACPC,OAAQ,sBAIZ,aAAaH,SAASI,MACxB,CAAE,MAAO/B,OAGP,OAFAD,QAAQC,MAAM,uCACdD,QAAQC,MAAMA,QACP,CACT,CACF,CAqYqBgC,GACnB,IAAKN,KAAM,OAEX,MAAMO,UAAYP,KAAKQ,MAEvB,GAAID,UAAY,EAAG,OAEnB,MAAME,SAAWzE,SAAS0E,cAAc,uBACxC,IAAKD,SAAU,OAEf,MAAME,SAAWF,SAAS/E,aAAa,cACjCkF,mBAAqBH,SAAS/E,aAAa,mBACjD,IAAImF,eAAiB,EAEjBC,WAAaH,SAAWJ,UACxBQ,cAA6B,IAAZR,UAAmBI,SACxCI,cAAgBA,cAAgB,IAAM,IAAMA,cAC5CD,WAAaA,WAAa,EAAI,EAAIA,WAElCL,SAAShF,aAAa,iBAAkBqF,YACxCL,SAASO,MAAMC,YAAY,aAAc,GAAGF,kBAE5CF,eAAiBN,WAAaK,mBAAqB,KACnDE,WAAapB,YAAYoB,YAGrBf,YAQC,SAA2BC,KAAMD,WAAYe,WAAYD,eAAgBE,cAAeN,UAC7F,IAAIS,cAAgB,KAGpB,MAAMC,qBAAuBpB,WAAWW,cACtC,mGAIIU,mBAAqBrB,WAAWW,cAAc,6BAGpD,GAAIU,mBACF,GAAIpB,KAAKqB,MAAMzD,OAAS,EAAG,CACzB,MAAM0D,uBAAyBF,mBAAmBV,cAAc,KAChEY,uBAAuB7F,aAAa,uBAAwB,QAG1D6F,uBAAuBC,UADrBR,cAAgB,IACiB,UAAUD,wDAEV,eAAepB,YAAYmB,8BAElE,MAEEM,qBAAqBK,YAAYJ,yBAI1BD,sBAAwBnB,KAAKqB,MAAMzD,OAAS,IACrDsD,cAAgBT,SAASgB,WAAU,GAQhC,SAAwBN,qBAAsBD,cAAeJ,YAClE,GAAqB,MAAjBI,cAAuB,CACzBA,cAAczF,aAAa,uBAAwB,QAEnD,MAAMiG,kBAAoBR,cAAcR,cAAc,KACtDgB,kBAAkBjG,aAAa,uBAAwB,QACvDiG,kBAAkBH,UAAY,UAAUT,2CACxCK,qBAAqBvE,YAAYsE,cACnC,CACF,CAhBIS,CAAeR,qBAAsBD,cAAeJ,YAExD,CAvCIc,CAAkB5B,KAAMD,WAAYe,WAAYD,eAAgBE,cAAeN,SAEnF,CC7cA,MAAMoB,WAAa,CACjBC,KAAM9F,SAAS0E,cAAc,+BAC7BqB,QAAS/F,SAASC,iBAAiB,sBACnC+F,aAAchG,SAAS0E,cAAc,qBACrCuB,SAAUlH,OAAOmH,qBAAsB,EAEvCC,cAAe,WACb,MAAM,SAAEF,SAAQ,KAAEH,MAASD,WAE3B,IAAKC,OAASG,SAAU,OAGxB,MAAMG,aAAgBH,SAASI,kBAAoB,EAAKJ,SAASI,kBAAoB,EAG/EC,oBAAsB,IAAIC,KAAKC,UAAUX,WAAW,CACxDY,OAAQ,QACRC,QAAS,OACTC,WAAW,EACXC,UAAW,sBACXC,4BAA4B,EAC5BT,4BAIFE,oBAAoBQ,OAAOhB,MAG3B/G,OAAOmH,mBAAmBhF,SAAWoF,oBACrCT,WAAWI,SAAWlH,OAAOmH,mBAG7BJ,KAAKiB,cAAc,IAAIC,MAAM,2BAC/B,EAEAC,cAAe,WACb,MAAM,SAAEhB,UAAaJ,WACrB3D,SAAS+D,SAASzF,OAAQqF,WAAWM,eACrCjE,SAAS+D,SAASiB,OACpB,EAEAC,iBAAkB,SAASC,QAErBA,OAAO9G,UAAU+G,SAAS,cAK9BD,OAAO9G,UAAUgH,IAAI,YACrBzB,WAAW0B,MAAK,KAAQH,OAAO9G,UAAUC,OAAO,WAAU,IAC5D,EAEAgH,KAAM,SAAUC,UAEd,MAAM,KAAE1B,MAASD,WAGb9G,OAAO0I,OAAO1I,OAAO0I,MAAMC,QAG1B7B,WAAWI,SAAS/E,UAAU2E,WAAWoB,iBAGT,IAAjCpB,WAAWI,SAAS/E,SACtB4E,KAAK/E,iBAAiB,2BAA2B,KAC/C8E,WAAWI,SAAS/E,SAASyG,OACL,mBAAbH,UAAyBA,UAAS,KAI/C3B,WAAWI,SAAS/E,SAASyG,OACL,mBAAbH,UAAyBA,WAExC,EAEAI,aAAc/D,iBACZ,IACE,MAAMI,eAAiBC,MAAM,mBAE7B,aADoBD,SAASI,MAG/B,CAAE,MAAO/B,OACPD,QAAQC,MAAM,uDACdD,QAAQC,MAAMA,MAChB,CACF,EAEAuF,gBAAiBhE,eAAgBiE,YAAc,MAC7C,IAAIzC,MAAQyC,YACO,MAAfA,cAAqBzC,YAAcQ,WAAW+B,gBAElDhI,KAAKoG,aAAaT,UAAYF,KAChC,EAEAvF,KAAM,WACJ,MAAMiI,MAAQnI,MACR,QAAEmG,SAAYgC,MAGpBA,MAAMF,kBAEF9B,QAAQnE,OAAS,GAAGmE,QAAQ5F,SAAQiH,SACtCA,OAAOrG,iBAAiB,SAAS,KAC/BgH,MAAMZ,iBAAiBC,OAAM,GAC9B,GAEL,GAGF,0BC9FA,WAjBe,CACbY,cAAe,WACb,MAAMC,MAAQjI,SAASC,iBAAiB,sCAExCgI,MAAMrG,OAAS,GAAKqG,MAAM9H,SAAS+H,OACjCA,KAAKnH,iBAAiB,SAAS,KAC7BmH,KAAK5H,UAAU6H,OAAO,SAAUD,KAAK5H,UAAU+G,SAAS,SAAS,GACjE,GAEN,EACAvH,KAAM,WACUF,KAERoI,eACR,GC8DF,WA5Ee,CACbI,eAAgB,EAChBC,UAAWtJ,OAAOuJ,QAClBC,OAAQvI,SAAS0E,cAAc,WAE/B8D,UAAW,SAAUH,UAAWD,eAC9B,MAAML,MAAQnI,KAEVyI,WAAa,GACfN,MAAMQ,OAAOjI,UAAUgH,IAAI,aAC3BS,MAAMQ,OAAOjI,UAAUC,OAAO,eAC9BwH,MAAMQ,OAAOjI,UAAUgH,IAAI,YAEvBS,MAAMQ,OAAOjI,UAAU+G,SAAS,WAClCU,MAAMQ,OAAOjI,UAAUC,OAAO,UAE5B8H,UAAYD,eACdL,MAAMQ,OAAOjI,UAAUgH,IAAI,eAC3BS,MAAMQ,OAAOjI,UAAUC,OAAO,eAE9BwH,MAAMQ,OAAOjI,UAAUgH,IAAI,aAC3BS,MAAMQ,OAAOjI,UAAUC,OAAO,gBAGpC,EAEAkI,aAAc,WACZ,MAAMA,aAAezI,SAAS0E,cAAc,oCACtCgE,kBAAoB1I,SAAS0E,cAAc,oCAC3CiE,WAAa3I,SAAS0E,cAAc,kBACpCkE,gBAAkB5I,SAAS0E,cAAc,wBAE1CiE,aAELF,cACEA,aAAa1H,iBAAiB,SAAS,KACrC4H,WAAWrI,UAAU6H,OAAO,WAAYQ,WAAWrI,UAAU+G,SAAS,YAEtEuB,iBAAmBA,gBAAgBC,QAE/B9J,OAAOC,WAAa,KACtBgB,SAASe,iBAAiB,UAAU,KAClC4H,WAAWrI,UAAUC,OAAO,UAAU,GAE1C,IAGJmI,mBACEA,kBAAkB3H,iBAAiB,SAAS,KAC1C4H,WAAWrI,UAAUC,OAAO,UAAU,IAI1CoI,WAAW5H,iBAAiB,SAAU+H,IACV,yBAAtBA,EAAEC,OAAOC,WACXL,WAAWrI,UAAUC,OAAO,UAC9B,IAEJ,EAEAT,KAAM,WACJ,MAAMiI,MAAQnI,KAEdmI,MAAMS,UAAUT,MAAMM,UAAWN,MAAMK,eACvCL,MAAMU,eAGN1J,OAAOgC,iBAAiB,UAAU,WAChC,MAAMkI,MAAQlK,OAAOuJ,QAErBP,MAAMS,UAAUS,MAAOlB,MAAMK,eAC7BL,MAAMK,cAAgBa,KACxB,GACF,GCvEF,MAAMC,SAAW,CACfC,cAAetF,eAAgBhB,KAAMuG,OACnC,MAAMtG,SAAWF,eAAeC,MAC1BwG,eAAiBxG,KAAK6B,cAAc,WAAWa,UAQrD,QANoB,IAAT6D,OAAiC,IAATA,QACjCA,MAAQvG,KAAK6B,cAAc,kBAAkBxB,OAG/CL,KAAK6B,cAAc,qBAAqBxB,MAAQkG,OAE3CvG,KAAKvC,UAAU+G,SAAS,WAAY,CAEvCxE,KAAKvC,UAAUgH,IAAI,WACnBzE,KAAKvC,UAAUC,OAAO,SACtBsC,KAAK6B,cAAc,WAAWa,UAAY,WAE1C,IACE,MAAMtB,eAAiBC,MAAM,WAAY,CACvCoF,OAAQ,OACRnF,QAAS,CACP,eAAgB,oDAElBxD,KAAMmC,WAGR,GAAImB,SAASsF,GACXlH,QAAQmH,KAAK,kCACb3G,KAAKvC,UAAUgH,IAAI,QACnBzE,KAAK6B,cAAc,gBAAgBpE,UAAUgH,IAAI,YACjDzE,KAAK6B,cAAc,WAAWa,UAAY,UAC1C1C,KAAK4G,QAELC,YAAW,WACT7G,KAAKvC,UAAUC,OAAO,QACtBsC,KAAK6B,cAAc,gBAAgBpE,UAAUC,OAAO,YACpDsC,KAAK6B,cAAc,WAAWa,UAAY8D,cAC5C,GAAG,UACE,CAEL,MAAMM,WAAa1F,SAAS0F,OAE5BtH,QAAQC,MAAM,gDAAgD2B,SAAS2F,UACvEvH,QAAQC,MAAMqH,MAEd9G,KAAKvC,UAAUgH,IAAI,SACnBzE,KAAK6B,cAAc,cAAcpE,UAAUgH,IAAI,YAC/CzE,KAAK6B,cAAc,WAAWa,UAAY,kBAE1CmE,YAAW,WACT7G,KAAKvC,UAAUC,OAAO,SACtBsC,KAAK6B,cAAc,cAAcpE,UAAUC,OAAO,YAClDsC,KAAK6B,cAAc,WAAWa,UAAY8D,cAC5C,GAAG,KAEL,CAEF,CAAE,MAAO/G,OACPD,QAAQC,MAAM,4BACdD,QAAQC,MAAMA,OAEdO,KAAKvC,UAAUgH,IAAI,SACnBzE,KAAK6B,cAAc,cAAcpE,UAAUgH,IAAI,YAC/CzE,KAAK6B,cAAc,WAAWa,UAAY,kBAE1CmE,YAAW,WACT7G,KAAKvC,UAAUC,OAAO,SACtBsC,KAAK6B,cAAc,cAAcpE,UAAUC,OAAO,YAClDsC,KAAK6B,cAAc,WAAWa,UAAY8D,cAC5C,GAAG,KACL,CAEAxG,KAAKvC,UAAUC,OAAO,UACxB,CACF,EACAsJ,aAAchG,eAAgBhB,MAC5B,MAAMC,SAAWF,eAAeC,MAC1BiH,eAAiBjH,KAAK6B,cAAc,WAAWa,UAErD,IAAK1C,KAAKvC,UAAU+G,SAAS,WAAY,CAEvCxE,KAAKvC,UAAUC,OAAO,SACtBsC,KAAKvC,UAAUgH,IAAI,WACnBzE,KAAK6B,cAAc,WAAWa,UAAY,WAE1C,IAEE,MAAMtB,eAAiBC,MAAM,mBAAoB,CAC/CoF,OAAQ,OACRnF,QAAS,CACP,eAAgB,oDAElBxD,KAAMmC,WAGR,GAAImB,SAASsF,GACX1G,KAAKvC,UAAUC,OAAO,WAGtB8B,QAAQ0H,IAAI,uCACZb,SAASC,cAActG,UAElB,CACL,MAAM8G,WAAa1F,SAAS0F,OAC5BtH,QAAQC,MAAM,mEAAmE2B,SAAS2F,UAC1FvH,QAAQC,MAAMqH,MAEd9G,KAAKvC,UAAUgH,IAAI,SACnBzE,KAAK6B,cAAc,cAAcpE,UAAUgH,IAAI,YAC/CzE,KAAK6B,cAAc,WAAWa,UAAY,kBAE1CmE,YAAW,KACT7G,KAAKvC,UAAUC,OAAO,SACtBsC,KAAK6B,cAAc,cAAcpE,UAAUC,OAAO,YAClDsC,KAAK6B,cAAc,WAAWa,UAAYuE,cAAc,GACvD,KACL,CAEF,CAAE,MAAOxH,OACPD,QAAQC,MAAM,0DACdD,QAAQC,MAAMA,OAEdO,KAAKvC,UAAUgH,IAAI,SACnBzE,KAAK6B,cAAc,cAAcpE,UAAUgH,IAAI,YAC/CzE,KAAK6B,cAAc,WAAWa,UAAY,kBAE1CmE,YAAW,KACT7G,KAAKvC,UAAUC,OAAO,SACtBsC,KAAK6B,cAAc,cAAcpE,UAAUC,OAAO,YAClDsC,KAAK6B,cAAc,WAAWa,UAAYuE,cAAc,GACvD,KACL,CAEAjH,KAAKvC,UAAUC,OAAO,UACxB,CACF,EACAyJ,YAAa,SAAUC,MAAOpH,MAC5B,MAAMqH,aAAerH,KAAK6B,cAAc,cAExCwF,aAAa5J,UAAUgH,IAAI,YAC3B4C,aAAaC,UAAY,kCAEzBF,MAAM3J,UAAUgH,IAAI,aAEpBoC,YAAW,KAETQ,aAAa5J,UAAUC,OAAO,YAC9B2J,aAAaC,UAAY,GAEzBF,MAAM3J,UAAUC,OAAO,YAAW,GAEjC,IAEL,EACA6J,aAAc,SAAUC,UAAWxH,MACjC,IAAIyH,eAAgB,EAGpB,GAAuB,IAAnBD,UAAUnH,MAAa,CACzBmH,UAAU5K,aAAa,YAAY,GAGZoD,KAAK5C,iBAAiB,oCAC9BE,SAAQ8J,QAEF,IAAfA,MAAM/G,QACRoH,eAAgB,EAChBpB,SAASc,YAAYC,MAAOpH,OAGZ,YAAdoH,MAAMM,MAAuC,GAAjBN,MAAMO,UACpCF,eAAgB,EAChBpB,SAASc,YAAYC,MAAOpH,MAC9B,IAIEyH,gBAA0B,eAAXzH,KAAK4H,GAAsBvB,SAASW,aAAahH,MAAQqG,SAASC,cAActG,MACrG,CACF,EACA6H,YAAa,WACX,MAAMC,SAAW3K,SAASC,iBAAiB,kBAE3C0K,SAAS/I,OAAS,GAAK+I,SAASxK,SAAQ0C,OAEtC,MAAMuE,OAASvE,KAAK6B,cAAc,UAC5BkG,SAAW/H,KAAK6B,cAAc,YAGpC,IAAI2F,UAAYxH,KAAK6B,cAAc,sBACnC2F,UAAUtJ,iBAAiB,SAAS,IAAM6J,SAASnL,aAAa,YAAY,KAG5E2H,QAAUA,OAAOrG,iBAAiB,SAAS,IAAMmI,SAASkB,aAAaC,UAAWxH,QAClFuE,QAAUA,OAAOrG,iBAAiB,YAAa+H,IAC/B,UAAVA,EAAE1F,KAAiB8F,SAASkB,aAAaC,UAAWxH,KAAK,GAC9D,GAGL,EACA/C,KAAM,WACUF,KACR8K,aACR,GAGF,sBC3MO,MAAMG,oBAAsB,CACjC/E,KAAM9F,SAAS0E,cAAc,oCAC7BuB,SAAUlH,OAAO+L,0BAA2B,EAC5CC,QAAQ,EAERC,mBAAoB,WAClB,MAAM,SAAE/E,SAAQ,KAAEH,MAAS+E,oBAG3B,IAAII,SAAWhF,SAASgF,SACpBC,SAAWjF,SAASiF,SACpBC,MAAQlF,SAASkF,MACjBC,YAAcnF,SAASmF,YACvBC,iBAAmBpF,SAASoF,iBAC5BC,UAAYrF,SAASqF,UACrBC,eAAiBtF,SAASuF,QAGG,IAAIjF,KAAKC,UAAUiF,gBAAgB,CAClER,SAAUA,SACVC,SAAUA,SACVQ,cAAe,OACfC,cAAe,SACfR,MAAOA,MACPC,YAAaA,YACbC,iBAAkBA,iBAClBO,cAAe,SACfC,eAAgB,oBAChBC,QAAS,GAAGR,uBACZS,cAAc,EACdC,kBAAkB,EAClBC,qBAAqB,EACrBC,eAAe,EACfX,eAAgBA,eAChBY,MAAO,IACPC,UAAW,IACXC,SAAU,QACVC,aAAc,CAIZlD,MAAO,wBAKctC,OAAOhB,MAChC+E,oBAAoBE,QAAS,CAC/B,EAEAwB,oBAAqB,WACnB,IAAK1B,oBAAoBE,OAAQ,CAC/B,MAAM,SAAE9E,UAAa4E,oBACrB3I,SAAS+D,SAASzF,OAAQqK,oBAAoBG,oBAC9C9I,SAAS+D,SAASiB,OACpB,CACF,EAEApH,KAAM,WACJ,MAAM,KAAEgG,KAAI,SAAEG,UAAarG,KAE3B,IAAKkG,OAASG,SAAU,OAExB,MAAMuG,UAAYzN,OAAOC,YAAc,KAAO,SAAW,YACzDD,OAAOgC,iBACLyL,WACA,KACE3B,oBAAoB0B,qBAAqB,GAE3C,CAAEE,MAAM,GAEZ,GAOWC,eAAiB,CAC5BlM,OAAQzB,OAAO4N,iBAAkB,EACjC5B,QAAQ,EAERjL,KAAM,WACJ,IAAK4M,eAAelM,OAAQ,OAE5B,MAAMoM,kBAAoB5M,SAASC,iBAAiB,sBAEpD,GAAiC,IAA7B2M,kBAAkBhL,OAAc,OAEpC,MAAMN,SAAW,IAAIC,sBAClBC,UACC,IAAK,MAAME,SAASF,QAClB,GAAIE,MAAMC,eAAgB,CACnB+K,eAAe3B,SAClB7I,SAASwK,eAAelM,QACxBkM,eAAe3B,QAAS,GAE1BzJ,SAASS,aACT,KACF,CACF,GAEF,CAAEjD,UAAW,KAGf8N,kBAAkBzM,SAAS6B,UACzBV,SAASW,QAAQD,QAAQ,GAE7B,GCrGFK,QAAQ0H,IACN,+DACA,2FAGFhL,OAAOgC,iBAAiB,oBAAoB,KAC1C,OAAOjB,OACP,YAAYA,OACZ,aAAaA,OACb4M,eAAe5M,OACf,WAAWA,OACX,OAAOA,OACP,SAASA,OACT+K,oBAAoB/K,ON6Rf,WACL,MAAM+M,aAAe7M,SAASC,iBAAiB,wBACzC6M,OAAS9M,SAAS0E,cAAc,2BAChCuF,MAAQjK,SAAS0E,cAAc,uBAErCmI,aAAajL,OAAS,GACpBiL,aAAa1M,SAASiH,SACpBA,OAAOrG,iBAAiB,SAAS,KAC3B+L,OAAOxM,UAAU+G,SAAS,QAC5ByF,OAAOxM,UAAUC,OAAO,SAExBuM,OAAOxM,UAAUgH,IAAI,QACrBoC,YAAW,KACTO,MAAMpB,OAAO,GACZ,KACL,GACA,GAER,CM9SEkE,GN6eK,WACL,MAAMjH,KAAO9F,SAASgN,eAAe,8BAEtB,IAAIC,kBAAiB,SAAUC,WAEc,QADpCA,UAAU,GAAGnE,OACjBrJ,aAAa,yBAG3BM,SAAS0E,cAAc,oBACzBZ,eAAegC,KAEnB,IAES7D,QAAQ6D,KAAM,CACrBqH,WAAW,EACXC,SAAS,GAEb,CM7fEC,EAAmB,G","sources":["webpack://build/../usuall/assets/javascripts/common/lazyLoading.js","webpack://build/../usuall/assets/javascripts/common/loadPurchase.js","webpack://build/../usuall/assets/javascripts/components/utilities.js","webpack://build/../usuall/assets/javascripts/common/cartDrawer.js","webpack://build/../usuall/assets/javascripts/common/footer.js","webpack://build/../usuall/assets/javascripts/common/header.js","webpack://build/../usuall/assets/javascripts/common/webforms.js","webpack://build/../usuall/assets/javascripts/components/vndaComponents.js","webpack://build/../usuall/assets/javascripts/main.js"],"sourcesContent":["const LazyLoading = {\n threshold: window.innerWidth < 768 ? 350 : 600,\n nativeImageSupport: \"loading\" in HTMLImageElement.prototype,\n nativeIframeSupport: \"loading\" in HTMLIFrameElement.prototype,\n\n setForNativeLazy: function(element) {\n if (element.hasAttribute('src') || element.hasAttribute('srcset')) {\n // console.warn('Elemento já está com lazy load nativo configurado', element)\n return\n }\n\n if (element.hasAttribute('data-src')) {\n element.setAttribute('src', element.getAttribute('data-src'))\n }\n\n if (element.hasAttribute('data-srcset')) {\n element.setAttribute('srcset', element.getAttribute('data-srcset'))\n }\n \n if (element.hasAttribute('data-sizes')) {\n element.setAttribute('sizes', element.getAttribute('data-sizes'))\n }\n\n element.setAttribute('data-lazy-loaded', true)\n\n return true\n },\n\n update: function() {\n\n if (!this.nativeImageSupport || !this.nativeIframeSupport) {\n window.lazyLoadInstance.update()\n }\n\n return LazyLoading.init()\n },\n\n init: function() {\n const lazyImages = document.querySelectorAll(\"img.lazy\");\n const lazyIframes = document.querySelectorAll('iframe.lazy')\n\n if (LazyLoading.nativeImageSupport) {\n lazyImages.forEach(image => {\n LazyLoading.setForNativeLazy(image)\n });\n }\n\n if (LazyLoading.nativeIframeSupport) {\n lazyIframes.forEach(iframe => {\n LazyLoading.setForNativeLazy(iframe)\n })\n }\n\n // Caso tenha o suporte em um, mas não tenha no outro\n if (LazyLoading.nativeImageSupport && !LazyLoading.nativeIframeSupport) {\n lazyImages.forEach(image => {\n image.classList.remove('lazy')\n })\n }\n\n if (!LazyLoading.nativeImageSupport && LazyLoading.nativeIframeSupport) {\n lazyIframes.forEach(iframe => {\n iframe.classList.remove('lazy')\n })\n }\n\n\n // Adiciona vanilla lazy load caso não tenha suporte nativo para algum dos elementos\n if (!LazyLoading.nativeImageSupport || !LazyLoading.nativeIframeSupport) {\n const script = document.createElement('script')\n script.setAttribute('async', true)\n script.src = '/javascripts/lazyload.min.js'\n document.body.appendChild(script)\n\n window.lazyLoadOptions = {\n elements_selector: \".lazy\",\n threshold: LazyLoading.threshold\n };\n\n window.addEventListener(\"LazyLoad::Initialized\", event => {\n window.lazyLoadInstance = event.detail.instance\n }, { passive: true });\n }\n\n return window.lazyLoad = LazyLoading\n }\n}\n\nexport default LazyLoading\n","const LoadPurchase = {\n init: function() {\n const products = document.querySelectorAll('[data-product-box]:not([data-product-unique-id])')\n const observer = new IntersectionObserver(entries => {\n const intersecting = entries.filter(entry => { if (entry.isIntersecting) return entry })\n if (intersecting.length > 0) {\n const scriptEl = document.createElement('script')\n scriptEl.src = window.purchaseScript\n document.body.appendChild(scriptEl)\n observer.disconnect()\n }\n })\n\n return products.forEach(product => { observer.observe(product) }, { threshold: 0.1 })\n }\n}\n\nexport default LoadPurchase\n","// ===============================================================\n// ADIÇÃO MANUAL DE ASSET\n// ===============================================================\n// Usado para incluir assets no código de forma manual, conforme a necessidade\nexport function addAsset(source, onloadCallback) {\n if (!source || source === '') return console.error(`addAsset: caminho não definido.`);\n\n if (source.includes('.js')) {\n const scriptTag = document.createElement('script');\n scriptTag.setAttribute('src', source);\n\n if (onloadCallback && typeof onloadCallback === 'function') {\n scriptTag.onload = onloadCallback;\n }\n\n return document.body.appendChild(scriptTag);\n } else if (source.includes('.css')) {\n const linkTag = document.createElement('link');\n linkTag.setAttribute('rel', 'stylesheet');\n linkTag.setAttribute('type', 'text/css');\n linkTag.setAttribute('href', source);\n return document.head.appendChild(linkTag);\n } else {\n const error = `addAsset: Erro ao criar o asset. Tipo de script não definido, ou não possui tratamento para este tipo de asset.`;\n return console.error(error, source);\n }\n}\n\n// ===============================================================\n// BUSCA O CARRINHO ATIVO\n// ===============================================================\nexport async function getCart() {\n try {\n const response = await fetch('/carrinho', {\n headers: {\n Accept: 'application/json',\n },\n });\n\n return await response.json();\n } catch (error) {\n console.error('Erro ao buscar os dados do carrinho');\n console.error(error);\n return false;\n }\n}\n\n// ===============================================================\n// SERIALIZE ARRAY\n// ===============================================================\nexport function serializeArray(form) {\n const formData = new FormData(form);\n const data = {};\n\n for (const [name, value] of formData) {\n data[name] = value;\n }\n\n const formBody = [];\n\n for (const key in data) {\n const encodeKey = encodeURIComponent(key);\n const encodeValue = encodeURIComponent(data[key]);\n formBody.push(`${encodeKey}=${encodeValue}`);\n }\n\n return formBody.join('&');\n}\n\n// ===============================================================\n// URL ENCODE FORM DATA\n// ===============================================================\nexport function urlencodeFormData(formData) {\n let string = '';\n\n function encode(s) {\n return encodeURIComponent(s).replace(/%20/g, '+');\n }\n\n for (const pair of formData.entries()) {\n if (typeof pair[1] == 'string') {\n string += (string ? '&' : '') + encode(pair[0]) + '=' + encode(pair[1]);\n }\n }\n return string;\n}\n\n// ===============================================================\n// SLIDE TOGGLE\n// ===============================================================\nexport function slideToggle(contentWrapper, content, duration = 500) {\n let initialHeight = window.getComputedStyle(contentWrapper).height;\n\n if (initialHeight == '0px') {\n return slideDown(contentWrapper, content, duration);\n } else {\n return slideUp(contentWrapper, duration);\n }\n}\n\n// ===============================================================\n// SLIDE UP\n// ===============================================================\nexport function slideUp(contentWrapper, duration = 500) {\n contentWrapper.style.height = '0px';\n contentWrapper.style.transition = `height ${duration} ease`;\n}\n\n// ===============================================================\n// SLIDE DOWN\n// ===============================================================\nexport function slideDown(contentWrapper, content, duration = 500) {\n let innerHeight = content.clientHeight;\n\n contentWrapper.style.height = `${innerHeight}px`;\n contentWrapper.style.transition = `height ${duration} ease`;\n}\n\n// ===============================================================\n// UPDATE DISCOUNT IN PRODUCT BLOCK\n// ===============================================================\nexport function updatePriceBlock() {\n const priceEls = document.querySelectorAll('[data-init-price]');\n\n if (priceEls == null) return;\n\n priceEls.forEach((priceEl) => {\n const discount = priceEl.dataset.discountPercent;\n\n priceEl.dispatchEvent(new Event('change'));\n\n // discount\n if (discount != '0') {\n priceEl.style.setProperty('--discount', `'-${discount}%'`);\n }\n });\n}\n\n// ===============================================================\n// PREÇO POR AJAX\n// ===============================================================\nexport function getPriceProd() {\n const selectors = document.querySelectorAll('[data-update-price]');\n const attr = 'data-update-price';\n\n if (selectors.length > 0) {\n selectors.forEach((selector) => {\n const prodId = selector.getAttribute(attr);\n const url = `/produto/preco/${prodId}`;\n\n if (prodId !== '' && prodId !== null) {\n fetch(url, {\n method: 'GET',\n })\n .then((response) => response.text())\n .then((resp) => {\n selector.innerHTML = resp;\n })\n .catch((error) => {\n console.error(error);\n });\n }\n });\n }\n}\n\n// ===============================================================\n// DEBOUNCE\n// ===============================================================\n/*\n Debounce retorna uma função que enquanto continuar sendo chamada não é executada\n A função só será executada quando para de ser chamada por N milisegundos\n Útil para melhorar a performance de códigos que são executados muitas vezes por segundo, como o $(window).resize()\n\n Ex:\n \n $(window).resize(debounce(function() {\n // código a ser executado\n }, 500))\n \n No exemplo acima a função só será executada 500ms depois do último resize\n Abra o link abaixo e redimensione a janela branca e acompanhe o output do console\n Exemplo codepen: https://codepen.io/valkervieira/pen/oNgqyWY\n\n Um caso comum de uso é em lojas onde a seleção de um filtro na página de tag recarrega automáticamente a página\n Com o debounce o usuário pode escolher vários filtros rapidamente e a página só recarrega quando parar de escolher\n*/\n\nexport function debounce(func, wait, immediate) {\n var timeout;\n immediate || (immediate = true);\n\n return function () {\n var context = this,\n args = arguments;\n\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n\n var callNow = immediate && !timeout;\n\n clearTimeout(timeout);\n\n timeout = setTimeout(later, wait);\n\n if (callNow) func.apply(context, args);\n };\n}\n\n// ===============================================================\n// THROTTLE\n// ===============================================================\n/*\n Throttle diminui a frequencia que uma função é executada\n Enquanto no debounce a função só é executada quando para de ser chamada, no throttle ela\n continua sendo executada só que em um intervalo mínimo de N milisegundos (default = 250)\n\n Ex:\n\n $(window).resize(throttle() {\n // código a ser executado\n }, 500)\n\n No exemplo acima a função resize é chamada várias vezes por segundo mas só é executada 1 vez a cada 500ms\n Abra o link abaixo, redimensione a janela branca e acompanhe o console\n Exemplo codepen: https://codepen.io/valkervieira/pen/yLyKEPW\n\n Um caso comum de uso é checar se o scroll passou de um determinado ponto, para fixar um header ou alterar algum elemento do DOM\n*/\nexport function throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n var last, deferTimer;\n return function () {\n var context = scope || this;\n\n var now = +new Date(),\n args = arguments;\n if (last && now < last + threshhold) {\n // hold on to it\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n } else {\n last = now;\n fn.apply(context, args);\n }\n };\n}\n\n// ===============================================================\n// FORMAT MONEY\n// ===============================================================\nexport function formatMoney(value) {\n // FORMATA UM VALOR\n return (\n 'R$ ' +\n value\n .toFixed(2)\n .replace('.', ',')\n .replace(/(\\d)(?=(\\d{3})+\\,)/g, '$1.')\n );\n}\n\n// ===============================================================\n// FORMAT VALUE\n// ===============================================================\n\nexport const formatValue = function (value = '') {\n let parsedValue = value;\n if (typeof value === 'number') {\n parsedValue = value.toFixed(2).toString();\n }\n return parsedValue.replace('.', ',');\n};\n\n// ===============================================================\n// VALIDA QUANTIDADE\n// ===============================================================\nexport function validateQuantity(_val) {\n // VALIDA SE A QUANTIDADE INFORMADA É UM NÚMERO\n if (!isNaN(_val)) {\n if (parseInt(_val) > 0) {\n return true;\n }\n }\n\n return false;\n}\n\n// ===============================================================\n// CLEAR NUMBER\n// ===============================================================\nexport function getClearNumber(_val) {\n // RETORNA UM NÚMERO LIMPO COMO INT\n if (!isNaN(_val)) {\n var clearNumber = parseInt(_val);\n\n return clearNumber;\n }\n\n return false;\n}\n\n// ===============================================================\n// BUSCA\n// ===============================================================\nexport function setSearch() {\n const toggleButton = document.querySelectorAll('[data-toggle-search]');\n const search = document.querySelector('[data-search-container]');\n const input = document.querySelector('[data-search-input]');\n\n toggleButton.length > 0 &&\n toggleButton.forEach((button) => {\n button.addEventListener('click', () => {\n if (search.classList.contains('open')) {\n search.classList.remove('open');\n } else {\n search.classList.add('open');\n setTimeout(() => {\n input.focus();\n }, 400);\n }\n });\n });\n}\n\n// ===============================================================\n// BUSCA OS DADOS DO CLIENTE\n// ===============================================================\nexport async function getClient() {\n try {\n const response = await fetch('/conta/cliente', {\n headers: {\n accept: 'application/json',\n 'Content-Type': 'application/json',\n cache: 'no-store',\n },\n });\n const client = await response.json();\n const access = Object.keys(client).length > 0;\n\n if (access) {\n window.client = client;\n\n return client;\n } else {\n return null;\n }\n } catch (error) {\n console.error(`getClient error`, error);\n }\n}\n\n// ===============================================================\n// MÁSCARA PARA INPUTS\n// ===============================================================\nexport function formMasks() {\n const inputPhones = document.querySelectorAll('[data-phone-mask]'),\n inputCEPs = document.querySelectorAll('[data-cep-mask]'),\n inputCPFs = document.querySelectorAll('[data-cpf-mask]'),\n inputCNPJs = document.querySelectorAll('[data-cnpj-mask]'),\n inputDatesOfBirth = document.querySelectorAll('[data-birth-mask]');\n\n inputPhones.length > 0 &&\n inputPhones.forEach((input) => {\n input.addEventListener('input', (e) => {\n //(XX) XXXXX-XXXX\n var phoneValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,5})(\\d{0,4})/);\n e.target.value = !phoneValue[2]\n ? phoneValue[1]\n : '(' + phoneValue[1] + ') ' + phoneValue[2] + (phoneValue[3] ? '-' + phoneValue[3] : '');\n });\n });\n\n inputCEPs.length > 0 &&\n inputCEPs.forEach((input) => {\n input.addEventListener('input', (e) => {\n //XXXXX-XX\n var cepValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,5})(\\d{0,3})/);\n e.target.value = !cepValue[2] ? cepValue[1] : cepValue[1] + '-' + cepValue[2];\n });\n });\n\n inputCPFs.length > 0 &&\n inputCPFs.forEach((input) => {\n input.addEventListener('input', (e) => {\n //XXX.XXX.XXX-XX\n var cpfValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,3})(\\d{0,3})(\\d{0,3})(\\d{0,2})/);\n e.target.value = !cpfValue[2]\n ? cpfValue[1]\n : cpfValue[1] +\n '.' +\n cpfValue[2] +\n (cpfValue[3] ? '.' + cpfValue[3] : '') +\n (cpfValue[4] ? '-' + cpfValue[4] : '');\n });\n });\n\n inputCNPJs.length > 0 &&\n inputCNPJs.forEach((input) => {\n input.addEventListener('input', (e) => {\n //XX.XXX.XXX/XXXX-XX\n var cnpjValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,3})(\\d{0,3})(\\d{0,4})(\\d{0,2})/);\n e.target.value = !cnpjValue[2]\n ? cnpjValue[1]\n : cnpjValue[1] +\n '.' +\n cnpjValue[2] +\n (cnpjValue[3] ? '.' + cnpjValue[3] : '') +\n (cnpjValue[4] ? '/' + cnpjValue[4] : '') +\n (cnpjValue[5] ? '-' + cnpjValue[5] : '');\n });\n });\n\n inputDatesOfBirth.length > 0 &&\n inputDatesOfBirth.forEach((input) => {\n input.addEventListener('input', (e) => {\n // XXXX-XX-XX\n var dateOfBirthValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,2})(\\d{0,4})/);\n e.target.value = !dateOfBirthValue[2]\n ? dateOfBirthValue[1]\n : dateOfBirthValue[1] + '/' + dateOfBirthValue[2] + (dateOfBirthValue[3] ? '/' + dateOfBirthValue[3] : '');\n });\n });\n}\n\n// ===============================================================\n// REALIZA OS CÁLCULOS DA BARRA E CHAMA A FUNÇÃO DE EXIBIÇÃO\n// ===============================================================\nexport async function handleCashback(cartDrawer) {\n const cart = await getCart();\n if (!cart) return;\n\n const cartTotal = cart.total;\n\n if (cartTotal < 0) return;\n\n const extraBar = document.querySelector('[data-cashback-bar]');\n if (!extraBar) return;\n\n const cashback = extraBar.getAttribute('data-total');\n const percentageCashback = extraBar.getAttribute('data-percentage');\n let cashbackAmount = 0;\n\n let amountLeft = cashback - cartTotal;\n let widthProgress = (cartTotal * 100) / cashback;\n widthProgress = widthProgress > 100 ? 100 : widthProgress;\n amountLeft = amountLeft < 0 ? 0 : amountLeft;\n\n extraBar.setAttribute('data-remaining', amountLeft);\n extraBar.style.setProperty('--progress', `${widthProgress}%`);\n\n cashbackAmount = cartTotal * (percentageCashback / 100);\n amountLeft = formatMoney(amountLeft);\n\n //Controla a exibição da barra\n if (cartDrawer) {\n handleCashbackBar(cart, cartDrawer, amountLeft, cashbackAmount, widthProgress, extraBar);\n }\n}\n\n// ===============================================================\n// GERÊNCIA A EXIBIÇÃO E OS TEXTOS/VALORES DA BARRA DE CASHBACK\n// ===============================================================\nexport function handleCashbackBar(cart, cartDrawer, amountLeft, cashbackAmount, widthProgress, extraBar) {\n let newBarElement = null;\n\n //Ponto de inserção\n const cartDrawerInserPoint = cartDrawer.querySelector(\n '.cart-drawer-content > .cart-drawer-relative > .cart-drawer-flex.cart-drawer-overscroll-contain'\n );\n\n //Elemento a ser inserido\n const cartDrawerExtraBar = cartDrawer.querySelector('.cart-drawer-cashback-bar');\n\n //Se a barra já existe no carrinho\n if (cartDrawerExtraBar) {\n if (cart.items.length > 0) {\n const cartDrawerExtraBarText = cartDrawerExtraBar.querySelector('p');\n cartDrawerExtraBarText.setAttribute('data-ignore-mutation', 'true');\n\n if (widthProgress < 100) {\n cartDrawerExtraBarText.innerHTML = `Faltam ${amountLeft} para você ganhar cashback`;\n } else {\n cartDrawerExtraBarText.innerHTML = `Você ganhou ${formatMoney(cashbackAmount)} de cashback!`;\n }\n } else {\n // Carrinho vazio - Remove a barra\n cartDrawerInserPoint.removeChild(cartDrawerExtraBar);\n }\n\n //Se a barra ainda não foi inserida, o ponto de inserção está correto e o carrinho não está vazio\n } else if (cartDrawerInserPoint && cart.items.length > 0) {\n newBarElement = extraBar.cloneNode(true);\n insertExtraBar(cartDrawerInserPoint, newBarElement, amountLeft);\n }\n}\n\n// ===============================================================\n// INSERE A BARRA EXTRA NO CARRINHO\n// ===============================================================\nexport function insertExtraBar(cartDrawerInserPoint, newBarElement, amountLeft) {\n if (newBarElement != null) {\n newBarElement.setAttribute('data-ignore-mutation', 'true');\n\n const newBarElementText = newBarElement.querySelector('p');\n newBarElementText.setAttribute('data-ignore-mutation', 'true');\n newBarElementText.innerHTML = `Faltam ${amountLeft} para você ganhar frete grátis`;\n cartDrawerInserPoint.appendChild(newBarElement);\n }\n}\n\n// ===============================================================\n// VALIDA ABERTURA/FECHAMENTO DO CARRINHO E SEUS EVENTOS\n// ===============================================================\nexport function watchCartOppening() {\n const root = document.getElementById('component-cart-drawer-root');\n\n var observer = new MutationObserver(function (mutations) {\n const targetElement = mutations[0].target;\n if (targetElement.getAttribute('data-ignore-mutation') == 'true') return;\n\n // Carrinho aberto\n if (document.querySelector('#cart-drawer-el')) {\n handleCashback(root);\n }\n });\n\n observer.observe(root, {\n childList: true,\n subtree: true,\n });\n}\n","import { addAsset } from \"../components/utilities\";\n\nconst CartDrawer = {\n root: document.querySelector('#component-cart-drawer-root'),\n buttons: document.querySelectorAll('[data-toggle-cart]'),\n countWrapper: document.querySelector('[data-cart-count]'),\n settings: window.cartDrawerSettings || false,\n\n setCartDrawer: function() {\n const { settings, root } = CartDrawer;\n\n if (!root || !settings) return;\n \n // Define frete grátis\n const freeShipping = (settings.freeShippingValue > 1) ? settings.freeShippingValue : 0\n\n // Inicia o componente\n const componentCartDrawer = new Vnda.Component.CartDrawer({\n anchor: 'right',\n display: 'list',\n startOpen: false,\n titleCart: 'Carrinho de compras',\n disableShippingCalculation: true,\n freeShipping\n });\n\n // Renderiza o componente\n componentCartDrawer.render(root);\n\n // Salva instância para acesso global\n window.cartDrawerSettings.instance = componentCartDrawer\n CartDrawer.settings = window.cartDrawerSettings\n\n // dispara evento de carregamento, escutado por CartDrawer.show()\n root.dispatchEvent(new Event('vnda:cart-drawer-loaded'))\n },\n\n loadComponent: function() {\n const { settings } = CartDrawer;\n addAsset(settings.script, CartDrawer.setCartDrawer);\n addAsset(settings.styles);\n },\n\n handleCartButton: function(button) {\n // Evita múltiplos cliques caso o carrinho precisa ser instanciado primeiro\n if (button.classList.contains('-loading')) {\n return;\n }\n\n // Abre o cart drawer\n button.classList.add('-loading');\n CartDrawer.show(() => { button.classList.remove('-loading') })\n },\n\n show: function (callback) {\n\n const { root } = CartDrawer;\n\n // No mobile, fecha o menu primeiro\n if (window.mmenu) window.mmenu.close()\n\n // Instancia o componente, caso ainda não exista\n if (!CartDrawer.settings.instance) CartDrawer.loadComponent();\n\n // Observa criação da instância inicial, caso não tenha\n if (CartDrawer.settings.instance === false) {\n root.addEventListener('vnda:cart-drawer-loaded', () => {\n CartDrawer.settings.instance.open()\n if (typeof callback === 'function') callback()\n })\n } else {\n // Já possui cart drawer instanciado, retorna abertura\n CartDrawer.settings.instance.open();\n if (typeof callback === 'function') callback()\n }\n },\n\n getCartItens: async function () {\n try {\n const response = await fetch('/carrinho/itens');\n const itens = await response.json()\n return itens;\n\n } catch (error) {\n console.error('Erro ao buscar a quantidade de produtos do carrinho');\n console.error(error);\n }\n },\n\n updateCartCount: async function (_itemsCount = null) {\n let items = _itemsCount;\n if (_itemsCount == null) items = await CartDrawer.getCartItens();\n\n this.countWrapper.innerHTML = items;\n },\n\n init: function () {\n const _this = this;\n const { buttons } = _this;\n\n // Atualiza o contador de itens do carrinho\n _this.updateCartCount();\n\n if (buttons.length > 0) buttons.forEach(button => {\n button.addEventListener('click', () => {\n _this.handleCartButton(button)\n })\n })\n },\n};\n\nexport default CartDrawer;\n","const Footer = {\n handleSubmenu: function () {\n const menus = document.querySelectorAll('[data-action=\"toggle-menu-footer\"]');\n\n menus.length > 0 && menus.forEach((menu) => {\n menu.addEventListener('click', () => {\n menu.classList.toggle('-open', !menu.classList.contains('-open'));\n });\n });\n },\n init: function () {\n const _this = this;\n\n _this.handleSubmenu();\n },\n};\n\nexport default Footer;\n","const Header = {\n lastScrollTop: -1,\n scrollTop: window.scrollY,\n header: document.querySelector('#header'),\n\n setScroll: function (scrollTop, lastScrollTop) {\n const _this = this;\n\n if (scrollTop <= 0) {\n _this.header.classList.add('scroll-up');\n _this.header.classList.remove('scroll-down');\n _this.header.classList.add('on-top');\n } else {\n if (_this.header.classList.contains('on-top')) {\n _this.header.classList.remove('on-top');\n }\n if (scrollTop > lastScrollTop) {\n _this.header.classList.add('scroll-down');\n _this.header.classList.remove('scroll-up');\n } else {\n _this.header.classList.add('scroll-up');\n _this.header.classList.remove('scroll-down');\n }\n }\n },\n\n searchButton: function () {\n const searchButton = document.querySelector('[data-action=\"show-form-search\"]');\n const searchButtonClose = document.querySelector('[data-action=\"hide-form-search\"]');\n const formSearch = document.querySelector('.header-search');\n const formSearchInput = document.querySelector('.header-search input');\n\n if (!formSearch) return;\n\n searchButton &&\n searchButton.addEventListener('click', () => {\n formSearch.classList.toggle('-active', !formSearch.classList.contains('-active'));\n\n formSearchInput && formSearchInput.focus();\n\n if (window.innerWidth > 768) {\n document.addEventListener('scroll', () => {\n formSearch.classList.remove('-active');\n });\n }\n });\n\n searchButtonClose &&\n searchButtonClose.addEventListener('click', () => {\n formSearch.classList.remove('-active');\n });\n\n // Desativa o popup de busca - quando necessário\n formSearch.addEventListener('click', (e) => {\n if (e.target.className == 'header-search -active') {\n formSearch.classList.remove('-active');\n }\n });\n },\n\n init: function () {\n const _this = this;\n\n _this.setScroll(_this.scrollTop, _this.lastScrollTop);\n _this.searchButton();\n\n // Atualiza o header quando a page recebe scroll\n window.addEventListener('scroll', function () {\n const newSt = window.scrollY;\n\n _this.setScroll(newSt, _this.lastScrollTop);\n _this.lastScrollTop = newSt;\n });\n },\n};\n\nexport default Header;\n","import { serializeArray } from '../components/utilities';\n\nconst Webforms = {\n submitWebForm: async function (form, email) {\n const formData = serializeArray(form);\n const textBtnDefault = form.querySelector('.action').innerHTML;\n\n if (typeof email == 'undefined' || email == '') {\n email = form.querySelector('[name=\"email\"]').value;\n }\n\n form.querySelector('[name=\"reply_to\"]').value = email;\n\n if (!form.classList.contains('sending')) {\n\n form.classList.add('sending');\n form.classList.remove('error');\n form.querySelector('.action').innerHTML = 'Enviando';\n\n try {\n const response = await fetch('/webform', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n },\n body: formData\n })\n\n if (response.ok) {\n console.info('Formulário enviado com sucesso');\n form.classList.add('sent');\n form.querySelector('.msg-success').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Enviado';\n form.reset();\n\n setTimeout(function () {\n form.classList.remove('sent');\n form.querySelector('.msg-success').classList.remove('-visible');\n form.querySelector('.action').innerHTML = textBtnDefault;\n }, 3500);\n } else {\n\n const text = await response.text();\n\n console.error(`Ocorreu um erro no envio do formulário. Erro ${response.status}`);\n console.error(text);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(function () {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = textBtnDefault;\n }, 3500);\n\n }\n\n } catch (error) {\n console.error('Erro ao enviar o webform');\n console.error(error);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(function () {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = textBtnDefault;\n }, 3500);\n }\n\n form.classList.remove('sending');\n }\n },\n submitNotify: async function (form) {\n const formData = serializeArray(form);\n const btnTextDefault = form.querySelector('.action').innerHTML;\n\n if (!form.classList.contains('sending')) {\n\n form.classList.remove('error');\n form.classList.add('sending');\n form.querySelector('.action').innerHTML = 'Enviando';\n\n try {\n\n const response = await fetch('/lista_de_espera', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n },\n body: formData\n })\n\n if (response.ok) {\n form.classList.remove('sending');\n \n // Envia um webform de aviso de cadastro\n console.log('Lista de espera enviada com sucesso');\n Webforms.submitWebForm(form);\n\n } else {\n const text = await response.text();\n console.error(`Ocorreu um erro ao enviar o formulário de Lista de Espera. Erro ${response.status}`)\n console.error(text);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(() => {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = btnTextDefault;\n }, 3500);\n }\n\n } catch (error) {\n console.error('Falha ao enviar lista de espera. Verificar integração.');\n console.error(error);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(() => {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = btnTextDefault;\n }, 3500);\n }\n\n form.classList.remove('sending');\n }\n },\n showMessage: function (input, form) {\n const alertMessage = form.querySelector('[data-msg]');\n\n alertMessage.classList.add('-visible');\n alertMessage.innerText = 'Preencha os campos obrigatórios';\n\n input.classList.add('-emphasis')\n\n setTimeout(() => {\n\n alertMessage.classList.remove('-visible');\n alertMessage.innerText = '';\n\n input.classList.remove('-emphasis')\n\n }, 2000)\n\n },\n validateForm: function (vndaInput, form) {\n let submitAllowed = true;\n\n // Permite o envio se o input vnda estiver vazio\n if (vndaInput.value == '') {\n vndaInput.setAttribute('required', false);\n\n // Valida se os campos obrigatórios estão preenchidos\n const requiredFields = form.querySelectorAll('[required]:not([required=false])');\n requiredFields.forEach(input => {\n\n if (input.value == '') {\n submitAllowed = false;\n Webforms.showMessage(input, form);\n }\n\n if (input.type == 'checkbox' && input.checked == false) {\n submitAllowed = false;\n Webforms.showMessage(input, form);\n }\n\n })\n\n if (submitAllowed) form.id == 'form-notify' ? Webforms.submitNotify(form) : Webforms.submitWebForm(form)\n }\n },\n setWebForms: function () {\n const webForms = document.querySelectorAll('[data-webform]');\n\n webForms.length > 0 && webForms.forEach(form => {\n\n const button = form.querySelector('button');\n const fieldset = form.querySelector('fieldset');\n\n // Desabilita os campos do formulário, através do fieldset, quando o input vnda recebe algum valor \n let vndaInput = form.querySelector('input[name=\"vnda\"]');\n vndaInput.addEventListener('input', () => fieldset.setAttribute('disabled', true))\n\n // Realiza o envio através do clique e da tecla enter sobre o botão do formulário\n button && button.addEventListener('click', () => Webforms.validateForm(vndaInput, form));\n button && button.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') Webforms.validateForm(vndaInput, form);\n })\n\n })\n },\n init: function () {\n const _this = this;\n _this.setWebForms();\n },\n};\n\nexport default Webforms;\n","import { addAsset } from './utilities';\n\n// ===============================================================\n// NEWSLETTER POPUP\n// ===============================================================\nexport const NewsletterComponent = {\n root: document.querySelector('#component-popup-newsletter-root'),\n settings: window.popupNewsletterSettings || false,\n loaded: false,\n\n setPopupNewsletter: function () {\n const { settings, root } = NewsletterComponent;\n\n // Define propriedades do componente\n let maxWidth = settings.maxWidth;\n let imageUrl = settings.imageUrl;\n let title = settings.title;\n let description = settings.description;\n let extraDescription = settings.extraDescription;\n let subdomain = settings.subdomain;\n let successMessage = settings.success;\n\n // Inicia o componente\n const componentNewsletterPopup = new Vnda.Component.NewsletterPopup({\n maxWidth: maxWidth,\n imageUrl: imageUrl,\n imagePosition: 'left',\n popupPosition: 'center',\n title: title,\n description: description,\n extraDescription: extraDescription,\n textBtnSubmit: 'Enviar',\n classBtnSubmit: 'button-newsletter',\n formKey: `${subdomain}-newsletter`,\n hasNameField: false,\n hasLastNameField: false,\n hasDateOfBirthField: false,\n hasPhoneField: false,\n successMessage: successMessage,\n delay: 500,\n frequency: '7',\n language: 'pt-BR',\n placeholders: {\n // firstName: 'Nome',\n // lastName: 'Sobrenome',\n // phone: 'Telefone',\n email: 'Informe seu e-mail',\n },\n });\n\n // Renderiza o componente e marca como carregado\n componentNewsletterPopup.render(root);\n NewsletterComponent.loaded = true;\n },\n\n loadPopupNewsletter: function () {\n if (!NewsletterComponent.loaded) {\n const { settings } = NewsletterComponent;\n addAsset(settings.script, NewsletterComponent.setPopupNewsletter);\n addAsset(settings.styles);\n }\n },\n\n init: function () {\n const { root, settings } = this;\n\n if (!root || !settings) return;\n\n const eventType = window.innerWidth <= 1024 ? 'scroll' : 'mousemove';\n window.addEventListener(\n eventType,\n () => {\n NewsletterComponent.loadPopupNewsletter();\n },\n { once: true }\n );\n },\n};\n\n// ===============================================================\n// PREÇO\n// ===============================================================\n// Carrega o componente de preço quando um product-block ou product-infos entra em tela\nexport const PriceComponent = {\n script: window.priceComponent || false,\n loaded: false,\n\n init: function () {\n if (!PriceComponent.script) return;\n\n const productContainers = document.querySelectorAll('[data-product-box]');\n\n if (productContainers.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n if (!PriceComponent.loaded) {\n addAsset(PriceComponent.script);\n PriceComponent.loaded = true;\n }\n observer.disconnect();\n break;\n }\n }\n },\n { threshold: 0.1 }\n );\n\n productContainers.forEach((product) => {\n observer.observe(product);\n });\n },\n};\n","import LazyLoading from './common/lazyLoading';\nimport LoadPurchase from './common/loadPurchase.js';\nimport CartDrawer from './common/cartDrawer';\nimport Footer from './common/footer';\nimport Header from './common/header';\nimport Webforms from './common/webforms';\nimport { NewsletterComponent, PriceComponent } from './components/vndaComponents.js';\nimport { setSearch, watchCartOppening } from './components/utilities';\n\n// ==========================================\n// Inicialização\n// ==========================================\nconsole.log(\n '%cOlist - Soluções de vendas online e Serviços de E-commerce',\n 'color: #0a4ee4; font-size: 14px; font-family: \"Verdana\", sans-serif; font-weight: bold;'\n);\n\nwindow.addEventListener('DOMContentLoaded', () => {\n Header.init();\n LazyLoading.init();\n LoadPurchase.init();\n PriceComponent.init();\n CartDrawer.init();\n Footer.init();\n Webforms.init();\n NewsletterComponent.init();\n setSearch();\n watchCartOppening();\n});\n"],"names":["LazyLoading","threshold","window","innerWidth","nativeImageSupport","HTMLImageElement","prototype","nativeIframeSupport","HTMLIFrameElement","setForNativeLazy","element","hasAttribute","setAttribute","getAttribute","update","this","lazyLoadInstance","init","lazyImages","document","querySelectorAll","lazyIframes","forEach","image","iframe","classList","remove","script","createElement","src","body","appendChild","lazyLoadOptions","elements_selector","addEventListener","event","detail","instance","passive","lazyLoad","products","observer","IntersectionObserver","entries","filter","entry","isIntersecting","length","scriptEl","purchaseScript","disconnect","product","observe","addAsset","source","onloadCallback","console","error","includes","scriptTag","onload","linkTag","head","serializeArray","form","formData","FormData","data","name","value","formBody","key","encodeKey","encodeURIComponent","encodeValue","push","join","formatMoney","toFixed","replace","async","handleCashback","cartDrawer","cart","response","fetch","headers","Accept","json","getCart","cartTotal","total","extraBar","querySelector","cashback","percentageCashback","cashbackAmount","amountLeft","widthProgress","style","setProperty","newBarElement","cartDrawerInserPoint","cartDrawerExtraBar","items","cartDrawerExtraBarText","innerHTML","removeChild","cloneNode","newBarElementText","insertExtraBar","handleCashbackBar","CartDrawer","root","buttons","countWrapper","settings","cartDrawerSettings","setCartDrawer","freeShipping","freeShippingValue","componentCartDrawer","Vnda","Component","anchor","display","startOpen","titleCart","disableShippingCalculation","render","dispatchEvent","Event","loadComponent","styles","handleCartButton","button","contains","add","show","callback","mmenu","close","open","getCartItens","updateCartCount","_itemsCount","_this","handleSubmenu","menus","menu","toggle","lastScrollTop","scrollTop","scrollY","header","setScroll","searchButton","searchButtonClose","formSearch","formSearchInput","focus","e","target","className","newSt","Webforms","submitWebForm","email","textBtnDefault","method","ok","info","reset","setTimeout","text","status","submitNotify","btnTextDefault","log","showMessage","input","alertMessage","innerText","validateForm","vndaInput","submitAllowed","type","checked","id","setWebForms","webForms","fieldset","NewsletterComponent","popupNewsletterSettings","loaded","setPopupNewsletter","maxWidth","imageUrl","title","description","extraDescription","subdomain","successMessage","success","NewsletterPopup","imagePosition","popupPosition","textBtnSubmit","classBtnSubmit","formKey","hasNameField","hasLastNameField","hasDateOfBirthField","hasPhoneField","delay","frequency","language","placeholders","loadPopupNewsletter","eventType","once","PriceComponent","priceComponent","productContainers","toggleButton","search","setSearch","getElementById","MutationObserver","mutations","childList","subtree","watchCartOppening"],"sourceRoot":""}