{"version":3,"file":"main-c2a6402f7b49729bfb40.esm.js","mappings":"2BAYA,IAAIA,EAAc,EAAQ,KACtBC,EAAM,EAAQ,KACdC,EAAiB,EAAQ,IAEzBC,EAAI,EACNC,EAAY,EACZC,EAAO,GACPC,EAAiBC,KAAKC,IAAIH,EAAMD,GAElC,SAASK,IACP,OAAOR,GAAKC,IACVI,EAAkB,GACjBI,SAASL,GAAOD,EACrB,CAEA,SAASO,IAGP,OAFAR,EAAIA,EAAIG,EAAiBH,EAAI,IAC7BA,EACW,CACb,CAEA,SAASS,IAqBP,MAlBa,KAKE,IAAIC,MAAOC,UAAWJ,SAASL,GAGlCJ,EAAIU,IAAcD,SAASL,GAAOD,GAKpCJ,KAGCS,IAAgBA,IAG7B,CAEAG,EAAKG,KAAO,WACV,IAAIC,GAAO,IAAIH,MAAOC,UAAUJ,SAAS,IACvCO,EAAUN,IAAcD,SAAS,IAAIQ,OAAO,GAC5CC,EAAQnB,IAAckB,MAAM,EAAG,GAC7BlB,IAAckB,OAAO,GACvBE,EAASX,IAAcS,OAAO,GAEhC,OAAOF,EAAKE,OAAO,GACjBD,EAAUE,EAAQC,CACtB,EAEAR,EAAKS,OAAS,SAAiBC,GAC7B,MAA6B,iBAAlBA,KACPA,EAAcC,WAAW,IAE/B,EAEAX,EAAKY,OAAS,SAAiBF,GAC7B,GAA6B,iBAAlBA,EAA4B,OAAO,EAC9C,IAAIG,EAAeH,EAAcI,OACjC,OAAID,GAAgB,GAAKA,GAAgB,EAE3C,EAEAb,EAAKZ,YAAcA,EAEnB2B,EAAOC,QAAUhB,C,gBCnFjB,IAAIX,EAAM,EAAQ,KAEd4B,EAAwB,iBAAXC,OAAsBA,OAASC,KAC5CC,EAAcC,OAAOC,KAAKL,GAAKH,OAE/BS,EAAWlC,IADOmC,UAAUC,UAAYD,UAAUC,UAAUX,OAAS,GAEvEU,UAAUE,UAAUZ,QAAQhB,SAAS,IACrCsB,EAAYtB,SAAS,IAAK,GAE5BiB,EAAOC,QAAU,WACf,OAAOO,CACT,C,SCVA,IAAIjC,EAEAqC,EAA2B,oBAAXT,SACjBA,OAAOS,QAAUT,OAAOU,WACT,oBAATT,MACPA,KAAKQ,OAEP,GAAIA,EAAQ,CACR,IAAIE,EAAMlC,KAAKC,IAAI,EAAG,IAAM,EAC5BN,EAAiB,WACb,OAAOK,KAAKmC,IAAIH,EAAOI,gBAAgB,IAAIC,YAAY,IAAI,GAAKH,EACpE,CACJ,MACIvC,EAAiBK,KAAKa,OAG1BO,EAAOC,QAAU1B,C,UCjBjByB,EAAOC,QAAU,SAAciB,EAAKC,GAClC,IAAIC,EAAI,YAAcF,EACtB,OAAOE,EAAEC,OAAOD,EAAErB,OAASoB,EAC7B,C,gBCHAnB,EAAOC,QAAU,EAAjB,I,UCQAD,EAAOC,QAAQqB,cALf,SAAuBC,EAAMC,GAE3B,OAAOD,GADkBC,EAAU,KAAKA,EAAQC,MAAM,KAAK,KAAO,GAEpE,C,GCLIC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAa5B,QAGrB,IAAID,EAAS0B,EAAyBE,GAAY,CAGjD3B,QAAS,CAAC,GAOX,OAHA8B,EAAoBH,GAAU5B,EAAQA,EAAOC,QAAS0B,GAG/C3B,EAAOC,OACf,C,uCCtBgBK,OAAO0B,eACN1B,OAAO2B,iBACA3B,OAAO4B,0BACL5B,OAAO6B,sBACd7B,OAAO8B,UAAUC,eACjB/B,OAAO8B,UAAUE,qBAiMpC,ICjMIC,EAAqB,uCAIrBC,EAA6B,IAG7BC,EAAY,uBAAyBD,EAgEzC,SAASE,EAAUC,QAEab,IAA1Bc,WAAWH,KAEbG,WAAWH,GAAa,SAAUI,GAChCD,WAAWH,GAAWK,EAAEC,KAAKF,EAC/B,EACAD,WAAWH,GAAWK,EAAI,IAe9B,SAAkBE,GAEhB,GADgBC,SAASC,cAAc,eAAkBF,EAAM,MAE7D,OAEF,IAAIG,EAASF,SAASG,cAAc,UACpCD,EAAOE,OAAQ,EACfF,EAAOH,IAAMA,EACbC,SAASK,KAAKC,YAAYJ,EAC5B,CApBIK,CAASjB,EAAqB,UAAYC,EAA6B,4BAIzEI,WAAWH,GAAWE,EACxB,CC5FgBrC,OAAO0B,eACN1B,OAAO2B,iBACA3B,OAAO4B,0BACL5B,OAAO6B,sBACd7B,OAAO8B,UAAUC,eACjB/B,OAAO8B,UAAUE,qBALpC,IA2CI,EAAoC,CAAEmB,IACxCA,EAA0B,MAAI,QAC9BA,EAAyB,KAAI,OACtBA,GAH+B,CAIrC,GAAqB,CAAC,GACrB,EAA8B,CAAEC,IAClCA,EAA6B,eAAI,0DACjCA,EAAyB,WAAI,2CAC7BA,EAAoC,sBAAI,kEACxCA,EAA8B,gBAAI,gDAClCA,EAAqC,uBAAI,oEACzCA,EAA4B,cAAI,8CAChCA,EAA+B,iBAAI,6DACnCA,EAAyB,WAAI,iDAC7BA,EAA0B,YAAI,4CAC9BA,EAAwB,UAAI,6CAC5BA,EAA6B,eAAI,gDACjCA,EAA4B,cAAI,iDACzBA,GAbyB,CAc/B,GAAe,CAAC,GACf,EAA+B,CAAEC,IACnCA,EAAwB,SAAI,oDAC5BA,EAAuB,QAAI,uCAC3BA,EAA0B,WAAI,0CAC9BA,EAAoB,KAAI,oCACxBA,EAA0B,WAAI,2CAC9BA,EAAuB,QAAI,wCAC3BA,EAAoB,KAAI,oCACxBA,EAA+B,gBAAI,iDACnCA,EAAmC,oBAAI,+DACvCA,EAA4B,aAAI,6CAChCA,EAAuB,QAAI,uCAC3BA,EAA2B,YAAI,iEACxBA,GAb0B,CAchC,GAAgB,CAAC,GCzEpB,MAAMC,EAAS,YAWf,SAASC,EAAcC,GAAW,YAAEC,EAAW,eAAEC,IAC/C,IACIC,EADAC,GAAe,EAEnB,MAAMC,EClBR,SAAiBJ,EAAc,eAC7B,MAAoB,eAAhBA,EACK,sBAEF,sCACT,CDaeK,CAAQL,GACfM,EAAa,GACbC,EAAW,CAAC,UAAW,QACvBC,EAAgB5B,IAChBuB,EACFvB,EAASsB,GAETI,EAAWtB,KAAKJ,EAClB,EA4CF,OAxBAD,GAAW8B,IACTP,EAASO,EACT,MAAM,WAAEC,GAAeD,EAEvB,GADAC,EAAWC,WAAWZ,EAAWF,EAAQO,GACrCH,EAAgB,CAClB,MAAMW,EAAmB,GAAGb,KAAaE,EAAeY,KACxDN,EAASvB,KAAK4B,GACdF,EAAWI,QAAQC,IAAIH,EAAkB,EAAaI,QAAS,CAC7DC,OAAQhB,EAAegB,OACvBJ,GAAIZ,EAAeY,IAEvB,CApDJ,IAA0BK,EAASC,GAATD,EAqDLR,EAAWU,SAASC,UAAU,gBArDhBF,EAqDiC,IApD3DG,QAAQC,KAAK,CAClBL,EAAQM,MAAK,KAAM,IACnB,IAAIF,SAASG,IACXC,YAAW,KACTD,GAAQ,EAAM,GACbN,EAAK,OA+C2DK,MAAMG,IAKzE,IAJAxB,GAAe,GACI,IAAfwB,GACFC,QAAQC,KAAK,+BAERvB,EAAWtE,QAAQ,CACbsE,EAAWwB,KACtBC,CAAG7B,EACL,CACM,IACL8B,MAAMJ,QAAQK,MAAM,IAElB,CACLC,yBAlCgCC,GAAU3B,GAC1C,EAAGE,aAAY0B,cAAeA,EAASF,yBACrC,CACEC,QACArB,QAASJ,EAAWI,QAAQuB,QAAQ9B,IAEtC,CAACR,MA6BHuC,qBA5C4BH,GAAU3B,GAAa,EAAGE,aAAY0B,eAClEA,EAASG,iBACP,IACKJ,EACHrB,QAASJ,EAAWI,QAAQuB,QAAQ9B,IAEtC,CAACR,GACF,IAuCL,CEzEA,QAAsJ,uBAAtJ,EAA0O,8BC8F1O,IACMyC,EACAC,EAFFC,GACEF,EAA0B,oBAAXpG,OAAyB,CAAC,EAAIA,OAAOuG,QAAQtE,UAC5DoE,EAAQD,EAAMI,SAAWJ,EAAMK,mBAAqBL,EAAMM,sBAC1DN,EAAME,QACD,CAACK,EAAIC,IAAQD,EAAGL,QAAQM,GAExB,CAACD,EAAIC,KACV,KAAOD,EAAIA,EAAKA,EAAGE,cAAe,GAAIR,EAAMS,KAAKH,EAAIC,GAAM,OAAOD,EAClE,OAAO,IAAI,GASjB,SAASI,EAAQC,GACf,MAAO,GAAG5H,MAAM0H,KAAKE,EACvB,CC3Ge,MAAMC,UAAoBC,YAAYC,WAAAA,IAAAC,GAAA,SAAAA,GAAA,KACnDC,OAAS,GAAE,KAiDXC,cAAiBC,IACfC,KAAKH,OAASE,EAAEE,OAAOC,MACvBF,KAAKG,cAAc,EACpB,KAEDC,aAAgBL,IACd,MAAMM,EAAQN,EAAEO,eAAe,GACzBC,EAAOP,KAAKQ,wBACZC,EAAW,KAAOJ,EAAMK,QAAUH,EAAKI,MAASJ,EAAKK,MA9D/D,IAAeV,EA+DXF,KAAKH,QA/DMK,EA+DSO,EA9DfxJ,KAAK4J,IAAI5J,KAAK6J,IAAIZ,EAAO,KAAM,IA+DpCF,KAAKG,cAAc,CACpB,CA3DDY,iBAAAA,GAUE,GATAf,KAAKgB,MAAMC,iBAAiB,SAAUjB,KAAKF,eAC3CE,KAAKgB,MAAMC,iBAAiB,QAASjB,KAAKF,eACtCE,KAAKkB,mBACPlB,KAAKgB,MAAMC,iBAAiB,aAAcjB,KAAKI,cAC/CJ,KAAKgB,MAAMC,iBAAiB,YAAajB,KAAKI,cAC9CJ,KAAKgB,MAAMC,iBAAiB,WAAYjB,KAAKI,eAE/CJ,KAAKG,eAEDH,KAAKmB,gBAAkBnB,KAAKoB,kBAAmB,CAClC7B,EAAQS,KAAKqB,iBAAiB,QACtCC,SAASC,IACdA,EAAMC,aAAa,QAAS,QAAQ,GAExC,CACF,CAEAC,oBAAAA,GACEzB,KAAKgB,MAAMU,oBAAoB,SAAU1B,KAAKF,eAC9CE,KAAKgB,MAAMU,oBAAoB,QAAS1B,KAAKF,eACzCE,KAAKkB,mBACPlB,KAAKgB,MAAMC,iBAAiB,aAAcjB,KAAKI,cAC/CJ,KAAKgB,MAAMC,iBAAiB,YAAajB,KAAKI,cAC9CJ,KAAKgB,MAAMC,iBAAiB,WAAYjB,KAAKI,cAEjD,CAEAc,cAAAA,GACE,MAA2B,oBAAb5F,UAA4B,iBAAkBA,SAASqG,eACvE,CAEAR,YAAAA,GACE,MAAMS,EAAiB9C,EAAQkB,KAAM,oCACrC,OAAO4B,GAAkBA,EAAeC,UAAUC,SAAS,KAC7D,CAEAV,eAAAA,GAEE,QADctC,EAAQkB,KAAM,0BAE9B,CAEAG,YAAAA,GACEH,KAAKgB,MAAMd,MAAS,GAAEF,KAAKH,SAC3BG,KAAK+B,cAAcC,MAAMpB,MAAS,GAAEZ,KAAKH,UACzCG,KAAKiC,OAAOD,MAAMrB,KAAQ,GAAEX,KAAKH,SACnC,CAeA,SAAImB,GACF,OAAOhB,KAAKzE,cAAc,QAC5B,CAEA,iBAAIwG,GACF,OAAO/B,KAAKzE,cAAe,IAAG9B,IAChC,CAEA,UAAIwI,GACF,OAAOjC,KAAKzE,cAAe,IAAG9B,IAChC,EC/EF,QAA+M,kCAA/M,EAAiT,+BAAjT,EAAuY,4BAAvY,EAA4a,uBAA5a,EAA2c,sBAA3c,EAAwe,qBCGzd,MAAMyI,UAA2BxC,YAAYC,WAAAA,IAAAC,GAAA,SAAAA,GAAA,KAK1DuC,aAAO,OACPC,WAAY,EAAK,KAsDjBC,gCAAmCtC,IAC3B,iBAAkBvH,QAAyB,UAAdwH,KAAKsC,MACtCvC,EAAEwC,gBACJ,EACD,KAUDC,mBAAqB9G,UACnB,MAAM+G,EAASzC,KAAK0C,cAEpB,GADe1C,KAAK2C,OAEXC,MAAMrB,IAAWA,EAAMsB,YAC9BJ,EAAOK,cAAgB9C,KAAK+C,oBAE5B,OAGF,MAAMC,EAAMxK,OAAOyK,iBACnBR,EAAO7B,MAAQ6B,EAAOK,YAAcE,EACpCP,EAAOS,OAAST,EAAOU,aAAeH,EACtChD,KAAKoD,eAAiBX,EAAOY,WAAW,MAExC,MAAMC,EAAMtD,KAAKuD,cAAchI,cAAc,OACvCiI,QA+RV,SAA0BF,GAExB,OAAO,IAAI5F,SAAQ,CAACG,EAAS4F,KAC3B,MAAMlC,EAAQ,IAAImC,MAClBnC,EAAMoC,OAAS,KACb9F,EAAQ,CAAE+C,MAAOW,EAAMX,MAAOsC,OAAQ3B,EAAM2B,QAAS,EAEvD3B,EAAMqC,QAAUH,EAChBlC,EAAMlG,IAAMiI,EAAIO,YAAcP,EAAIjI,GAAG,GAEzC,CAzSgCyI,CAAiBR,GAe7C,GAdAtD,KAAKoD,eAAeW,UAClBT,EACA,EACA,EACAE,EAAc5C,MACd4C,EAAcN,OACd,EACA,EACAT,EAAO7B,MACP6B,EAAOS,QAGTlD,KAAKmC,QAAUnC,KAAKoD,eAAeY,cAAchE,KAAK0C,cAAe,aACrE1C,KAAKoD,eAAea,UAAU,EAAG,EAAGjE,KAAK0C,cAAc9B,MAAOZ,KAAK0C,cAAcQ,QAC7ElD,KAAKkE,qBAAsB,CAC7B,MAAMC,EAAanE,KAAKmE,WACxBA,EAAWvD,MAAQuD,EAAWrB,YAC9BqB,EAAWjB,OAASiB,EAAWhB,aAC/BnD,KAAKoE,YAAcD,EAAWd,WAAW,MAEzCrD,KAAKuD,cAAcvB,MAAMqC,gBAAmB,OAAMrE,KAAKmE,WAAWG,eAClEtE,KAAKuD,cAAcvB,MAAMuC,UAAa,OAAMvE,KAAKmE,WAAWG,cAC9D,CAEAtE,KAAK+C,oBAAsBN,EAAOK,WAAW,EAC9C,KAoBD0B,mBAAsBzE,IACpB,MAAM0E,EAAY3F,EAAQiB,EAAEE,OAAS,IAAGyE,KACnCD,GAAczE,KAAK8B,SAAS2C,IAA2B,IAAb1E,EAAEkC,SAGjDlC,EAAEwC,iBACFvC,KAAK2E,UAAW,EAChB3E,KAAK4E,aAAa5C,MAAM6C,cAAgB,OAEpC,iBAAkBrM,QACpB8C,SAASwJ,KAAK7D,iBAAiB,cAAejB,KAAK+E,oBACnDzJ,SAASwJ,KAAK7D,iBAAiB,YAAajB,KAAKgF,kBACjD1J,SAASwJ,KAAK7D,iBAAiB,gBAAiBjB,KAAKiF,uBAC5C,iBAAkB3J,SAASqG,iBACpCrG,SAASwJ,KAAK7D,iBAAiB,YAAajB,KAAK+E,mBAAoB,CAAEG,SAAS,IAChF5J,SAASwJ,KAAK7D,iBAAiB,WAAYjB,KAAKgF,kBAChD1J,SAASwJ,KAAK7D,iBAAiB,cAAejB,KAAKiF,wBAEnD3J,SAASwJ,KAAK7D,iBAAiB,YAAajB,KAAK+E,oBACjDzJ,SAASwJ,KAAK7D,iBAAiB,UAAWjB,KAAKgF,mBAG7ChF,KAAKkE,uBACPlE,KAAK0C,cAAcV,MAAMmD,WAAa,GACtCnF,KAAK0C,cAAcV,MAAMoD,QAAU,EACnCpF,KAAKoD,eAAea,UAAU,EAAG,EAAGjE,KAAK0C,cAAc9B,MAAOZ,KAAK0C,cAAcQ,SAGnFlD,KAAK+E,mBAAmBhF,GACxBC,KAAK+E,mBAAmBhF,GAAE,EAC3B,KAEDgF,mBAAsBhF,IACpBA,EAAEwC,iBACFxC,EAAEsF,2BACF,MAAMZ,EAAY3F,EAAQiB,EAAEE,OAAS,IAAGyE,KACxC,IAAIY,EACAC,EACCd,EAGM,iBAAkBjM,QAC3B8M,EAAUvF,EAAEuF,QACZC,EAAUxF,EAAEwF,SACH,iBAAkBjK,SAASqG,iBACpC2D,EAAUvF,EAAEyF,cAAc,GAAGC,MAAQhB,EAAUiB,WAC/CH,EAAUxF,EAAEyF,cAAc,GAAGG,MAAQlB,EAAUmB,YAE/CN,EAAUvF,EAAEuF,QACZC,EAAUxF,EAAEwF,UAVZD,GAAW,EACXC,GAAW,GAWb,MAAMvC,EAAMxK,OAAOyK,iBACnBjD,KAAK6F,UAAU7F,KAAKoD,eAAgBpD,KAAK8F,QAAS,CAAER,UAASC,WAAWvF,KAAKmC,QAASa,GACtFhD,KAAK6F,UAAU7F,KAAKoE,YAAapE,KAAK8F,QAAS,CAAER,UAASC,WAAW,QAAS,GAC9EvF,KAAK8F,QAAU,CAAER,UAASC,UAAS,EACpC,KAgCDQ,kBAAoB,YACX/F,KAAK8F,OAAO,EACpB,KAEDb,qBAAwBlF,IACtBC,KAAK2E,UAAW,EAChB7G,YAAW,KACTkC,KAAK2E,UAAW,CAAK,GACpB,KACH3E,KAAKgF,iBAAiBjF,EAAE,EACzB,KAEDiF,iBAAmB,YACVhF,KAAK8F,QAER,iBAAkBtN,QACpB8C,SAASwJ,KAAKpD,oBAAoB,cAAe1B,KAAK+E,oBACtDzJ,SAASwJ,KAAKpD,oBAAoB,YAAa1B,KAAKgF,kBACpD1J,SAASwJ,KAAKpD,oBAAoB,gBAAiB1B,KAAKiF,uBAC/C,iBAAkB3J,SAASqG,iBACpCrG,SAASwJ,KAAKpD,oBAAoB,YAAa1B,KAAK+E,oBAAoB,GACxEzJ,SAASwJ,KAAKpD,oBAAoB,WAAY1B,KAAKgF,kBACnD1J,SAASwJ,KAAKpD,oBAAoB,cAAe1B,KAAKiF,wBAEtD3J,SAASwJ,KAAKpD,oBAAoB,YAAa1B,KAAK+E,oBACpDzJ,SAASwJ,KAAKpD,oBAAoB,UAAW1B,KAAKgF,mBAGhDhF,KAAKkE,uBAEPlE,KAAKuD,cAAcvB,MAAMqC,gBAAmB,OAAMrE,KAAKmE,WAAWG,eAClEtE,KAAKuD,cAAcvB,MAAMuC,UAAa,OAAMvE,KAAKmE,WAAWG,eAC5DtE,KAAK0C,cAAcV,MAAMmD,WAAa,kCACtCnF,KAAK0C,cAAcV,MAAMoD,QAAU,EACnCpF,KAAKuD,cAAcvB,MAAMoD,QAAU,GAErCpF,KAAK4E,aAAa5C,MAAM6C,cAAgB,OACxC7E,KAAKgG,gBAAgB,EACtB,KAsBDC,YAAc,KACZjG,KAAK2E,UAAW,EAChB3E,KAAKkG,MAAQlG,KAAKkG,IAAI,EACvB,KAEDC,iBAAmB,KACjBnI,QAAQoI,IAAI,sBACZpG,KAAKoE,YAAYiC,OACjBrG,KAAKoE,YAAYkC,UAAY,QAC7BtI,QAAQoI,IAAIpG,KAAKmE,WAAWvD,MAAOZ,KAAKmE,WAAWjB,QACnDlD,KAAKoE,YAAYmC,SAAS,EAAG,EAAGvG,KAAKmE,WAAWvD,MAAOZ,KAAKmE,WAAWjB,QACvElD,KAAKoE,YAAYoC,UACjBxG,KAAKuD,cAAcvB,MAAMqC,gBAAmB,OAAMrE,KAAKmE,WAAWG,eAClEtE,KAAKuD,cAAcvB,MAAMuC,UAAa,OAAMvE,KAAKmE,WAAWG,eAC5DtE,KAAKuD,cAAcvB,MAAMoD,QAAU,EACnCpF,KAAKgG,iBACLhG,KAAKyG,cAAcjF,aAAa,WAAY,IAE5CxB,KAAK0G,WAAWC,OAAO,CACxB,CA7SD,6BAAWC,GACT,MAAO,CAAC,OACV,CAKA7F,iBAAAA,GACE,MAAM8F,ECbH,SAAkB7L,EAAU8L,GACjC,IAAIC,EACAC,EAAW,EA+Bf,OA7BA,YAAoBpH,GAClB,IAAInH,EAAOuH,KACPiH,EAAUC,OAAO,IAAI3P,MAAUyP,EAEnC,SAASG,IACPH,EAAWE,OAAO,IAAI3P,MACtByD,EAASoM,MAAM3O,EAAMmH,EACvB,CAMIkH,EAAQO,eAAiBN,GAC3BI,IAEEJ,GACFO,aAAaP,QAGc5M,IAAzB2M,EAAQO,cAA8BJ,EAAUH,EAAQS,MAC1DJ,KACgC,IAAvBL,EAAQU,aACjBT,EAAYjJ,WACVgJ,EAAQO,aAfZ,WACEN,OAAY5M,CACd,EAamCgN,OACNhN,IAAzB2M,EAAQO,aAA6BP,EAAQS,MAAQN,EAAUH,EAAQS,OAG7E,CAEF,CDrBuCE,CAASzH,KAAKwC,mBAAoB,CAAE+E,MAAO,MAE9E,GAAIvH,KAAKmB,gBAAkBnB,KAAKoB,kBAAmB,CAClC7B,EAAQS,KAAKqB,iBAAiB,QACtCC,SAASC,IACdA,EAAMC,aAAa,QAAS,QAAQ,GAExC,CAEI,iBAAkBhJ,QACpB8C,SAASwJ,KAAK7D,iBAAiB,cAAejB,KAAKwE,oBACnDxE,KAAK4E,aAAa3D,iBAAiB,eAAgBlB,GAAMA,EAAEsF,6BAC3DrF,KAAKyG,cAAcxF,iBAAiB,eAAgBlB,GAAMA,EAAEsF,8BACnD,iBAAkB/J,SAASqG,iBACpCrG,SAASwJ,KAAK7D,iBAAiB,aAAcjB,KAAKwE,oBAClDlJ,SAASwJ,KAAK7D,iBAAiB,YAAajB,KAAKqC,gCAAiC,CAChF6C,SAAS,IAEXlF,KAAK4E,aAAa3D,iBAAiB,cAAelB,GAAMA,EAAEsF,6BAC1DrF,KAAKyG,cAAcxF,iBAAiB,cAAelB,GAAMA,EAAEsF,+BAE3D/J,SAASwJ,KAAK7D,iBAAiB,YAAajB,KAAKwE,oBACjDxE,KAAK4E,aAAa3D,iBAAiB,aAAclB,GAAMA,EAAEsF,6BACzDrF,KAAKyG,cAAcxF,iBAAiB,aAAclB,GAAMA,EAAEsF,8BAE5DwB,IAEArO,OAAOyI,iBAAiB,SAAU4F,GAClC7G,KAAKqB,iBAAiB,OAAOC,SAASgC,GACpCA,EAAIrC,iBAAiB,OAAQ4F,KAG/B7G,KAAK4E,aAAa3D,iBAAiB,QAASjB,KAAKiG,aACjDjG,KAAKyG,cAAcxF,iBAAiB,QAASjB,KAAKmG,kBAClDnG,KAAK0H,SAASzG,iBAAiB,QAASjB,KAAKiG,YAC/C,CAEAxE,oBAAAA,GACEzB,KAAK2H,iBAAiBjG,oBAAoB,cAAe1B,KAAKwE,oBAC9DxE,KAAK4E,aAAalD,oBAAoB,QAAS1B,KAAKiG,aACpDjG,KAAKyG,cAAc/E,oBAAoB,QAAS1B,KAAKmG,kBACrDnG,KAAK0H,SAAShG,oBAAoB,QAAS1B,KAAKiG,YAClD,CAEA2B,wBAAAA,CAAyBhO,GACvB,GACO,SADCA,EAEJoG,KAAK6H,cAEX,CAQAA,YAAAA,GACM7H,KAAKkG,KACPlG,KAAK2H,iBAAiB3F,MAAM8F,YAAY,eAAgB,QAExD9H,KAAK2H,iBAAiB3F,MAAM8F,YAAY,eAAgB,QAE5D,CA8CA3G,YAAAA,GACE,MAAMS,EAAiB9C,EAAQkB,KAAM,oCACrC,OAAO4B,GAAkBA,EAAeC,UAAUC,SAAS,KAC7D,CAEAV,eAAAA,GAEE,QADctC,EAAQkB,KAAM,0BAE9B,CAEAkE,kBAAAA,GAAqB,IAAA6D,EAAAC,EAEnB,OACQ,OAAND,EAAAvP,SAAW,OAALuP,EAANA,EAAQE,MAAa,MAArBF,EAAaG,cAAQ,EAArBH,EAAaG,SAAW,0BAClB,OADwCF,EAC9CxP,SAAW,OAALwP,EAANA,EAAQC,MAAa,MAArBD,EAAaE,cAAQ,EAArBF,EAAaE,SAAW,+BAE5B,CA2DArC,SAAAA,CAAUsC,EAAKrC,EAASsC,EAASC,EAAMrF,GACrC,MACMsF,EAAY,GAAK,IADJrR,KAAK6J,IAAI,KAAMtI,OAAO+P,aAEnC,MAAE3H,EAAK,OAAEsC,GAAWiF,EAAI1F,OAE9B0F,EAAI9B,OACJ8B,EAAIK,YAAcH,EAClBF,EAAIG,UAAYA,EAAYtF,EAC5BmF,EAAIM,QAAU,QAGZ3C,GACAsC,GACAtC,EAAQR,QAAU,GAClBQ,EAAQR,QAAU1E,GAClBkF,EAAQP,QAAU,GAClBO,EAAQP,QAAUrC,GAClBkF,EAAQ9C,QAAU,GAClB8C,EAAQ9C,QAAU1E,GAClBwH,EAAQ7C,QAAU,GAClB6C,EAAQ7C,QAAUrC,IAElBiF,EAAIO,YACJP,EAAIQ,OAAO7C,EAAQR,QAAUtC,EAAK8C,EAAQP,QAAUvC,GACpDmF,EAAIS,OAAOR,EAAQ9C,QAAUtC,EAAKoF,EAAQ7C,QAAUvC,GACpDmF,EAAIU,UAENV,EAAI3B,SACN,CA0CAR,cAAAA,GACE,GAAIhG,KAAKoC,UACP,OAEF,MAAM+B,EAAanE,KAAKmE,WAClB2E,EAAY9I,KAAKoE,YAAY2E,aAAa,EAAG,EAAG5E,EAAWvD,MAAOuD,EAAWjB,QAEnF,IAAI8F,EAAQ,EACRC,EAASH,EAAUI,KAAK9Q,OAAS,EACrC,IAAK,IAAI+Q,EAAI,EAAGA,EAAIF,EAAQE,IAC1BH,GAASF,EAAUI,KAAS,EAAJC,EAAQ,GAElBH,EAAQC,EACV,MACZjJ,KAAKoC,WAAY,EACjBpC,KAAK+B,cAAcP,aAAa,cAAe,QAC/CxB,KAAKuD,cAAc/B,aAAa,cAAe,SAEnD,CAuBA,YAAIkG,GACF,OAAO1H,KAAKzE,cAAe,IAAGmJ,MAChC,CAEA,gBAAIE,GACF,OAAO5E,KAAKzE,cAAc,uBAC5B,CAEA,iBAAIkL,GACF,OAAOzG,KAAKzE,cAAc,0BAC5B,CAEA,UAAIoH,GAEF,OAAOyG,MAAMC,KAAKrJ,KAAKqB,iBAAiB,OAC1C,CAEA,oBAAIsG,GACF,OAAO3H,KAAKzE,cAAe,IAAGmJ,IAChC,CAEA,iBAAIhC,GACF,OAAO1C,KAAKzE,cAAe,IAAGmJ,IAChC,CAEA,cAAIP,GACF,OAAOnE,KAAKzE,cAAe,IAAGmJ,IAChC,CAEA,iBAAI3C,GACF,OAAO/B,KAAKzE,cAAe,IAAGmJ,IAChC,CAEA,iBAAInB,GACF,OAAOvD,KAAKzE,cAAe,IAAGmJ,IAChC,CAEA,cAAIgC,GACF,OAAO1G,KAAKzE,cAAe,IAAGmJ,QAChC,CAEA,QAAIwB,GACF,OAAOlG,KAAKsJ,aAAa,OAC3B,CAEA,QAAIpD,CAAKqD,GACMC,KAAKC,MAAMF,GAEtBvJ,KAAKwB,aAAa,OAAQ,IAE1BxB,KAAK0J,gBAAgB,OAEzB,CAEA,YAAI/E,CAAS4E,GACPA,EACFvJ,KAAKwB,aAAa,YAAa,IAE/BxB,KAAK0J,gBAAgB,YAEzB,CAEA,YAAI/E,GACF,OAAO3E,KAAKsJ,aAAa,YAC3B,E,gME3WF,MAAMK,GAAMhQ,EAAAA,EAAAA,eAAciQ,oBAAcC,SAExC,SAASC,EAAWC,EAAapK,QACgB,IAApCqK,eAAeC,IAAIF,IAC5BC,eAAeE,OAAOH,EAAapK,EAEvC,CAAC,IAAAwK,EAAAC,EAAA,iBAAAC,EAAAD,EAAA,gBAAAE,EAAAF,EAAA,WAAAG,EAAAH,EAAA,iBAAAI,EAAAJ,EAAA,uBAAAK,EAAAL,EAAA,sBAED,MAAMM,UAAmBhL,YAAYC,WAAAA,IAAAC,GAAA,SAAAA,GAAAjH,OAAA0B,eAAA,KAAAoQ,EAAA,CAAAvK,MAAAyK,IAAAhS,OAAA0B,eAAA,KAAAmQ,EAAA,CAAAtK,MAAA0K,IAAAjS,OAAA0B,eAAA,KAAAkQ,EAAA,CAAArK,MAAA2K,IAAAlS,OAAA0B,eAAA,KAAA8P,EAAA,CAAAW,UAAA,EAAA5K,WAAA,IAAAvH,OAAA0B,eAAA,KAAAgQ,EAAA,CAAAS,UAAA,EAAA5K,WAAA,IAAAvH,OAAA0B,eAAA,KAAAiQ,EAAA,CAAAQ,UAAA,EAAA5K,WAAA,IAKnCa,iBAAAA,GACE+I,EAAW,kBAAmBrK,GAC9BqK,EAAW,0BAA2B5H,GAEtC6I,EAAA/K,KAAIuK,GAAAA,KACJQ,EAAA/K,KAAIwK,GAAAA,IACN,CAEA/I,oBAAAA,GACEsJ,EAAA/K,KAAIyK,GAAAA,IACN,EAsDD,SAAAI,IA/CGE,EAAA/K,KAAIsK,GAAAA,GAAYpO,EAAc,iBAAkB,CAC9CE,YAAa4O,aACb3O,eAAgB,CACdgB,OAAQ,KACRJ,GAAI+C,KAAKiL,QAAQC,SAGvB,CAAC,SAAAN,IAGCG,EAAA/K,KAAImK,GAAAA,GAAkB,IAAIgB,sBAAsBC,IAAY,IAAAC,EAC3C,OAAXA,EAACD,EAAQ,KAARC,EAAYC,iBAGjBP,EAAA/K,KAAImK,GAAAA,GAAgBoB,aACpBR,EAAA/K,KAAIqK,GAAAA,GAAemB,QAAQxL,MAC3B+K,EAAA/K,KAAIsK,GAAAA,GAAUhM,yBAAyB,CACrCmN,OAAQC,EAAYC,cACpBzC,KAAM,CACJ0C,KAAMC,EAAkBC,SAE1B,GACD,CAAC,GAEJf,EAAA/K,KAAIqK,GAAAA,GAAiB,IAAIc,sBACtBC,IAAY,IAAAW,EACI,OAAXA,EAACX,EAAQ,KAARW,EAAYT,iBAGjBP,EAAA/K,KAAIqK,GAAAA,GAAekB,aACnBR,EAAA/K,KAAIsK,GAAAA,GAAUhM,yBAAyB,CACrCmN,OAAQC,EAAYC,cACpBzC,KAAM,CACJ0C,KAAMC,EAAkBG,QAE1B,GAEJ,CAAEC,UAAW,CAAC,GAAIC,WAAY,0BAGhCnB,EAAA/K,KAAImK,GAAAA,GAAgBqB,QAAQxL,KAC9B,CAAC,SAAA2K,IAEqB,IAAAwB,EAAAC,EAChB,OAAJD,EAAApB,EAAA/K,KAAImK,GAAAA,KAAJgC,EAAqBZ,aACjB,OAAJa,EAAArB,EAAA/K,KAAIqK,GAAAA,KAAJ+B,EAAoBb,YACtB,CAGGvB,eAAeC,IAAIN,IACtBK,eAAeE,OAAOP,EAAKe,E","sources":["webpack://dh-beforeafter-v2/./node_modules/cuid/index.js","webpack://dh-beforeafter-v2/./node_modules/cuid/lib/fingerprint.browser.js","webpack://dh-beforeafter-v2/./node_modules/cuid/lib/getRandomValue.browser.js","webpack://dh-beforeafter-v2/./node_modules/cuid/lib/pad.js","webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-server-libs/get-element-tag.js","webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-server-libs/src/get-element-tag.js","webpack://dh-beforeafter-v2/webpack/bootstrap","webpack://dh-beforeafter-v2/./node_modules/@nrk/nrkno-snowplow/node_modules/@nrk/snowplow-web/index.js","webpack://dh-beforeafter-v2/./node_modules/@nrk/nrkno-snowplow/build-npm/nrkno-snowplow.package.mjs","webpack://dh-beforeafter-v2/./node_modules/@nrk/snowplow-web/index.js","webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-snowplow/dist/index.mjs","webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-snowplow/dist/shared/dh-snowplow.1ee613bf.mjs","webpack://dh-beforeafter-v2/./src/components/before-after.module.css?6382","webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-basis-common/dist/index.esm.js","webpack://dh-beforeafter-v2/./src/components/before-after.js","webpack://dh-beforeafter-v2/./src/components/scratch-before-after.module.css?88d8","webpack://dh-beforeafter-v2/./src/components/scratch-before-after.js","webpack://dh-beforeafter-v2/./src/lib/utils.js","webpack://dh-beforeafter-v2/./src/client.js"],"sourcesContent":["/**\n * cuid.js\n * Collision-resistant UID generator for browsers and node.\n * Sequential for fast db lookups and recency sorting.\n * Safe for element IDs and server-side lookups.\n *\n * Extracted from CLCTR\n *\n * Copyright (c) Eric Elliott 2012\n * MIT License\n */\n\nvar fingerprint = require('./lib/fingerprint.js');\nvar pad = require('./lib/pad.js');\nvar getRandomValue = require('./lib/getRandomValue.js');\n\nvar c = 0,\n blockSize = 4,\n base = 36,\n discreteValues = Math.pow(base, blockSize);\n\nfunction randomBlock () {\n return pad((getRandomValue() *\n discreteValues << 0)\n .toString(base), blockSize);\n}\n\nfunction safeCounter () {\n c = c < discreteValues ? c : 0;\n c++; // this is not subliminal\n return c - 1;\n}\n\nfunction cuid () {\n // Starting with a lowercase letter makes\n // it HTML element ID friendly.\n var letter = 'c', // hard-coded allows for sequential access\n\n // timestamp\n // warning: this exposes the exact date and time\n // that the uid was created.\n timestamp = (new Date().getTime()).toString(base),\n\n // Prevent same-machine collisions.\n counter = pad(safeCounter().toString(base), blockSize),\n\n // A few chars to generate distinct ids for different\n // clients (so different computers are far less\n // likely to generate the same id)\n print = fingerprint(),\n\n // Grab some more chars from Math.random()\n random = randomBlock() + randomBlock();\n\n return letter + timestamp + counter + print + random;\n}\n\ncuid.slug = function slug () {\n var date = new Date().getTime().toString(36),\n counter = safeCounter().toString(36).slice(-4),\n print = fingerprint().slice(0, 1) +\n fingerprint().slice(-1),\n random = randomBlock().slice(-2);\n\n return date.slice(-2) +\n counter + print + random;\n};\n\ncuid.isCuid = function isCuid (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n if (stringToCheck.startsWith('c')) return true;\n return false;\n};\n\ncuid.isSlug = function isSlug (stringToCheck) {\n if (typeof stringToCheck !== 'string') return false;\n var stringLength = stringToCheck.length;\n if (stringLength >= 7 && stringLength <= 10) return true;\n return false;\n};\n\ncuid.fingerprint = fingerprint;\n\nmodule.exports = cuid;\n","var pad = require('./pad.js');\n\nvar env = typeof window === 'object' ? window : self;\nvar globalCount = Object.keys(env).length;\nvar mimeTypesLength = navigator.mimeTypes ? navigator.mimeTypes.length : 0;\nvar clientId = pad((mimeTypesLength +\n navigator.userAgent.length).toString(36) +\n globalCount.toString(36), 4);\n\nmodule.exports = function fingerprint () {\n return clientId;\n};\n","\nvar getRandomValue;\n\nvar crypto = typeof window !== 'undefined' &&\n (window.crypto || window.msCrypto) ||\n typeof self !== 'undefined' &&\n self.crypto;\n\nif (crypto) {\n var lim = Math.pow(2, 32) - 1;\n getRandomValue = function () {\n return Math.abs(crypto.getRandomValues(new Uint32Array(1))[0] / lim);\n };\n} else {\n getRandomValue = Math.random;\n}\n\nmodule.exports = getRandomValue;\n","module.exports = function pad (num, size) {\n var s = '000000000' + num;\n return s.substr(s.length - size);\n};\n","module.exports = require('./src/get-element-tag')\n","/**\n * Creates a valid custom element name that is versioned (major)\n */\nfunction getElementTag(name, version) {\n const formattedVersion = version ? `-v${version.split('.')[0]}` : ''\n return name + formattedVersion\n}\n\nmodule.exports.getElementTag = getElementTag\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/nrk-types.ts\nvar ClickEventKind = /* @__PURE__ */ ((ClickEventKind2) => {\n ClickEventKind2[\"Content\"] = \"content\";\n ClickEventKind2[\"Other\"] = \"other\";\n return ClickEventKind2;\n})(ClickEventKind || {});\nvar ImpressionEventKind = /* @__PURE__ */ ((ImpressionEventKind2) => {\n ImpressionEventKind2[\"Impression\"] = \"impression\";\n return ImpressionEventKind2;\n})(ImpressionEventKind || {});\nvar PlaybackEventKind = /* @__PURE__ */ ((PlaybackEventKind2) => {\n PlaybackEventKind2[\"Complete\"] = \"complete\";\n PlaybackEventKind2[\"Exit\"] = \"exit\";\n PlaybackEventKind2[\"Progress\"] = \"progress\";\n PlaybackEventKind2[\"Start\"] = \"start\";\n return PlaybackEventKind2;\n})(PlaybackEventKind || {});\nvar SearchSource = /* @__PURE__ */ ((SearchSource2) => {\n SearchSource2[\"PopularSearch\"] = \"popular-search\";\n SearchSource2[\"PreviousResult\"] = \"previous-result\";\n SearchSource2[\"Search\"] = \"search\";\n return SearchSource2;\n})(SearchSource || {});\nvar ViewportEventKind = /* @__PURE__ */ ((ViewportEventKind2) => {\n ViewportEventKind2[\"Entry\"] = \"entry\";\n ViewportEventKind2[\"Exit\"] = \"exit\";\n return ViewportEventKind2;\n})(ViewportEventKind || {});\nvar EventSchema = /* @__PURE__ */ ((EventSchema3) => {\n EventSchema3[\"BackstageEvent\"] = \"iglu:no.nrk.innlogging/backstage-event/jsonschema/1-0-0\";\n EventSchema3[\"ClickEvent\"] = \"iglu:no.nrk/click-event/jsonschema/1-0-0\";\n EventSchema3[\"FrontstageServerEvent\"] = \"iglu:no.nrk.innlogging/frontstage-server-event/jsonschema/1-0-0\";\n EventSchema3[\"ImpressionEvent\"] = \"iglu:no.nrk/impression-event/jsonschema/1-0-0\";\n EventSchema3[\"LoginRegisterFlowEvent\"] = \"iglu:no.nrk.innlogging/login-register-flow-event/jsonschema/1-0-0\";\n EventSchema3[\"PlaybackEvent\"] = \"iglu:no.nrk/playback-event/jsonschema/1-0-0\";\n EventSchema3[\"ProfilePageEvent\"] = \"iglu:no.nrk.innlogging/profile-page-event/jsonschema/1-0-0\";\n EventSchema3[\"RadioEvent\"] = \"iglu:no.nrk.radio/radio-event/jsonschema/1-0-0\";\n EventSchema3[\"SearchEvent\"] = \"iglu:no.nrk/search-event/jsonschema/1-0-0\";\n EventSchema3[\"StepEvent\"] = \"iglu:no.nrk.dh/step-event/jsonschema/1-0-0\";\n EventSchema3[\"TimeSpentEvent\"] = \"iglu:no.nrk/time-spent-event/jsonschema/1-0-0\";\n EventSchema3[\"ViewportEvent\"] = \"iglu:no.nrk.dh/viewport-event/jsonschema/1-0-0\";\n return EventSchema3;\n})(EventSchema || {});\nvar EntitySchema = /* @__PURE__ */ ((EntitySchema2) => {\n EntitySchema2[\"ClientID\"] = \"iglu:no.nrk.innlogging/client-id/jsonschema/1-0-0\";\n EntitySchema2[\"Content\"] = \"iglu:no.nrk/content/jsonschema/1-0-1\";\n EntitySchema2[\"Experiment\"] = \"iglu:no.nrk/experiment/jsonschema/1-0-0\";\n EntitySchema2[\"Link\"] = \"iglu:no.nrk/link/jsonschema/2-0-0\";\n EntitySchema2[\"NrkSession\"] = \"iglu:no.nrk/nrk-session/jsonschema/1-0-0\";\n EntitySchema2[\"NrkUser\"] = \"iglu:no.nrk/nrk-user/jsonschema/1-0-0\";\n EntitySchema2[\"Plug\"] = \"iglu:no.nrk/plug/jsonschema/3-0-0\";\n EntitySchema2[\"PreviousWebPage\"] = \"iglu:no.nrk/previous-web-page/jsonschema/1-0-0\";\n EntitySchema2[\"RegistrationContext\"] = \"iglu:no.nrk.innlogging/registration-context/jsonschema/1-0-0\";\n EntitySchema2[\"SearchResult\"] = \"iglu:no.nrk/search-result/jsonschema/1-0-1\";\n EntitySchema2[\"Service\"] = \"iglu:no.nrk/service/jsonschema/2-0-0\";\n EntitySchema2[\"Application\"] = \"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\";\n return EntitySchema2;\n})(EntitySchema || {});\n\n// src/nrk-base-tracker.ts\nimport cuid from \"cuid\";\nvar NrkBaseTracker = class {\n constructor(snowplow, config) {\n this.sharedEntities = {};\n var _a, _b, _c;\n this.snowplow = snowplow;\n this.trackerId = (_a = config.trackerId) != null ? _a : cuid.slug();\n this.setSharedEntity(\"iglu:no.nrk/service/jsonschema/2-0-0\" /* Service */, { id: config.serviceId, environment: (_b = config.environment) != null ? _b : null });\n if (config.appVersion && config.appBuild) {\n this.setSharedEntity(\"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\" /* Application */, { build: config.appBuild, version: config.appVersion });\n }\n snowplow.newTracker(this.trackerId, config.collectorUrl, {\n postPath: \"/nrk/wd6\",\n appId: config.appId,\n plugins: config.plugins,\n platform: (_c = config.platform) != null ? _c : \"web\",\n contexts: {\n webPage: config.disableWebContext !== true\n },\n stateStorageStrategy: config.disableLocalStorage ? \"cookie\" : void 0\n });\n }\n /**\n * Track page view.\n */\n trackPageView(contentEntity) {\n if (contentEntity) {\n this.snowplow.trackPageView(\n {\n context: entitiesToContexts(__spreadProps(__spreadValues({}, this.sharedEntities), {\n [\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */]: contentEntity\n }))\n },\n [this.trackerId]\n );\n } else {\n this.snowplow.trackPageView({ context: entitiesToContexts(this.sharedEntities) }, [this.trackerId]);\n }\n }\n /**\n * Generic track event for custom schemas, typed up to only support NRK\n * events and entities. All shared entities are included, and can be\n * overridden by specified entities.\n */\n trackSchemaEvent(schema, data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackSelfDescribingEvent(\n {\n event: { schema, data: __spreadValues({}, data) },\n context\n },\n [this.trackerId]\n );\n }\n /**\n * Send a standard structured event.\n */\n trackEvent(data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackStructEvent(__spreadProps(__spreadValues({}, data), { context }), [this.trackerId]);\n }\n /**\n * Set the logged in user.\n */\n setUser(userId) {\n this.snowplow.setUserId(userId, [this.trackerId]);\n this.setSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */, { id: userId });\n }\n /**\n * Clear the user when logged out.\n */\n clearUser() {\n this.snowplow.setUserId(null, [this.trackerId]);\n this.removeSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */);\n }\n /**\n * Add a plugin to the tracker.\n */\n addPlugin(configuration) {\n this.snowplow.addPlugin(configuration, [this.trackerId]);\n }\n /**\n * Set data for a shared entity for all events of this tracker.\n *\n * The `snowplow.addGlobalContexts()` method could potentially be used, but\n * `removeGlobalContexts()` requires the data as argument as well (awkward),\n * and there's no `getGlobalContexts()` to help with that.\n */\n setSharedEntity(schema, data) {\n this.sharedEntities[schema] = data;\n }\n /**\n * Returns any shared entities for an entity schema.\n */\n getSharedEntity(schema) {\n return this.sharedEntities[schema];\n }\n /**\n * Remove all shared entities for an entity schema.\n */\n removeSharedEntity(schema) {\n if (schema in this.sharedEntities) {\n delete this.sharedEntities[schema];\n }\n }\n};\nfunction entitiesToContexts(entities) {\n const contexts = [];\n Object.entries(entities).forEach(([schema, data]) => {\n const dataList = Array.isArray(data) ? data : [data];\n for (const entityData of dataList) {\n contexts.push({ schema, data: __spreadValues({}, entityData) });\n }\n });\n return contexts;\n}\n\n// src/nrk-player-tracker.ts\nvar NrkPlayerTracker = class extends NrkBaseTracker {\n /**\n * Tell the tracker what the current media is.\n */\n setMedia(mediaId, details) {\n const content = { id: mediaId };\n if (details == null ? void 0 : details.source) {\n content.source = details == null ? void 0 : details.source;\n }\n if (details == null ? void 0 : details.kind) {\n content.kind = details == null ? void 0 : details.kind;\n }\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, content);\n if (details == null ? void 0 : details.channelId) {\n this.channelId = details.channelId;\n }\n if (details && \"autoplay\" in details && details.autoplay !== void 0) {\n this.autoplay = details.autoplay;\n }\n }\n /**\n * Set autoplay for the current media.\n */\n setMediaAutoplay(autoplay) {\n this.autoplay = autoplay;\n }\n /**\n * Tell the tracker that media is unknown (like for gaps in the EPG).\n */\n setUnknownMedia(channelId) {\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, { id: \"unknown\", kind: \"unknown\" });\n this.channelId = channelId;\n }\n /**\n * Send a playback event of kind 'start'.\n *\n * Should be called when time starts running:\n * - After changing media.\n * - After user pauses playback.\n * - At replay.\n */\n sendStartEvent(startTime, live) {\n if (this.getSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */) === void 0) {\n throw new Error(\"Must use setMedia() first!\");\n }\n const start = Math.max(0, Math.floor(startTime));\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind: \"start\" /* Start */,\n startTime: start,\n endTime: start,\n autoplay: this.autoplay,\n live,\n channelId: this.channelId\n });\n }\n /**\n * Send a playback event of kind 'progress'.\n *\n * Should be called when time stops for any reason other than complete or\n * exit.\n */\n sendProgressEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"progress\" /* Progress */, startTime, endTime, live);\n }\n /**\n * Send a playback event of kind 'complete'.\n *\n * Should be called when:\n * - Playback reaches the end (100%) of the media (for ODM it stops, for\n * channels it continues to play the next program in the EPG).\n * - When a skip-to-next media function is invoked when binging.\n */\n sendCompleteEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"complete\" /* Complete */, startTime, endTime != null ? endTime : startTime, live);\n }\n /**\n * Send a playback event of kind 'exit'.\n *\n * Should be called when leaving the media before a 'complete'-event is sent,\n * including when seeking away from a program in the EPG to another.\n */\n sendExitEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"exit\" /* Exit */, startTime, endTime != null ? endTime : startTime, live);\n }\n sendPlaybackEvent(kind, startTime, endTime, live) {\n const start = Math.max(0, Math.floor(startTime));\n const end = Math.max(0, Math.floor(endTime));\n if (start === end && kind === \"progress\" /* Progress */) {\n return;\n }\n if (start > end) {\n throw new Error(`Start time can't be after end time (${start} vs ${end}). Event was ${kind}`);\n }\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind,\n startTime: start,\n endTime: end,\n live,\n channelId: this.channelId\n });\n }\n};\n\n// src/service-id.ts\nvar ServiceID = /* @__PURE__ */ ((ServiceID2) => {\n ServiceID2[\"Embed\"] = \"embed\";\n ServiceID2[\"Nrkbeta\"] = \"nrkbeta\";\n ServiceID2[\"Nrkinnlogging\"] = \"nrkinnlogging\";\n ServiceID2[\"Nrkno\"] = \"nrkno\";\n ServiceID2[\"Nrkp3\"] = \"nrkp3\";\n ServiceID2[\"Nrkradio\"] = \"nrkradio\";\n ServiceID2[\"Nrksuper\"] = \"nrksuper\";\n ServiceID2[\"Nrktv\"] = \"nrktv\";\n ServiceID2[\"Yr\"] = \"yr\";\n return ServiceID2;\n})(ServiceID || {});\n\n// src/snowplow-global.ts\nvar SnowplowGlobal = class {\n constructor() {\n this.snowplow = window.snowplow;\n if (this.snowplow === void 0) {\n throw new Error(\"There is no global Snowplow function.\");\n }\n }\n /**\n * Check if the global API is available (provided by the \"Snowplow tag\"). No\n * distinction is made between sp.js and sp.lite.js.\n */\n static isAvailable() {\n return window.snowplow !== void 0;\n }\n /**\n * Modify newTracker() to support adding plugins via the tracker\n * configuration. See \"Creating your own plugins\" in the JavaScript tracker\n * Snowplow docs.\n *\n * Note: The tracker configuration hasn't been thoroughly checked for\n * inconsistencies between the global API and @snowplow/browser-tracker.\n * There might be issues.\n */\n newTracker(trackerId, collectorUrl, configuration) {\n this.snowplow(\"newTracker\", trackerId, collectorUrl, configuration);\n if ((configuration == null ? void 0 : configuration.plugins) !== void 0) {\n configuration.plugins.forEach((plugin) => {\n this.addPlugin({ plugin }, [trackerId]);\n });\n }\n }\n setUserId(...args) {\n this.proxy(\"setUserId\", args, 2);\n }\n trackPageView(...args) {\n this.proxy(\"trackPageView\", args, 2);\n }\n trackSelfDescribingEvent(...args) {\n this.proxy(\"trackSelfDescribingEvent\", args, 2);\n }\n trackStructEvent(...args) {\n this.proxy(\"trackStructEvent\", args, 2);\n }\n preservePageViewId(...args) {\n this.proxy(\"preservePageViewId\", args, 1);\n }\n addPlugin(config, trackers) {\n const args = [{ Plugin: () => config.plugin }, \"Plugin\", trackers];\n this.proxy(\"addPlugin\", args, args.length);\n }\n /**\n * Make a call to the global Snowplow API, with the specified method and\n * arguments. It only supports methods which have a `trackers` argument as\n * the last (optional) argument.\n *\n * The `trackers` argument of the Snowplow methods is optional and not always\n * in the same position. The `maxArgs` argument specifies the maximum number\n * of arguments the method supports and so in which position the `trackers`\n * argument is, when present. This is necessary in order to transform the use\n * of `trackers` between the Snowplow API and the global API. So if\n * `Args['length']` is `1 | 2`, then `maxArgs` should be 2.\n */\n proxy(method, args, maxArgs) {\n const trackerIds = args.length === maxArgs ? args.pop() : void 0;\n if (trackerIds && trackerIds.length > 0) {\n trackerIds.forEach((trackerId) => {\n this.snowplow(`${method}:${trackerId}`, ...args);\n });\n } else {\n this.snowplow(method, ...args);\n }\n }\n};\nexport {\n ClickEventKind,\n EntitySchema,\n EventSchema,\n ImpressionEventKind,\n NrkBaseTracker,\n NrkPlayerTracker,\n PlaybackEventKind,\n SearchSource,\n ServiceID,\n SnowplowGlobal,\n ViewportEventKind,\n entitiesToContexts\n};\n","import { EntitySchema, EventSchema } from '@nrk/snowplow-web';\n\n/**\n * Root path to snowplow bundle on static.nrk.no.\n */\nvar staticSnowplowRoot = \"https://static.nrk.no/nrkno-snowplow\";\n/**\n * The current major version\n */\nvar staticSnowplowMajorVersion = \"1\";\n\n//@ts-expect-error post-fix version to allow multiple versions to co-exists at the same time\nvar globalKey = \"nrknoOnTrackerReady-\" + staticSnowplowMajorVersion;\n\n/**\n * Modified version of @nrk/snowplow-web. Does not allow array or undefined\n */\n\n/**\n * Typecheck and generate `{schema, data}`\n */\nfunction getTyped(schema, data) {\n return {\n schema,\n data\n };\n}\n\n/**\n * No-op type check\n */\nfunction isTypedContext(_schema, _data) {}\n/**\n * No-op type check\n */\nfunction isTypedEvent(_schema, _data) {}\n/**\n * No-op type check\n */\nfunction isTyped(_schema, _data) {}\n\n/**\n * No-op type check\n */\nfunction isTypedArray(_schema, _data) {}\n\n/**\n * Typechecks a context and return the Snowplow type\n */\nfunction asSnowplowContext(data) {\n return data;\n}\nfunction asSnowplowEntity(data) {\n return data;\n}\n\nvar typeUtil = /*#__PURE__*/Object.freeze({\n __proto__: null,\n EntitySchema: EntitySchema,\n EventSchema: EventSchema,\n asSnowplowContext: asSnowplowContext,\n asSnowplowEntity: asSnowplowEntity,\n getTyped: getTyped,\n isTyped: isTyped,\n isTypedArray: isTypedArray,\n isTypedContext: isTypedContext,\n isTypedEvent: isTypedEvent\n});\n\n/// \n/**\n * Takes a callback that will be called with the bundled JS when ready.\n *\n * This function will load the major version (defined above in JS file) from `static.nrk.no`\n * @note the callback will never be called if a network error occurs.\n */\nfunction getBundle(callback) {\n // Add callback queue placeholder if needed\n if (globalThis[globalKey] === undefined) {\n //@ts-expect-error `q` is next line\n globalThis[globalKey] = function (cb) {\n globalThis[globalKey].q.push(cb);\n };\n globalThis[globalKey].q = [];\n }\n {\n // load script if needed\n loadOnce(staticSnowplowRoot + \"/major/\" + staticSnowplowMajorVersion + \"/nrkno-snowplow-entry.js\");\n }\n\n // add callback\n globalThis[globalKey](callback);\n}\n/**\n * loadOnce loads the given script IFF it is not already present in the DOM.\n * @param {string} src URL for script\n * @returns {undefined}\n */\nfunction loadOnce(src) {\n var hasScript = document.querySelector(\"script[src=\\\"\" + src + \"\\\"]\");\n if (hasScript) {\n return;\n }\n var script = document.createElement('script');\n script.async = true;\n script.src = src;\n document.head.appendChild(script);\n}\n\nexport { typeUtil as TypeUtils, getBundle };\n","var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// src/nrk-types.ts\nvar ClickEventKind = /* @__PURE__ */ ((ClickEventKind2) => {\n ClickEventKind2[\"Content\"] = \"content\";\n ClickEventKind2[\"Other\"] = \"other\";\n return ClickEventKind2;\n})(ClickEventKind || {});\nvar ImpressionEventKind = /* @__PURE__ */ ((ImpressionEventKind2) => {\n ImpressionEventKind2[\"Impression\"] = \"impression\";\n return ImpressionEventKind2;\n})(ImpressionEventKind || {});\nvar PlaybackEventKind = /* @__PURE__ */ ((PlaybackEventKind2) => {\n PlaybackEventKind2[\"Complete\"] = \"complete\";\n PlaybackEventKind2[\"Exit\"] = \"exit\";\n PlaybackEventKind2[\"Progress\"] = \"progress\";\n PlaybackEventKind2[\"Start\"] = \"start\";\n return PlaybackEventKind2;\n})(PlaybackEventKind || {});\nvar SearchSource = /* @__PURE__ */ ((SearchSource2) => {\n SearchSource2[\"PopularSearch\"] = \"popular-search\";\n SearchSource2[\"PreviousResult\"] = \"previous-result\";\n SearchSource2[\"Search\"] = \"search\";\n return SearchSource2;\n})(SearchSource || {});\nvar ViewportEventKind = /* @__PURE__ */ ((ViewportEventKind2) => {\n ViewportEventKind2[\"Entry\"] = \"entry\";\n ViewportEventKind2[\"Exit\"] = \"exit\";\n return ViewportEventKind2;\n})(ViewportEventKind || {});\nvar EventSchema = /* @__PURE__ */ ((EventSchema3) => {\n EventSchema3[\"BackstageEvent\"] = \"iglu:no.nrk.innlogging/backstage-event/jsonschema/1-0-0\";\n EventSchema3[\"ClickEvent\"] = \"iglu:no.nrk/click-event/jsonschema/1-0-0\";\n EventSchema3[\"FrontstageServerEvent\"] = \"iglu:no.nrk.innlogging/frontstage-server-event/jsonschema/1-0-0\";\n EventSchema3[\"ImpressionEvent\"] = \"iglu:no.nrk/impression-event/jsonschema/1-0-0\";\n EventSchema3[\"LoginRegisterFlowEvent\"] = \"iglu:no.nrk.innlogging/login-register-flow-event/jsonschema/1-0-0\";\n EventSchema3[\"PlaybackEvent\"] = \"iglu:no.nrk/playback-event/jsonschema/1-0-0\";\n EventSchema3[\"ProfilePageEvent\"] = \"iglu:no.nrk.innlogging/profile-page-event/jsonschema/1-0-0\";\n EventSchema3[\"RadioEvent\"] = \"iglu:no.nrk.radio/radio-event/jsonschema/1-0-0\";\n EventSchema3[\"SearchEvent\"] = \"iglu:no.nrk/search-event/jsonschema/1-0-0\";\n EventSchema3[\"StepEvent\"] = \"iglu:no.nrk.dh/step-event/jsonschema/1-0-0\";\n EventSchema3[\"TimeSpentEvent\"] = \"iglu:no.nrk/time-spent-event/jsonschema/1-0-0\";\n EventSchema3[\"ViewportEvent\"] = \"iglu:no.nrk.dh/viewport-event/jsonschema/1-0-0\";\n return EventSchema3;\n})(EventSchema || {});\nvar EntitySchema = /* @__PURE__ */ ((EntitySchema2) => {\n EntitySchema2[\"ClientID\"] = \"iglu:no.nrk.innlogging/client-id/jsonschema/1-0-0\";\n EntitySchema2[\"Content\"] = \"iglu:no.nrk/content/jsonschema/1-0-1\";\n EntitySchema2[\"Experiment\"] = \"iglu:no.nrk/experiment/jsonschema/1-0-0\";\n EntitySchema2[\"Link\"] = \"iglu:no.nrk/link/jsonschema/2-0-0\";\n EntitySchema2[\"NrkSession\"] = \"iglu:no.nrk/nrk-session/jsonschema/1-0-0\";\n EntitySchema2[\"NrkUser\"] = \"iglu:no.nrk/nrk-user/jsonschema/1-0-0\";\n EntitySchema2[\"Plug\"] = \"iglu:no.nrk/plug/jsonschema/3-0-0\";\n EntitySchema2[\"PreviousWebPage\"] = \"iglu:no.nrk/previous-web-page/jsonschema/1-0-0\";\n EntitySchema2[\"RegistrationContext\"] = \"iglu:no.nrk.innlogging/registration-context/jsonschema/1-0-0\";\n EntitySchema2[\"SearchResult\"] = \"iglu:no.nrk/search-result/jsonschema/1-0-1\";\n EntitySchema2[\"Service\"] = \"iglu:no.nrk/service/jsonschema/2-0-0\";\n EntitySchema2[\"Application\"] = \"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\";\n return EntitySchema2;\n})(EntitySchema || {});\n\n// src/nrk-base-tracker.ts\nimport cuid from \"cuid\";\nvar NrkBaseTracker = class {\n constructor(snowplow, config) {\n this.sharedEntities = {};\n var _a, _b, _c;\n this.snowplow = snowplow;\n this.trackerId = (_a = config.trackerId) != null ? _a : cuid.slug();\n this.setSharedEntity(\"iglu:no.nrk/service/jsonschema/2-0-0\" /* Service */, { id: config.serviceId, environment: (_b = config.environment) != null ? _b : null });\n if (config.appVersion && config.appBuild) {\n this.setSharedEntity(\"iglu:com.snowplowanalytics.mobile/application/jsonschema/1-0-0\" /* Application */, { build: config.appBuild, version: config.appVersion });\n }\n snowplow.newTracker(this.trackerId, config.collectorUrl, {\n postPath: \"/nrk/wd6\",\n appId: config.appId,\n plugins: config.plugins,\n platform: (_c = config.platform) != null ? _c : \"web\",\n contexts: {\n webPage: config.disableWebContext !== true\n },\n stateStorageStrategy: config.disableLocalStorage ? \"cookie\" : void 0\n });\n }\n /**\n * Track page view.\n */\n trackPageView(contentEntity) {\n if (contentEntity) {\n this.snowplow.trackPageView(\n {\n context: entitiesToContexts(__spreadProps(__spreadValues({}, this.sharedEntities), {\n [\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */]: contentEntity\n }))\n },\n [this.trackerId]\n );\n } else {\n this.snowplow.trackPageView({ context: entitiesToContexts(this.sharedEntities) }, [this.trackerId]);\n }\n }\n /**\n * Generic track event for custom schemas, typed up to only support NRK\n * events and entities. All shared entities are included, and can be\n * overridden by specified entities.\n */\n trackSchemaEvent(schema, data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackSelfDescribingEvent(\n {\n event: { schema, data: __spreadValues({}, data) },\n context\n },\n [this.trackerId]\n );\n }\n /**\n * Send a standard structured event.\n */\n trackEvent(data, entities) {\n const context = entitiesToContexts(__spreadValues(__spreadValues({}, this.sharedEntities), entities));\n this.snowplow.trackStructEvent(__spreadProps(__spreadValues({}, data), { context }), [this.trackerId]);\n }\n /**\n * Set the logged in user.\n */\n setUser(userId) {\n this.snowplow.setUserId(userId, [this.trackerId]);\n this.setSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */, { id: userId });\n }\n /**\n * Clear the user when logged out.\n */\n clearUser() {\n this.snowplow.setUserId(null, [this.trackerId]);\n this.removeSharedEntity(\"iglu:no.nrk/nrk-user/jsonschema/1-0-0\" /* NrkUser */);\n }\n /**\n * Add a plugin to the tracker.\n */\n addPlugin(configuration) {\n this.snowplow.addPlugin(configuration, [this.trackerId]);\n }\n /**\n * Set data for a shared entity for all events of this tracker.\n *\n * The `snowplow.addGlobalContexts()` method could potentially be used, but\n * `removeGlobalContexts()` requires the data as argument as well (awkward),\n * and there's no `getGlobalContexts()` to help with that.\n */\n setSharedEntity(schema, data) {\n this.sharedEntities[schema] = data;\n }\n /**\n * Returns any shared entities for an entity schema.\n */\n getSharedEntity(schema) {\n return this.sharedEntities[schema];\n }\n /**\n * Remove all shared entities for an entity schema.\n */\n removeSharedEntity(schema) {\n if (schema in this.sharedEntities) {\n delete this.sharedEntities[schema];\n }\n }\n};\nfunction entitiesToContexts(entities) {\n const contexts = [];\n Object.entries(entities).forEach(([schema, data]) => {\n const dataList = Array.isArray(data) ? data : [data];\n for (const entityData of dataList) {\n contexts.push({ schema, data: __spreadValues({}, entityData) });\n }\n });\n return contexts;\n}\n\n// src/nrk-player-tracker.ts\nvar NrkPlayerTracker = class extends NrkBaseTracker {\n /**\n * Tell the tracker what the current media is.\n */\n setMedia(mediaId, details) {\n const content = { id: mediaId };\n if (details == null ? void 0 : details.source) {\n content.source = details == null ? void 0 : details.source;\n }\n if (details == null ? void 0 : details.kind) {\n content.kind = details == null ? void 0 : details.kind;\n }\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, content);\n if (details == null ? void 0 : details.channelId) {\n this.channelId = details.channelId;\n }\n if (details && \"autoplay\" in details && details.autoplay !== void 0) {\n this.autoplay = details.autoplay;\n }\n }\n /**\n * Set autoplay for the current media.\n */\n setMediaAutoplay(autoplay) {\n this.autoplay = autoplay;\n }\n /**\n * Tell the tracker that media is unknown (like for gaps in the EPG).\n */\n setUnknownMedia(channelId) {\n this.setSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */, { id: \"unknown\", kind: \"unknown\" });\n this.channelId = channelId;\n }\n /**\n * Send a playback event of kind 'start'.\n *\n * Should be called when time starts running:\n * - After changing media.\n * - After user pauses playback.\n * - At replay.\n */\n sendStartEvent(startTime, live) {\n if (this.getSharedEntity(\"iglu:no.nrk/content/jsonschema/1-0-1\" /* Content */) === void 0) {\n throw new Error(\"Must use setMedia() first!\");\n }\n const start = Math.max(0, Math.floor(startTime));\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind: \"start\" /* Start */,\n startTime: start,\n endTime: start,\n autoplay: this.autoplay,\n live,\n channelId: this.channelId\n });\n }\n /**\n * Send a playback event of kind 'progress'.\n *\n * Should be called when time stops for any reason other than complete or\n * exit.\n */\n sendProgressEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"progress\" /* Progress */, startTime, endTime, live);\n }\n /**\n * Send a playback event of kind 'complete'.\n *\n * Should be called when:\n * - Playback reaches the end (100%) of the media (for ODM it stops, for\n * channels it continues to play the next program in the EPG).\n * - When a skip-to-next media function is invoked when binging.\n */\n sendCompleteEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"complete\" /* Complete */, startTime, endTime != null ? endTime : startTime, live);\n }\n /**\n * Send a playback event of kind 'exit'.\n *\n * Should be called when leaving the media before a 'complete'-event is sent,\n * including when seeking away from a program in the EPG to another.\n */\n sendExitEvent(startTime, endTime, live) {\n this.sendPlaybackEvent(\"exit\" /* Exit */, startTime, endTime != null ? endTime : startTime, live);\n }\n sendPlaybackEvent(kind, startTime, endTime, live) {\n const start = Math.max(0, Math.floor(startTime));\n const end = Math.max(0, Math.floor(endTime));\n if (start === end && kind === \"progress\" /* Progress */) {\n return;\n }\n if (start > end) {\n throw new Error(`Start time can't be after end time (${start} vs ${end}). Event was ${kind}`);\n }\n this.trackSchemaEvent(\"iglu:no.nrk/playback-event/jsonschema/1-0-0\" /* PlaybackEvent */, {\n kind,\n startTime: start,\n endTime: end,\n live,\n channelId: this.channelId\n });\n }\n};\n\n// src/service-id.ts\nvar ServiceID = /* @__PURE__ */ ((ServiceID2) => {\n ServiceID2[\"Embed\"] = \"embed\";\n ServiceID2[\"Nrkbeta\"] = \"nrkbeta\";\n ServiceID2[\"Nrkinnlogging\"] = \"nrkinnlogging\";\n ServiceID2[\"Nrkno\"] = \"nrkno\";\n ServiceID2[\"Nrkp3\"] = \"nrkp3\";\n ServiceID2[\"Nrkradio\"] = \"nrkradio\";\n ServiceID2[\"Nrksuper\"] = \"nrksuper\";\n ServiceID2[\"Nrktv\"] = \"nrktv\";\n ServiceID2[\"Yr\"] = \"yr\";\n return ServiceID2;\n})(ServiceID || {});\n\n// src/snowplow-global.ts\nvar SnowplowGlobal = class {\n constructor() {\n this.snowplow = window.snowplow;\n if (this.snowplow === void 0) {\n throw new Error(\"There is no global Snowplow function.\");\n }\n }\n /**\n * Check if the global API is available (provided by the \"Snowplow tag\"). No\n * distinction is made between sp.js and sp.lite.js.\n */\n static isAvailable() {\n return window.snowplow !== void 0;\n }\n /**\n * Modify newTracker() to support adding plugins via the tracker\n * configuration. See \"Creating your own plugins\" in the JavaScript tracker\n * Snowplow docs.\n *\n * Note: The tracker configuration hasn't been thoroughly checked for\n * inconsistencies between the global API and @snowplow/browser-tracker.\n * There might be issues.\n */\n newTracker(trackerId, collectorUrl, configuration) {\n this.snowplow(\"newTracker\", trackerId, collectorUrl, configuration);\n if ((configuration == null ? void 0 : configuration.plugins) !== void 0) {\n configuration.plugins.forEach((plugin) => {\n this.addPlugin({ plugin }, [trackerId]);\n });\n }\n }\n setUserId(...args) {\n this.proxy(\"setUserId\", args, 2);\n }\n trackPageView(...args) {\n this.proxy(\"trackPageView\", args, 2);\n }\n trackSelfDescribingEvent(...args) {\n this.proxy(\"trackSelfDescribingEvent\", args, 2);\n }\n trackStructEvent(...args) {\n this.proxy(\"trackStructEvent\", args, 2);\n }\n preservePageViewId(...args) {\n this.proxy(\"preservePageViewId\", args, 1);\n }\n addPlugin(config, trackers) {\n const args = [{ Plugin: () => config.plugin }, \"Plugin\", trackers];\n this.proxy(\"addPlugin\", args, args.length);\n }\n /**\n * Make a call to the global Snowplow API, with the specified method and\n * arguments. It only supports methods which have a `trackers` argument as\n * the last (optional) argument.\n *\n * The `trackers` argument of the Snowplow methods is optional and not always\n * in the same position. The `maxArgs` argument specifies the maximum number\n * of arguments the method supports and so in which position the `trackers`\n * argument is, when present. This is necessary in order to transform the use\n * of `trackers` between the Snowplow API and the global API. So if\n * `Args['length']` is `1 | 2`, then `maxArgs` should be 2.\n */\n proxy(method, args, maxArgs) {\n const trackerIds = args.length === maxArgs ? args.pop() : void 0;\n if (trackerIds && trackerIds.length > 0) {\n trackerIds.forEach((trackerId) => {\n this.snowplow(`${method}:${trackerId}`, ...args);\n });\n } else {\n this.snowplow(method, ...args);\n }\n }\n};\nexport {\n ClickEventKind,\n EntitySchema,\n EventSchema,\n ImpressionEventKind,\n NrkBaseTracker,\n NrkPlayerTracker,\n PlaybackEventKind,\n SearchSource,\n ServiceID,\n SnowplowGlobal,\n ViewportEventKind,\n entitiesToContexts\n};\n","import { getBundle } from '@nrk/nrkno-snowplow';\nimport { EntitySchema } from '@nrk/snowplow-web';\nimport { g as getHost } from './shared/dh-snowplow.1ee613bf.mjs';\n\nconst APP_ID = \"no.nrk.dh\";\nfunction resolveOrTimeout(promise, wait) {\n return Promise.race([\n promise.then(() => true),\n new Promise((resolve) => {\n setTimeout(() => {\n resolve(false);\n }, wait);\n })\n ]);\n}\nfunction createTracker(trackerId, { environment, contentContext }) {\n let trackerReady = false;\n let bundle;\n const host = getHost(environment);\n const eventQueue = [];\n const contexts = [\"service\", \"user\"];\n const trackOrQueue = (callback) => {\n if (trackerReady) {\n callback(bundle);\n } else {\n eventQueue.push(callback);\n }\n };\n const trackStructuredEvent = (event) => trackOrQueue(({ NrknoUtils, Snowplow }) => {\n Snowplow.trackStructEvent(\n {\n ...event,\n context: NrknoUtils.context.collect(contexts)\n },\n [trackerId]\n );\n });\n const trackSelfDescribingEvent = (event) => trackOrQueue(\n ({ NrknoUtils, Snowplow }) => Snowplow.trackSelfDescribingEvent(\n {\n event,\n context: NrknoUtils.context.collect(contexts)\n },\n [trackerId]\n )\n );\n getBundle((nrknoBundle) => {\n bundle = nrknoBundle;\n const { NrknoUtils } = nrknoBundle;\n NrknoUtils.newTracker(trackerId, APP_ID, host);\n if (contentContext) {\n const contentContextId = `${trackerId}-${contentContext.id}`;\n contexts.push(contentContextId);\n NrknoUtils.context.set(contentContextId, EntitySchema.Content, {\n source: contentContext.source,\n id: contentContext.id\n });\n }\n resolveOrTimeout(NrknoUtils.trackers.whenReady(\"main-tracker\"), 1e3).then((isResolved) => {\n trackerReady = true;\n if (isResolved === false) {\n console.warn(\"nrkno tracker not available\");\n }\n while (eventQueue.length) {\n const fn = eventQueue.pop();\n fn(bundle);\n }\n return;\n }).catch(console.error);\n });\n return {\n trackSelfDescribingEvent,\n trackStructuredEvent\n };\n}\n\nexport { createTracker, getHost };\n","function getHost(environment = \"development\") {\n if (environment === \"production\") {\n return \"https://data.nrk.no\";\n }\n return \"https://no-nrk-prod1.mini.snplow.net\";\n}\n\nexport { getHost as g };\n","// extracted by mini-css-extract-plugin\nexport default {\"before-after\":\"dhbaf__before-after--ZaWM_\",\"beforeAfter\":\"dhbaf__before-after--ZaWM_\",\"container\":\"dhbaf__container--kSQZg\",\"before\":\"dhbaf__before--gDnqX\",\"slider-button\":\"dhbaf__slider-button--GmpcZ\",\"sliderButton\":\"dhbaf__slider-button--GmpcZ\",\"pulse\":\"dhbaf__pulse--ZcjN4\"};","import _defineProperty from '@babel/runtime/helpers/defineProperty';\n\n/* eslint-disable compat/compat */\nfunction getDefaultRoot() {\n /*\n Use document if supported\n IntersectionObserver will otherwise default to top level document,\n and IntersectionObserver will not work as expected in an iframe.\n https://github.com/w3c/IntersectionObserver/issues/372\n */\n\n /*\n Safari does not throw error on root: document, but does not trigger events as expected\n returning null for now until better feature detection is possible\n */\n return null;\n\n /*\n try {\n // eslint-disable-next-line no-new\n new IntersectionObserver(() => {}, { root: document })\n return document\n } catch (e) {\n return null\n }\n */\n}\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nvar defaultConfig = {\n rootMargin: '0px 0px 0px 0px',\n threshold: [0, 0.5, 1],\n root: getDefaultRoot()\n};\nclass ElementIntersectionObserver {\n constructor(elements, onChange, config) {\n _defineProperty(this, \"intersections\", void 0);\n _defineProperty(this, \"elements\", void 0);\n this.elements = elements.slice(0);\n this.intersections = elements.map(target => ({\n target,\n isIntersecting: false,\n ratio: null\n }));\n this.intersectionObserver = new IntersectionObserver(entries => {\n var intersections = this.intersections.slice(0);\n entries.forEach(entry => {\n var idx = elements.indexOf(entry.target);\n intersections.splice(idx, 1, {\n target: entry.target,\n isIntersecting: entry.isIntersecting,\n ratio: entry.intersectionRatio\n });\n });\n this.intersections = intersections;\n onChange(this.intersections);\n }, _objectSpread(_objectSpread({}, defaultConfig), config));\n elements.forEach(elm => this.intersectionObserver.observe(elm));\n }\n disconnect() {\n // Unregister trigger elements\n this.elements.forEach(elm => this.intersectionObserver.unobserve(elm));\n\n // Disconnect intersection observer\n this.intersectionObserver.disconnect();\n }\n}\n\nfunction toggleAttribute(el, name, boolValue) {\n if (!el) {\n return;\n }\n var nextValue;\n if (typeof boolValue !== 'undefined') {\n nextValue = !!boolValue;\n } else {\n nextValue = el.hasAttribute(name);\n }\n if (nextValue) {\n el.setAttribute(name, '');\n } else {\n el.removeAttribute(name);\n }\n}\nfunction setAttribute(el, name, nextValue) {\n if (!el) {\n return;\n }\n if (nextValue) {\n el.setAttribute(name, nextValue);\n } else {\n el.removeAttribute(name);\n }\n}\nvar closest = (() => {\n var proto = typeof window === 'undefined' ? {} : window.Element.prototype;\n var match = proto.matches || proto.msMatchesSelector || proto.webkitMatchesSelector;\n if (proto.closest) {\n return (el, css) => el.closest(css);\n } else {\n return (el, css) => {\n for (; el; el = el.parentElement) if (match.call(el, css)) return el;\n return null;\n };\n }\n})();\nfunction addStyle(nodeName, css) {\n var key = \"style-\".concat(nodeName.toLowerCase());\n var min = css.replace(/\\/\\*[^!][^*]*\\*\\//g, '').replace(/\\s*(^|[:;,{}]|$)\\s*/g, '$1');\n document.getElementById(key) || document.head.insertAdjacentHTML('afterbegin', \"\"));\n}\nfunction toArray(nodeList) {\n return [].slice.call(nodeList);\n}\nfunction dispatchEvent(element, name) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var ignore = \"prevent_recursive_dispatch_maximum_callstack\".concat(name);\n var event;\n if (element[ignore]) return true;\n // We are already processing this event, so skip sending a new one\n else element[ignore] = true; // Add name to dispatching ignore\n\n if (typeof window.CustomEvent === 'function') {\n event = new window.CustomEvent(name, {\n bubbles: true,\n cancelable: true,\n detail\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(name, true, true, detail);\n }\n // IE reports incorrect event.defaultPrevented\n // but correct return value on element.dispatchEvent\n var result = element.dispatchEvent(event);\n element[ignore] = null; // Remove name from dispatching ignore\n\n return result; // Follow W3C standard for return value\n}\n\nfunction easeOutQuint(t) {\n return 1 + --t * t * t * t * t;\n}\nclass VerticalScroll {\n constructor(container) {\n _defineProperty(this, \"container\", void 0);\n this.container = container;\n }\n cancel() {\n this._cancelled = true;\n }\n to(top) {\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var from = this.container.scrollTop;\n var distance = top - from;\n var startTime = null;\n var loop = currentTime => {\n if (this._cancelled) {\n return;\n }\n if (!startTime) {\n startTime = currentTime - 1;\n }\n var timeElapsed = currentTime - startTime;\n if (timeElapsed < duration) {\n this.container.scrollTop = from + distance * easeOutQuint(timeElapsed / duration);\n window.requestAnimationFrame(loop);\n } else {\n this.container.scrollTop = top;\n callback && callback();\n }\n };\n\n // eslint-disable-next-line compat/compat\n window.requestAnimationFrame(loop);\n }\n}\nclass HorizontalScroll {\n constructor(container) {\n _defineProperty(this, \"container\", void 0);\n this.container = container;\n }\n cancel() {\n this._cancelled = true;\n }\n to(left) {\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var from = this.container.scrollLeft;\n var distance = left - from;\n var startTime = null;\n var loop = currentTime => {\n if (this._cancelled) {\n return;\n }\n if (!startTime) {\n startTime = currentTime - 1;\n }\n var timeElapsed = currentTime - startTime;\n if (timeElapsed < duration) {\n this.container.scrollLeft = from + distance * easeOutQuint(timeElapsed / duration);\n window.requestAnimationFrame(loop);\n } else {\n this.container.scrollLeft = left;\n callback && callback();\n }\n };\n\n // eslint-disable-next-line compat/compat\n window.requestAnimationFrame(loop);\n }\n}\n\nfunction testReducedMotion() {\n if (typeof window !== 'undefined') {\n return !!window.matchMedia && window.matchMedia('(prefers-reduced-motion)').matches;\n }\n return false;\n}\n\nvar MAX_SAFE_INTEGER = 9007199254740991;\nfunction withinRange(current) {\n var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : MAX_SAFE_INTEGER;\n return current >= start && current <= stop;\n}\nfunction withinStops(currentTime, stops, targetStop) {\n var nrOfStops = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n var uniqueStops = stops.filter(unique);\n var targetTime = stops[targetStop];\n var prevTime = uniqueStops[uniqueStops.indexOf(targetTime) - nrOfStops];\n var nextTime = uniqueStops[uniqueStops.indexOf(targetTime) + nrOfStops];\n return withinRange(currentTime, prevTime, nextTime);\n}\nfunction unique(value, index, self) {\n return self.indexOf(value) === index;\n}\n\n/*\n * 'loading=\"lazy\"' is defined in terms of IntersectionObserver and the initial root.\n * As a result images with 'loading=\"lazy\"' inside a scroll container will not load\n * until they at least have one pixel visible in the viewport.\n *\n * This will hopefully fixed in a future version of the spec:\n * https://github.com/w3c/IntersectionObserver/issues/431\n *\n * scroll-container-lazy-load observes images and a scroll container.\n * Once images are close to intersecting it will change 'loading=\"lazy\"' to 'loading=\"eager\"'.\n * */\nfunction loadImage(image) {\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n}\nfunction connectScrollContainerLazyLoad(container, images) {\n var containerIntersecting = false;\n var deferredImages = [];\n\n // eslint-disable-next-line compat/compat\n var containerObserver = new IntersectionObserver(entries => {\n containerIntersecting = entries === null || entries === void 0 ? void 0 : entries[0].isIntersecting;\n if (containerIntersecting) {\n deferredImages.forEach(image => loadImage(image));\n deferredImages = [];\n }\n }, {\n root: getDefaultRoot(),\n threshold: [0.0]\n });\n containerObserver.observe(container);\n\n // eslint-disable-next-line compat/compat\n var imageObserver = new IntersectionObserver(entries => {\n for (var entry of entries) {\n if (entry.isIntersecting) {\n var image = entry.target;\n imageObserver.unobserve(image);\n if (containerIntersecting) {\n loadImage(image);\n } else {\n /* Defer loading of if the container is not intersecting the viewport */\n deferredImages.push(image);\n }\n }\n }\n }, {\n root: container,\n rootMargin: '300px',\n threshold: 0.0\n });\n for (var image of images) {\n imageObserver.observe(image);\n }\n return () => {\n containerObserver.disconnect();\n imageObserver.disconnect();\n };\n}\n\nfunction debounce(fn, delay) {\n var timeout;\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n}\n\nexport { ElementIntersectionObserver, HorizontalScroll, VerticalScroll, addStyle, closest, connectScrollContainerLazyLoad, debounce, dispatchEvent, setAttribute, testReducedMotion, toArray, toggleAttribute, withinRange, withinStops };\n//# sourceMappingURL=index.esm.js.map\n","import s from './before-after.module.css'\nimport { closest, toArray } from '@nrk/dh-basis-common'\n\nfunction clamp(value) {\n return Math.max(Math.min(value, 100), 0)\n}\n\nexport default class BeforeAfter extends HTMLElement {\n _value = 50\n connectedCallback() {\n this.input.addEventListener('change', this._handleChange)\n this.input.addEventListener('input', this._handleChange)\n if (this._isTouchDevice()) {\n this.input.addEventListener('touchstart', this._handleTouch)\n this.input.addEventListener('touchmove', this._handleTouch)\n this.input.addEventListener('touchend', this._handleTouch)\n }\n this._updateValue()\n\n if (this._isFullWidth() || this._isFeatureCover()) {\n const images = toArray(this.querySelectorAll('img'))\n images.forEach((image) => {\n image.setAttribute('sizes', '100vw')\n })\n }\n }\n\n disconnectedCallback() {\n this.input.removeEventListener('change', this._handleChange)\n this.input.removeEventListener('input', this._handleChange)\n if (this._isTouchDevice()) {\n this.input.addEventListener('touchstart', this._handleTouch)\n this.input.addEventListener('touchmove', this._handleTouch)\n this.input.addEventListener('touchend', this._handleTouch)\n }\n }\n\n _isTouchDevice() {\n return typeof document !== 'undefined' && 'ontouchstart' in document.documentElement\n }\n\n _isFullWidth() {\n const remoterendered = closest(this, '.remoterenderedcontent-reference')\n return remoterendered && remoterendered.classList.contains('fc')\n }\n\n _isFeatureCover() {\n const cover = closest(this, '.article-feature__cover')\n return !!cover\n }\n\n _updateValue() {\n this.input.value = `${this._value}`\n this.beforeElement.style.width = `${this._value}%`\n this.button.style.left = `${this._value}%`\n }\n\n _handleChange = (e) => {\n this._value = e.target.value\n this._updateValue()\n }\n\n _handleTouch = (e) => {\n const touch = e.changedTouches[0]\n const rect = this.getBoundingClientRect()\n const percent = (100 * (touch.clientX - rect.left)) / rect.width\n this._value = clamp(percent)\n this._updateValue()\n }\n\n get input() {\n return this.querySelector('input')\n }\n\n get beforeElement() {\n return this.querySelector(`.${s.before}`)\n }\n\n get button() {\n return this.querySelector(`.${s.sliderButton}`)\n }\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"scratch-before-after\":\"dhbaf__scratch-before-after--C2ete\",\"scratchBeforeAfter\":\"dhbaf__scratch-before-after--C2ete\",\"scratch-container\":\"dhbaf__scratch-container--SdAne\",\"scratchContainer\":\"dhbaf__scratch-container--SdAne\",\"visible-canvas\":\"dhbaf__visible-canvas--h1pHk\",\"visibleCanvas\":\"dhbaf__visible-canvas--h1pHk\",\"mask-canvas\":\"dhbaf__mask-canvas--eIn9P\",\"maskCanvas\":\"dhbaf__mask-canvas--eIn9P\",\"before\":\"dhbaf__before--lZkPO\",\"after\":\"dhbaf__after--k1Rmr\",\"hint\":\"dhbaf__hint--x1doH\"};","import { closest, toArray } from '@nrk/dh-basis-common'\nimport { debounce } from '../lib/utils'\nimport styles from './scratch-before-after.module.css'\n\nexport default class ScratchBeforeAfter extends HTMLElement {\n static get observedAttributes() {\n return ['lock']\n }\n\n pattern\n _revealed = false\n\n connectedCallback() {\n const debouncedUpdateCanvasWidth = debounce(this._updateCanvasWidth, { delay: 500 })\n\n if (this._isFullWidth() || this._isFeatureCover()) {\n const images = toArray(this.querySelectorAll('img'))\n images.forEach((image) => {\n image.setAttribute('sizes', '100vw')\n })\n }\n\n if ('PointerEvent' in window) {\n document.body.addEventListener('pointerdown', this._handlePointerDown)\n this.toggleButton.addEventListener('pointerdown', (e) => e.stopImmediatePropagation())\n this.scratchButton.addEventListener('pointerdown', (e) => e.stopImmediatePropagation())\n } else if ('ontouchstart' in document.documentElement) {\n document.body.addEventListener('touchstart', this._handlePointerDown)\n document.body.addEventListener('touchmove', this._preventScrollInOldTouchDevices, {\n passive: false,\n })\n this.toggleButton.addEventListener('touchstart', (e) => e.stopImmediatePropagation())\n this.scratchButton.addEventListener('touchstart', (e) => e.stopImmediatePropagation())\n } else {\n document.body.addEventListener('mousedown', this._handlePointerDown)\n this.toggleButton.addEventListener('mousedown', (e) => e.stopImmediatePropagation())\n this.scratchButton.addEventListener('mousedown', (e) => e.stopImmediatePropagation())\n }\n debouncedUpdateCanvasWidth()\n\n window.addEventListener('resize', debouncedUpdateCanvasWidth)\n this.querySelectorAll('img').forEach((img) =>\n img.addEventListener('load', debouncedUpdateCanvasWidth),\n )\n\n this.toggleButton.addEventListener('click', this._toggleLock)\n this.scratchButton.addEventListener('click', this._completeScratch)\n this.hintText.addEventListener('click', this._toggleLock)\n }\n\n disconnectedCallback() {\n this.scratchContainer.removeEventListener('pointerdown', this._handlePointerDown)\n this.toggleButton.removeEventListener('click', this._toggleLock)\n this.scratchButton.removeEventListener('click', this._completeScratch)\n this.hintText.removeEventListener('click', this._toggleLock)\n }\n\n attributeChangedCallback(name) {\n switch (name) {\n case 'lock':\n this._upadateLock()\n }\n }\n\n _preventScrollInOldTouchDevices = (e) => {\n if (!('PointerEvent' in window) && this.mode === 'paint') {\n e.preventDefault()\n }\n }\n\n _upadateLock() {\n if (this.lock) {\n this.scratchContainer.style.setProperty('touch-action', 'none')\n } else {\n this.scratchContainer.style.setProperty('touch-action', 'pan-y')\n }\n }\n\n _updateCanvasWidth = async () => {\n const canvas = this.visibleCanvas\n const images = this.images\n if (\n images.some((image) => !image.complete) ||\n canvas.offsetWidth === this._currentCanvasWidth\n ) {\n return\n }\n\n const dpr = window.devicePixelRatio\n canvas.width = canvas.offsetWidth * dpr\n canvas.height = canvas.offsetHeight * dpr\n this.visibleContext = canvas.getContext('2d')\n\n const img = this.revealElement.querySelector('img')\n const intrinsicSize = await getIntrinsicSize(img)\n this.visibleContext.drawImage(\n img,\n 0,\n 0,\n intrinsicSize.width,\n intrinsicSize.height,\n 0,\n 0,\n canvas.width,\n canvas.height,\n )\n\n this.pattern = this.visibleContext.createPattern(this.visibleCanvas, 'no-repeat')\n this.visibleContext.clearRect(0, 0, this.visibleCanvas.width, this.visibleCanvas.height)\n if (this._supportsMaskImage()) {\n const maskCanvas = this.maskCanvas\n maskCanvas.width = maskCanvas.offsetWidth\n maskCanvas.height = maskCanvas.offsetHeight\n this.maskContext = maskCanvas.getContext('2d')\n\n this.revealElement.style.webkitMaskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.maskImage = `url(${this.maskCanvas.toDataURL()})`\n }\n\n this._currentCanvasWidth = canvas.offsetWidth\n }\n\n _isFullWidth() {\n const remoterendered = closest(this, '.remoterenderedcontent-reference')\n return remoterendered && remoterendered.classList.contains('fc')\n }\n\n _isFeatureCover() {\n const cover = closest(this, '.article-feature__cover')\n return !!cover\n }\n\n _supportsMaskImage() {\n // eslint-disable-next-line compat/compat\n return (\n window?.CSS?.supports?.('mask-image: url(\"\")') ||\n window?.CSS?.supports?.('-webkit-mask-image: url(\"\")')\n )\n }\n\n _handlePointerDown = (e) => {\n const container = closest(e.target, `.${styles.scratchContainer}`)\n if (!container || !this.contains(container) || e.button === 2) {\n return\n }\n e.preventDefault()\n this.showHint = false\n this.toggleButton.style.pointerEvents = 'none'\n\n if ('PointerEvent' in window) {\n document.body.addEventListener('pointermove', this._handlePointerMove)\n document.body.addEventListener('pointerup', this._handlePointerUp)\n document.body.addEventListener('pointercancel', this._handlePointerCancel)\n } else if ('ontouchstart' in document.documentElement) {\n document.body.addEventListener('touchmove', this._handlePointerMove, { passive: false })\n document.body.addEventListener('touchend', this._handlePointerUp)\n document.body.addEventListener('touchcancel', this._handlePointerCancel)\n } else {\n document.body.addEventListener('mousemove', this._handlePointerMove)\n document.body.addEventListener('mouseup', this._handlePointerUp)\n }\n\n if (this._supportsMaskImage()) {\n this.visibleCanvas.style.transition = ''\n this.visibleCanvas.style.opacity = 1\n this.visibleContext.clearRect(0, 0, this.visibleCanvas.width, this.visibleCanvas.height)\n }\n\n this._handlePointerMove(e)\n this._handlePointerMove(e)\n }\n\n _handlePointerMove = (e) => {\n e.preventDefault()\n e.stopImmediatePropagation()\n const container = closest(e.target, `.${styles.scratchContainer}`)\n let offsetX\n let offsetY\n if (!container) {\n offsetX = -1\n offsetY = -1\n } else if ('PointerEvent' in window) {\n offsetX = e.offsetX\n offsetY = e.offsetY\n } else if ('ontouchstart' in document.documentElement) {\n offsetX = e.targetTouches[0].pageX - container.offsetLeft\n offsetY = e.targetTouches[0].pageY - container.offsetTop\n } else {\n offsetX = e.offsetX\n offsetY = e.offsetY\n }\n const dpr = window.devicePixelRatio\n this._drawLine(this.visibleContext, this.prevPos, { offsetX, offsetY }, this.pattern, dpr)\n this._drawLine(this.maskContext, this.prevPos, { offsetX, offsetY }, 'white', 1)\n this.prevPos = { offsetX, offsetY }\n }\n\n _drawLine(ctx, prevPos, nextPos, fill, dpr) {\n const innerWidth = Math.min(1200, window.innerWidth)\n const lineWidth = 40 + 0.04 * innerWidth\n const { width, height } = ctx.canvas\n\n ctx.save()\n ctx.strokeStyle = fill\n ctx.lineWidth = lineWidth * dpr\n ctx.lineCap = 'round'\n\n if (\n prevPos &&\n nextPos &&\n prevPos.offsetX > 0 &&\n prevPos.offsetX < width &&\n prevPos.offsetY > 0 &&\n prevPos.offsetY < height &&\n nextPos.offsetX > 0 &&\n nextPos.offsetX < width &&\n nextPos.offsetY > 0 &&\n nextPos.offsetY < height\n ) {\n ctx.beginPath()\n ctx.moveTo(prevPos.offsetX * dpr, prevPos.offsetY * dpr)\n ctx.lineTo(nextPos.offsetX * dpr, nextPos.offsetY * dpr)\n ctx.stroke()\n }\n ctx.restore()\n }\n\n _handlePointerOut = () => {\n delete this.prevPos\n }\n\n _handlePointerCancel = (e) => {\n this.showHint = true\n setTimeout(() => {\n this.showHint = false\n }, 10000)\n this._handlePointerUp(e)\n }\n\n _handlePointerUp = () => {\n delete this.prevPos\n\n if ('PointerEvent' in window) {\n document.body.removeEventListener('pointermove', this._handlePointerMove)\n document.body.removeEventListener('pointerup', this._handlePointerUp)\n document.body.removeEventListener('pointercancel', this._handlePointerCancel)\n } else if ('ontouchstart' in document.documentElement) {\n document.body.removeEventListener('touchmove', this._handlePointerMove, false)\n document.body.removeEventListener('touchend', this._handlePointerUp)\n document.body.removeEventListener('touchcancel', this._handlePointerCancel)\n } else {\n document.body.removeEventListener('mousemove', this._handlePointerMove)\n document.body.removeEventListener('mouseup', this._handlePointerUp)\n }\n\n if (this._supportsMaskImage()) {\n // Replace canvas with masked image\n this.revealElement.style.webkitMaskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.maskImage = `url(${this.maskCanvas.toDataURL()})`\n this.visibleCanvas.style.transition = 'opacity 350ms ease-in-out 200ms'\n this.visibleCanvas.style.opacity = 0\n this.revealElement.style.opacity = 1\n }\n this.toggleButton.style.pointerEvents = 'auto'\n this._checkRevealed()\n }\n\n _checkRevealed() {\n if (this._revealed) {\n return\n }\n const maskCanvas = this.maskCanvas\n const imageData = this.maskContext.getImageData(0, 0, maskCanvas.width, maskCanvas.height)\n\n let total = 0\n let pixels = imageData.data.length / 4\n for (let i = 0; i < pixels; i++) {\n total += imageData.data[i * 4 + 3] // alpha\n }\n const average = total / pixels\n if (average > 128) {\n this._revealed = true\n this.beforeElement.setAttribute('aria-hidden', 'true')\n this.revealElement.setAttribute('aria-hidden', 'false')\n }\n }\n\n _toggleLock = () => {\n this.showHint = false\n this.lock = !this.lock\n }\n\n _completeScratch = () => {\n console.log('Completing scratch')\n this.maskContext.save()\n this.maskContext.fillStyle = 'white'\n console.log(this.maskCanvas.width, this.maskCanvas.height)\n this.maskContext.fillRect(0, 0, this.maskCanvas.width, this.maskCanvas.height)\n this.maskContext.restore()\n this.revealElement.style.webkitMaskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.maskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.opacity = 1\n this._checkRevealed()\n this.scratchButton.setAttribute('disabled', '')\n\n this.afterImage.focus()\n }\n\n get hintText() {\n return this.querySelector(`.${styles.hint} p`)\n }\n\n get toggleButton() {\n return this.querySelector('button[value=\"lock\"]')\n }\n\n get scratchButton() {\n return this.querySelector('button[value=\"scratch\"]')\n }\n\n get images() {\n /* eslint-disable compat/compat */\n return Array.from(this.querySelectorAll('img'))\n }\n\n get scratchContainer() {\n return this.querySelector(`.${styles.scratchContainer}`)\n }\n\n get visibleCanvas() {\n return this.querySelector(`.${styles.visibleCanvas}`)\n }\n\n get maskCanvas() {\n return this.querySelector(`.${styles.maskCanvas}`)\n }\n\n get beforeElement() {\n return this.querySelector(`.${styles.before}`)\n }\n\n get revealElement() {\n return this.querySelector(`.${styles.after}`)\n }\n\n get afterImage() {\n return this.querySelector(`.${styles.after} img`)\n }\n\n get lock() {\n return this.hasAttribute('lock')\n }\n\n set lock(val) {\n const lock = JSON.parse(val)\n if (lock) {\n this.setAttribute('lock', '')\n } else {\n this.removeAttribute('lock')\n }\n }\n\n set showHint(val) {\n if (val) {\n this.setAttribute('show-hint', '')\n } else {\n this.removeAttribute('show-hint')\n }\n }\n\n get showHint() {\n return this.hasAttribute('show-hint')\n }\n}\n\n/*\n * Can not get image intrinsic values directly from naturalWidth and naturalHeight due to\n * https://bugs.chromium.org/p/chromium/issues/detail?id=760612&q=naturalWidth&can=2\n *\n *\n * */\nfunction getIntrinsicSize(img) {\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => {\n resolve({ width: image.width, height: image.height })\n }\n image.onerror = reject\n image.src = img.currentSrc || img.src\n })\n}\n","export function debounce(callback, options) {\n let timeoutID\n let lastExec = 0\n\n function wrapper(...args) {\n var self = this\n var elapsed = Number(new Date()) - lastExec\n\n function exec() {\n lastExec = Number(new Date())\n callback.apply(self, args)\n }\n\n function clear() {\n timeoutID = undefined\n }\n\n if (options.debounceMode && !timeoutID) {\n exec()\n }\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n\n if (options.debounceMode === undefined && elapsed > options.delay) {\n exec()\n } else if (options.noTrailing !== true) {\n timeoutID = setTimeout(\n options.debounceMode ? clear : exec,\n options.debounceMode === undefined ? options.delay - elapsed : options.delay,\n )\n }\n }\n return wrapper\n}\n","import { getElementTag } from '@nrk/dh-server-libs/get-element-tag'\nimport { createTracker } from '@nrk/dh-snowplow'\nimport { EventSchema, ViewportEventKind } from '@nrk/snowplow-web'\nimport BeforeAfter from './components/before-after'\nimport ScratchBeforeAfter from './components/scratch-before-after'\nimport './client.module.css'\nimport './components/before-after.module.css'\nimport './components/scratch-before-after.module.css'\n\nconst tag = getElementTag(__APP_NAME__, __APP_VERSION__)\n\nfunction safeDefine(elementName, constructor) {\n if (typeof customElements.get(elementName) === 'undefined') {\n customElements.define(elementName, constructor)\n }\n}\n\nclass AppElement extends HTMLElement {\n #entryObserver\n #exitObserver\n #tracker\n\n connectedCallback() {\n safeDefine('dh-before-after', BeforeAfter)\n safeDefine('dh-scratch-before-after', ScratchBeforeAfter)\n\n this.#createTracker()\n this.#startViewportLogger()\n }\n\n disconnectedCallback() {\n this.#stopViewportLogger()\n }\n\n #createTracker() {\n if (process.env.DEV) {\n import('@nrk/dh-snowplow/mock').then(({ mock }) => mock()).catch(console.error)\n }\n\n this.#tracker = createTracker('dh-beforeafter', {\n environment: process.env.ENVIRONMENT,\n contentContext: {\n source: 'pp',\n id: this.dataset.selfId,\n },\n })\n }\n\n #startViewportLogger() {\n this.#entryObserver = new IntersectionObserver((entries) => {\n if (!entries[0]?.isIntersecting) {\n return\n }\n this.#entryObserver.disconnect()\n this.#exitObserver.observe(this)\n this.#tracker.trackSelfDescribingEvent({\n schema: EventSchema.ViewportEvent,\n data: {\n kind: ViewportEventKind.Entry,\n },\n })\n }, {})\n\n this.#exitObserver = new IntersectionObserver(\n (entries) => {\n if (!entries[0]?.isIntersecting) {\n return\n }\n this.#exitObserver.disconnect()\n this.#tracker.trackSelfDescribingEvent({\n schema: EventSchema.ViewportEvent,\n data: {\n kind: ViewportEventKind.Exit,\n },\n })\n },\n { threshold: [1], rootMargin: '99000px 0px -100% 0px' },\n )\n\n this.#entryObserver.observe(this)\n }\n\n #stopViewportLogger() {\n this.#entryObserver?.disconnect()\n this.#exitObserver?.disconnect()\n }\n}\n\nif (!customElements.get(tag)) {\n customElements.define(tag, AppElement)\n}\n"],"names":["fingerprint","pad","getRandomValue","c","blockSize","base","discreteValues","Math","pow","randomBlock","toString","safeCounter","cuid","Date","getTime","slug","date","counter","slice","print","random","isCuid","stringToCheck","startsWith","isSlug","stringLength","length","module","exports","env","window","self","globalCount","Object","keys","clientId","navigator","mimeTypes","userAgent","crypto","msCrypto","lim","abs","getRandomValues","Uint32Array","num","size","s","substr","getElementTag","name","version","split","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","defineProperty","defineProperties","getOwnPropertyDescriptors","getOwnPropertySymbols","prototype","hasOwnProperty","propertyIsEnumerable","staticSnowplowRoot","staticSnowplowMajorVersion","globalKey","getBundle","callback","globalThis","cb","q","push","src","document","querySelector","script","createElement","async","head","appendChild","loadOnce","ViewportEventKind2","EventSchema3","EntitySchema2","APP_ID","createTracker","trackerId","environment","contentContext","bundle","trackerReady","host","getHost","eventQueue","contexts","trackOrQueue","nrknoBundle","NrknoUtils","newTracker","contentContextId","id","context","set","Content","source","promise","wait","trackers","whenReady","Promise","race","then","resolve","setTimeout","isResolved","console","warn","pop","fn","catch","error","trackSelfDescribingEvent","event","Snowplow","collect","trackStructuredEvent","trackStructEvent","proto","match","closest","Element","matches","msMatchesSelector","webkitMatchesSelector","el","css","parentElement","call","toArray","nodeList","BeforeAfter","HTMLElement","constructor","args","_value","_handleChange","e","this","target","value","_updateValue","_handleTouch","touch","changedTouches","rect","getBoundingClientRect","percent","clientX","left","width","max","min","connectedCallback","input","addEventListener","_isTouchDevice","_isFullWidth","_isFeatureCover","querySelectorAll","forEach","image","setAttribute","disconnectedCallback","removeEventListener","documentElement","remoterendered","classList","contains","beforeElement","style","button","ScratchBeforeAfter","pattern","_revealed","_preventScrollInOldTouchDevices","mode","preventDefault","_updateCanvasWidth","canvas","visibleCanvas","images","some","complete","offsetWidth","_currentCanvasWidth","dpr","devicePixelRatio","height","offsetHeight","visibleContext","getContext","img","revealElement","intrinsicSize","reject","Image","onload","onerror","currentSrc","getIntrinsicSize","drawImage","createPattern","clearRect","_supportsMaskImage","maskCanvas","maskContext","webkitMaskImage","toDataURL","maskImage","_handlePointerDown","container","styles","showHint","toggleButton","pointerEvents","body","_handlePointerMove","_handlePointerUp","_handlePointerCancel","passive","transition","opacity","stopImmediatePropagation","offsetX","offsetY","targetTouches","pageX","offsetLeft","pageY","offsetTop","_drawLine","prevPos","_handlePointerOut","_checkRevealed","_toggleLock","lock","_completeScratch","log","save","fillStyle","fillRect","restore","scratchButton","afterImage","focus","observedAttributes","debouncedUpdateCanvasWidth","options","timeoutID","lastExec","elapsed","Number","exec","apply","debounceMode","clearTimeout","delay","noTrailing","debounce","hintText","scratchContainer","attributeChangedCallback","_upadateLock","setProperty","_window","_window2","CSS","supports","ctx","nextPos","fill","lineWidth","innerWidth","strokeStyle","lineCap","beginPath","moveTo","lineTo","stroke","imageData","getImageData","total","pixels","data","i","Array","from","hasAttribute","val","JSON","parse","removeAttribute","tag","__APP_NAME__","__APP_VERSION__","safeDefine","elementName","customElements","get","define","_entryObserver","_classPrivateFieldLooseKey","_exitObserver","_tracker","_createTracker","_startViewportLogger","_stopViewportLogger","AppElement","_stopViewportLogger2","_startViewportLogger2","_createTracker2","writable","_classPrivateFieldLooseBase","process","dataset","selfId","IntersectionObserver","entries","_entries$","isIntersecting","disconnect","observe","schema","EventSchema","ViewportEvent","kind","ViewportEventKind","Entry","_entries$2","Exit","threshold","rootMargin","_classPrivateFieldLoo","_classPrivateFieldLoo2"],"sourceRoot":""}