{"version":3,"file":"static/chunks/8174-fe299bffe51e8a13.js","mappings":"8QAKO,SAASA,EAAY,YAAEC,GAAa,CAAI,CAAsB,CAAG,CAAEA,YAAY,CAAK,CAAC,EAC1F,IAAMC,EAAWC,CAAAA,EAAAA,EAAAA,EAAAA,CAAWA,GACtBC,EAAkBC,CAAAA,EAAAA,EAAAA,EAAAA,CAAkBA,GAC1C,OAAOH,GAAYD,GAAc,CAACG,CACpC,0BCAO,eAAeE,EACpBC,CAA8B,CAC9BC,CAAY,MA4BMA,EA1BlB,GA0B8B,CA1BxBC,EAAeC,SAASC,aAAa,CAAC,SAS5C,OARAF,EAAaG,EAAE,CA0BR,CAACJ,CA1BUK,EAAWL,GA0BfM,QAAQ,CAAEN,EAAMO,KAAK,CAAEP,EAAMQ,GAAG,CAAC,CAACC,MAAM,CAACC,SAASC,IAAI,CAAC,KAAKC,WAAW,GAzBrFX,EAAaM,KAAK,CAAGP,EAAMO,KAAK,CAChCN,EAAaY,OAAO,CAAGb,EAAMM,QAAQ,CACrCL,EAAaa,IAAI,CAAG,WACpBb,EAAaD,KAAK,CAACe,IAAI,CAAG,SAC1Bd,EAAae,OAAO,CAACC,IAAI,CAAGjB,EAAMiB,IAAI,CACtClB,EAAamB,MAAM,CAACjB,GAEb,IAAIkB,QAAQ,IACjBlB,EAAamB,MAAM,CAAG,KACpBC,EAAQpB,EACV,EACAA,EAAaqB,OAAO,CAAG,KACrBC,CAAAA,EAAAA,EAAAA,EAAAA,CAAUA,CACR,iBACA,MAAU,iBACV,CAAC,sBAAsB,EAAEvB,EAAMQ,GAAG,EAAE,EAEtCT,EAAayB,WAAW,CAACvB,GACzBoB,EAAQ,KACV,EACApB,EAAawB,GAAG,CAAGzB,EAAMQ,GAAG,EAEhC,CCmCA,SAASkB,EAAY,YACnBC,CAAU,CACVC,YAAU,MACVX,CAAI,CAKL,EACC,OAAOU,EAAWlB,MAAM,CAAC,GACvB,CAACmB,CAAU,CAACX,EAAK,EAAI,IAAIY,IAAI,CAC3B,GACE7B,EAAMiB,IAAI,GAAKa,GAAWd,QAAQC,MAClCjB,EAAMO,KAAK,GAAKuB,EAAUvB,KAAK,EAC/BP,EAAMQ,GAAG,GAAKsB,EAAUL,GAAG,EAGnC,CEjEA,SAASM,EAAUC,CAAqB,CAAEC,CAAwB,EAChE,OAAOD,EAAOE,IAAI,CAAC,GAAWlC,EAAMa,OAAO,GAAKoB,EAAYpB,OAAO,GAAKmB,CAAM,CAAC,EAAE,EAAI,IACvF,yBCxBO,SAASG,EAAoBL,CAAkC,EACpE,OAAOA,EAAYM,EAAWN,EAAUvB,KAAK,EAAI,KACnD,CAeO,SAAS8B,EAAWC,CAAiB,CAAEC,CAAiB,EACzDC,OAAOC,UAAU,EAAID,OAAOE,WAAW,EAAE,CAC3CC,IAAIH,OAAOE,EAARC,SAAmB,CAAE,gBAAiB,CAAC,MAAM,EAAEL,EAAAA,CAAW,EAC7DK,IAAIH,OAAOE,EAARC,SAAmB,CAAE,4BAA6BJ,GACrDC,OAAOC,UAAU,CAACzC,KAAK,GAAG,gBAE9B,CAEA,SAASoC,EAAWQ,CAAY,EAC9B,OAAOA,EACJC,OAAO,CAAC,iBAAkB,IAC1BA,OAAO,CAAC,MAAO,KACfjC,WAAW,EAChB,2BC1BO,IAAMkC,EAAsB,CAAC,qBAAEC,CAAmB,CAAQ,GAGxDC,IAAW,CAChB,eADeA,2BAFuB,CAGKC,SAH7BF,EAId,wHAHqC,CAInCG,QAJWH,CAKf,GAGWI,EAA4B,CAAC,qBAAEJ,CAAmB,CAAQ,IACrE,IAAMG,EAAiC,SAAxBH,EACTE,EAAkC,UAAxBF,EAChB,OAAOC,IAAW,CAChB,eADeA,oCACqC,CAACE,GAAU,CAACD,EAChE,iFAAkFC,EAClF,iGACED,CACJ,EACF,EAAE,EAEwB,CAAC,qBAAEF,CAAmB,CAAQ,GAC/CC,IACLF,EAAoB,cADLE,OACOD,CAAoB,GAC1CI,EAA0B,qBAAEJ,CAAoB,ICnB9CK,EAAe,CACnBC,IAAK,EACLC,IAAK,IACLC,KAAM,CACR,EAEaC,EAAsC,CAACJ,EAAaG,IAAI,CAAC,CAAC,EAEnB,CAClDE,KAAKH,GAAG,CAACF,EAAaG,IAAI,CAAEE,KAAKC,KAAK,CAACN,EAAaE,GAAG,CAAG,IAC3D,CAAC,SAEcK,EAAa,qBAC3BZ,CAAmB,aACnBa,CAAW,cACXC,CAAY,CACM,EAClB,IAAMnE,EAAWC,CAAAA,EAAAA,EAAAA,EAAAA,CAAWA,GACtB,GAAEmE,CAAC,MAAEC,CAAI,CAAE,CAAGC,CAAAA,EAAAA,EAAAA,EAAAA,CAAcA,CAAC,oBAC7Bd,EAAiC,SAAxBH,EACTkB,EAASL,EAAYM,OAAO,CAAG,EAAIN,EAAYK,MAAM,CAAC,EAAE,QAE9D,EAKE,EALE,CAKF,KALa,EAKZE,OAAAA,CACCC,UAAWpB,IACT,gBADmBA,oDAEnB,kFACA,qFACAqB,EAAW,QAADA,aAAGtB,CAAoB,aAGnC,UAACuB,EAAAA,CAAMA,CAAAA,CACLC,MAAOT,EAAE,gBACTU,cAAc,EACdC,YAAa,CAACX,EAAE,iBAAiB,CACjCY,aAAc,IAAMZ,EAAE,mBAAoB,QAAEG,CAAO,GACnDU,OAAQ,CAACV,EAAO,CAChBW,SAAUf,EACVvD,SAAUyD,EAAKzD,QAAQ,CACvB+C,IAAKD,EAAaC,GAAG,CACrBC,IAAKF,EAAaE,GAAG,CACrBC,KAAMH,EAAaG,IAAI,CACvBsB,UAAW,EACXC,YAAY,WACZC,QAAS7B,EAAS,WAAa,gBAC/B8B,QAAQ,UACRjC,oBAAqBA,MA3BlB,IA+BX,CE9DO,SAASkC,EAAWC,CAAW,EACpC,OAAOA,EAAIC,IAAI,CAACC,IAAI,GAAGC,MAAM,CAAG,CAClC,CAYO,SAASC,EAAWJ,CAAW,EACpC,GAAI,CACF,IAAMK,EAAWL,EAAIM,YAAY,GAC3BL,EAAOI,EAASE,WAAW,EAAI,GAC/BC,EAAO,IAAIC,gBAAgBC,iBAAiB,CAACL,GACnD,MAAO,MAAEJ,OAAMO,CAAK,CACtB,CAAE,KAAM,CACN,MAAO,CAAEP,KAAMD,EAAIC,IAAI,CAAEO,KAAMR,EAAIC,IAAI,CACzC,CACF,CCjBO,IAAMU,EAAe,CAC1BC,aAAc,eACdC,WAAY,YACd,EAEaC,EAAqB,sBAAsB,EAEtB,IAChCxD,OAAOyD,aAAa,CAAC,IAAIC,YAA8BF,EAAoB,CAAEG,QAAO,GACtF,EAAE,ECkBsC,CACtCjC,SAAS,EACTkC,WAAW,EACXC,aAAc,GACdC,mBAAoB,KACpBC,iBAAkB,KAClBC,iBAAkB,KAClBvC,OAAQwC,CACV,EAKO,SAASC,CANOD,CAMQE,CAAuB,EACpD,IAAM5G,EAAe6G,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAAmB,MACxCC,EAAmBC,CAAAA,EAAAA,EAAAA,KAAAA,CAAKA,GACxBC,EAAWJ,EAAMI,QAAQ,EAAIF,EAC7BG,EAAWL,EAAMK,QAAQ,EAAI,GAC7BC,EAAY,CAAE,GAAGN,CAAK,CAAE5G,cAAa,EACrC,CAAC6D,EAAasD,EAAe,CAAGC,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAAc,KAC1D,GAAI,CACF,IAAMC,EAA4CC,KAAKC,KAAK,CAC1DC,aAAaC,OAAO,CAAC,wBAA0B,MAEjD,MAAO,CAAE,GAAGC,CAAkB,CAAE,GAAGL,CAAmB,CACxD,CAAE,KAAM,CACN,OAAOK,CACT,CACF,GACMC,EThDD,SAASC,CAA2C,EACzD,CS+CkCA,GT/C5BvH,EAAK0G,CAAAA,EAAAA,EAAAA,KAAAA,CAAKA,GACV/G,EAAe6H,EAAQ7H,YAAY,CAAC8H,OAAO,CAC3CC,GAAcpH,CAAQkH,EAAQG,aAAa,EAAE1C,OAC7C2C,GAAiBtH,CAAQkH,EAAQK,gBAAgB,EAAE5C,OACnD6C,GAAiBxH,CAAQkH,EAAQO,WAAW,EAAE9C,OAE9C,mBAAE+C,CAAiB,gBAAEC,CAAc,CAAE,CAAGC,SAmEvCA,CAA2C,EAClD,IAAMD,EAAiB,CACrBE,SAAUX,EAAQW,QAAQ,CAC1BC,WAAYZ,EAAQY,UAAU,CAC9BC,WAAYb,EAAQa,UAAU,CAC9BV,cAAeH,EAAQG,aAAa,CACpCE,iBAAkBL,EAAQK,gBAAgB,EAEtCG,EAAoB,CACxB,GAAGC,CAAc,CACjBN,cAAe,EAAE,CACjBE,iBAAkB,EAAE,EAEtB,MAAO,gBACLI,oBACAD,CACF,CACF,EApF8DR,GACtDc,EAAYC,CAAAA,EAAAA,EAAAA,OAAAA,CAAOA,CAAC,IAAMC,KAkCNhB,OAA6B,IAlCJA,EA4C5CiB,MAAMC,IAAI,CAHC,IAAIC,IACpB,IAPsBnB,GAASG,eAAiB,EAAE,IAAOH,GAASK,kBAAoB,EAAE,IAExFL,GAASO,aAAaa,QAASpH,GAAe,IACxCA,EAAWmG,aAAa,EAAI,EAAE,IAC9BnG,EAAWqG,gBAAgB,EAAI,EAAE,CACtC,GAAK,EAAE,CAE4B,CAACgB,GAAG,CAAC,GAAU,CAACC,OAAOvE,MAAM,CAACwE,GAAMxI,IAAI,CAAC,KAAMwI,EAAK,GAE9DxE,MAAM,KA5C2B,CAACiD,EAAQ,EAEhE,CAAEwB,KAAMC,EAAc,CAACjB,EAAkB,CAAE,CAAGkB,CAAAA,EAAAA,EAAAA,CAAAA,CAAQA,CAAC,CAC3DC,SAAS7I,EAAQ8I,CALD1B,GAAeE,GAAkBE,CAAAA,GAKnBnI,CAAAA,EAC9B0J,SAAU,CAAC,CAAC,MAAM,EAAErJ,EAAAA,CAAI,CAAC,CACzBsJ,QAAS,SACAvI,QAAQwI,GAAG,CAChBjB,EAAUO,GAAG,CAAC,GAAWnJ,EAAcC,EAAkCC,KAExE4J,IAAI,CAAC,GACG,CAACvB,KAAoBT,GAASO,aAAe,EAAE,CAAE,CAACc,GAAG,CAAC,GAAiB,EAC5E,GAAGrH,CAAU,CACbmG,GAF4E,WAE7DrG,EAAY,YACzBC,aACAC,EACAX,KAAM,eACR,GACAgH,iBAAkBvG,EAAY,YAC5BC,aACAC,EACAX,KAAM,kBACR,GACF,IAED4I,KAAK,CAAC,IACLtI,CAAAA,EAAAA,EAAAA,EAAAA,CAAUA,CAAC,iBAAkBuI,EAAO,gCAC7B,CAAC1B,EAAkB,EAGlC,GAEA,OAAOiB,CACT,ESQqCpC,GAC7B8C,ERpDD,SAASC,CAA6C,EAC3D,GAAM,WAAE5D,CAAS,gBAAE6D,CAAc,CAAElK,cAAY,6BAAEmK,CAA2B,CAAE,CAAGvD,EAC3EwD,EAAcF,GAAkBlK,EAChC,CAAEqK,MAAOC,CAAS,CAAEC,QAASC,CAAU,CAAEC,SAAUC,CAAS,CAAE,CAAGC,CAAAA,EAAAA,EAAAA,EAAAA,CAAUA,EAAC,GAC5EC,EAAU/D,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAAC,GAEjBgE,EAAeC,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,KAC1BX,IACC9D,GACFqE,IAEFjI,IAHe,GAGRsI,WAJyB,CAIb,CAACH,EAAQ9C,OAAO,EAEvC,EAAG,CAAC4C,EAAWrE,EAAW8D,EAA4B,EAEhDa,EAAeF,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,KAC/BN,IACA/H,OAAOsI,YAAY,CAACH,EAAQ9C,OAAO,CACrC,EAAG,CAAC0C,EAAW,EAETS,EAAeH,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,KAC3BzE,GAAa,CAAC8D,IAChBS,EAAQ9C,OAAO,CAAGrF,OAAOyI,QADoB,EACV,CAACL,EA3Bf,IA2B6BM,CAEtD,EAAG,CAACN,EAAcxE,EAFoC8E,EAEG,EAEnDC,EAAcN,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAC7B,IACOX,IACmBC,EAAWtC,OAAO,EAAEuD,SAASC,EAAMC,GADzB,GAC+B,EAC/CP,IAAiBH,GAAAA,CAErC,EACA,CAACT,EAAYS,EAAcG,EAAcb,EAA4B,EAWvE,MARAqB,CAAAA,EAAAA,EAAAA,SAAAA,CAASA,CAAC,KACRlB,GAAaH,EAA8Ba,IAAiBC,GAC9D,EAAG,CAACA,EAAcX,EAAWU,EAAcb,EAA4B,EAEvEsB,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,YAAaT,EAAcZ,GAC5CqB,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,aAAcZ,EAAcT,GAC7CqB,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,QAASL,GAEnB,WAAEd,CAAU,CACrB,EQOwC,CAAE,GAAGpD,CAAS,CAAE,GAAGrD,CAAW,GAC9D6H,EH5DD,OG4DuBC,EH5DdA,EACd,IAAMC,EAAS7E,CAAAA,EAAAA,EAAAA,KAAAA,CAAKA,GACd8E,EAAiBhF,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAA6B,MACpDiF,EAAejF,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAA0B,MAC/C,CAACkF,EAAQC,EAAYC,EAAU,CAAGC,CAAAA,EAAAA,EAAAA,EAAAA,CAASA,GAGjD,MAAO,CACLN,gBACAG,aACAC,EACAG,UANgB,IAAMF,GAAU,kBAOhCJ,eACAC,CACF,CACF,IG8CQM,EAAcvI,EAAY4C,gBAAgB,EAAIkB,CAAY,CAAC,EAAE,CAC7DnF,EN9DCH,EM8D+BuE,EAAMpE,MAA1B6J,CN9DA7J,EM8DmC,EAAI,IAEnD8J,EAAYxB,CAAAA,EAAAA,EAAAA,GAFmBuB,QAEnBvB,CAAWA,CAAC,KACvB9K,EAAa8H,OAAO,EAAEyE,QAAQzC,MAAM,IAAM,KACjD,EAAG,EAAE,EAEC0C,EAAa1B,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,IAAM9K,EAAa8H,OAAO,EAAE2E,QAAS,EAAE,EAEhEC,EAAY5B,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,KACxB9K,EAAa8H,OAAO,EAAE,CACxB9H,EAAa8H,OAAO,CAAC6E,KAAK,EAAG,EAC7B3M,EAAa8H,OAAO,CAAC5D,MAAM,CAAG,EAElC,EAAG,EAAE,EAEC0I,EAAc9B,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,CAAC,CAAC5G,EAA8B,IAC1DlE,EAAa8H,OAAO,EAAE,CACxB9H,EAAa8H,OAAO,CAAC6E,KAAK,EAAG,EAC7B3M,EAAa8H,OAAO,CAAC5D,MAAM,CAAGA,EAAS,IAE3C,EAAG,EAAE,EAEL,SAAS2I,IACP1F,EAAe,IACb,IAAMd,EAAY,CAACxC,EAAYwC,SAAS,CAUxC,OATIA,GACFiG,IACIrF,GACF6F,CAHW,CAGQ,CAAE5L,IADT,CACe4E,EAAaC,QAAtB+G,EAAqBhH,EAAa,CAAEzF,GAAI2G,CAAS,GAErE1E,EAAW,QAADA,IAAcE,IAExBgK,IAEK,CAAE,GAAG3I,CAAW,WAAEwC,CAAU,CACrC,EACF,CAMA,SAAS0G,EAAoB,SAAE5I,CAAO,WAAEkC,CAAS,QAAEnC,CAAM,CAAe,EAClEC,EACFuI,KAEAE,EAHW,GAIPvG,GACFyG,EAAmB,CAAE5L,KADR,EAC2B6E,QAAtB+G,EAAqBhH,EAAa,CAAEzF,GAAI2G,CAAS,IATvEQ,aAAawF,OAAO,CAAC,sBAAuB1F,KAAK2F,SAAS,CAACC,QAYzChJ,CAAO,GAC3B,CA4CA,SAASiJ,EAAiBC,CAAmD,EAC3EjG,EAAe,IACb,IAAMkG,EAAYjL,EAAoBgL,GAGtC,OADA9K,EADkB,CAAC,IADkBF,GAE3BE,CAACC,GADmB,EAAE8K,EAAAA,CAAW,CACrB7K,GACf,CAAE,GAAGqB,CAAW,CAAE2C,iBAAkB4G,CAAmB,CAChE,EACF,CAiDA,IAAM1N,EAAaD,EAAY,CAC7BC,QAD4BD,GAChBmH,EAAMlH,UAAU,EAAIgI,EAAmBrB,SAAS,GAqE9D,MAlEAmF,CAAAA,EAAAA,EAAAA,SAAAA,CAASA,CAAC,KACRrE,EAAe,IACTzH,GACFgN,IACAJ,KAFc,CAIdM,EAAY/I,EAAYK,MAAM,EAC9BsI,KAEK,CACL,GAAG3I,CAAW,CACdM,QAASzE,EACT2G,UAAW3G,CACb,GAEJ,EAAG,CAACA,EAAYgN,EAAWF,EAAYF,EAAWM,EAAY,EAE9DpB,CAAAA,EAAAA,EAAAA,SAAAA,CAASA,CAAC,KACR,GAAI3H,EAAYyC,YAAY,CAAE,CAC5B,IAAMgH,EAAwB,CAAClB,GAAapE,eAAiB,IAAItH,MAAM,CACrE,GAAwC6M,EAAO7L,GAAG,GAAKmC,EAAY0C,kBAAkB,EAAE7E,KAGrF4L,EAAsBhI,MAAM,EAAE,EACVkI,OAAO,CAAEvN,IAC7BA,EAAMA,KAAK,CAACwN,WAAW,CAAG,IAC5B,GAGE5J,EAAY0C,kBAAkB,EAAE,CAClC1C,EAAY0C,kBAAkB,CAACtG,KAAK,CAACwN,WAAW,CAAG,KACjDtG,EAAe,GAAkB,EAC/B,GAAGtD,CAAW,CACd0C,IAF+B,eAEX1C,EAAY0C,kBAAkB,CACpD,GACF,CAEJ,MACM1C,CADC,CACW0C,kBAAkB,EAAE,CAClC1C,EAAY0C,kBAAkB,CAACtG,KAAK,CAACwN,WAAW,CAAG,KAGzD,EAAG,CAACrB,GAAapE,cAAenE,EAAY0C,kBAAkB,CAAE1C,EAAYyC,YAAY,CAAC,EAEzFmF,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,gBAAiB,KAC5B/L,GAAc8C,GAChBF,EAAW,MADgB,EACjBA,GAAaE,EAE3B,GAEAiJ,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAACxF,EAAoB,IACnC,IAAMyH,EAAqBpC,EAAMlF,IADAH,EACM,CAAC/E,IAAI,GAAK4E,EAAaC,UAADD,EAAa,CACpE6H,EAAmBrC,EAAMlF,MAAM,CAAClF,IAAI,GAAK4E,EAAaE,UAAU,CAGtE,GAAIiB,GAAYpD,EAAYwC,SAAS,GAFhBqH,CAEoBE,EAFED,CAAAA,EAEY,CACrD,IAAME,EAAevC,EAAMlF,MAAM,CAAC/F,EAAE,GAAK2G,EACnC8G,EAAcxC,EAAMlF,MAAM,CAAC/F,EAAE,GAAK2G,GACjB0G,GAAsBG,GACrBF,GAAoBG,CACtBC,GAAiB,GAGzC,CACF,CAJ0BA,EAMnB,CACLC,WAAY,cACVhO,CACF,EACAiO,kBAAmB,CACjB3H,aAAczC,EAAYyC,YAAY,CACtCC,mBAAoB1C,EAAY0C,kBAClC,EACA2H,qBAAsB,CACpB1H,iBAAkB3C,EAAY2C,gBAAgB,CAC9C2H,gBA5FJ,SAASA,EACPhB,EAAiB,MACjBzB,EAAaG,cAAc,CAAC/D,OAAO,EAAEsG,OACvC,EA0FIC,YAxFJ,SAASA,CAAuB,EAC9B,GAAIrO,EAAa8H,OAAO,CAAE,CACxB,IAAMwG,EAAenJ,EAAIoJ,SAAS,CFvLd,EEuLiBC,EACrCxO,GAAa8H,CFxLe,IEuLmB0G,EAC3B,CAACC,WAAW,CAAGH,CACrC,CACF,CAoFE,EACAI,mBAAoB,eAClB1E,cACAoC,cACAvI,eACA8D,EACAkF,mBACA8B,iBAlLJ,SAASA,EACPxH,EAAe,IACb,IAAMhD,EAAU,CAACN,EAAYM,OAAO,CAC9BD,EAASL,EAAYK,MAAM,CAAC,EAAE,EAAI,EAAIT,EAAeI,EAAYK,MAAM,CACvEgJ,CADkDzJ,CAC1C,CAAE,GAAGI,CAAW,SAAEM,SAASD,CAAO,EAGhD,OAFA5B,EAAW,QAADA,GACVyK,EAAoBG,GACbA,CACT,EACF,EA0KI0B,eAxKJ,SAASA,EACPzH,EAAe,IACb7E,EAAW,KAAME,GAAPF,IACJgE,EAAe,CAACzC,EAAYyC,YAAY,CAC9C,MAAO,CAAE,GAAGzC,CAAW,cAAEyC,CAAa,CACxC,EACF,eAmKIoF,EACAmD,cAlKJ,SAASA,CAAgE,EACvE1H,EAAgBtD,IACd,IAAMiL,EAAkB,CAAC1C,GAAapE,eAAe1C,SAAU,IAAO,EAChE+H,EAAYjL,EAAoB2M,GAGtC,OADAzM,EADkBwM,EAAkB,GADC1M,EACO,CAAC,CAClCG,GADsC,EAAE8K,EAAAA,CAAW,CACxC7K,GACf,CACL,GAAGqB,CAAW,CACdyC,cAAc3F,CAAQoO,EACtBxI,mBAAoBwI,GAAmBlL,EAAY0C,kBAAkB,CAEzE,EACF,mBAuJI4G,EACA6B,iBA7IJ,SAASA,CAAiF,EACxF7H,EAAe,IACb,GAAItD,EAAY4C,gBAAgB,EAAE+B,WAAayG,EAAmBzG,QAAQ,CACxE,CAD0E,MACnE3E,EAGT,IAAM0C,EAAqB1C,EAAY0C,kBAAkB,CP1KxD,SAAS2I,EO2KKA,kBP3KSD,CAAkB,aAAE/M,CAAW,CAAY,EACvE,OAAOF,EAAUiN,GAAoBjH,cAAe9F,EACtD,EOyKsB,oBAAE+M,EAAoB/M,YAAa2B,EAAY0C,kBAAkB,GAC7E,KAEEC,EAAmB3C,EAAY2C,gBAAgB,CACjD2I,SPxKMA,KOwKQA,ePxKSF,CAAkB,aAAE/M,CAAW,CAAY,EAC1E,OAAOF,EAAUiN,GAAoB/G,iBAAkBhG,EACzD,EOsKyB,CAAE+M,qBAAoB/M,YAAa2B,EAAY2C,gBAAgB,GAC9E,KAEJ,GAAIxG,EAAa8H,OAAO,CAAE,CAExB,IAAM2G,EADerC,GAAa3D,aAAewG,EAAmBxG,UAAU,CAC3CzI,EAAa8H,OAAO,CAAC2G,WAAW,CAAG,EACtEzO,EAAa8H,OAAO,CAACpG,GAAG,CAAGuN,EAAmBzG,QAAQ,CACtDxI,EAAa8H,OAAO,CAAC2G,WAAW,CAAGA,CACrC,CAEA,IAAM/F,IAAiCuG,EAAmBvG,OAAvC2D,GAAiD,EAAI,IAKxE,OAHA/J,EADkB,CADoB+J,OAE5B/J,CAACC,GADmB,EAAEmG,EAAAA,CAAY,CACtBlG,GACtBqB,EAAYwC,SAAS,CAAGiG,IAAcE,IAE/B,CACL,GAAG3I,CAAW,kBACd2C,qBACAD,EACAE,iBAAkBwI,CACpB,CACF,EACF,EA6GInL,aAjMJ,SAASA,CAA0C,EACjDqD,EAAe,IACb,IAAMhD,EAAUD,CAAM,CAAC,EAAE,EAAI,EACvBgJ,EAAQ,CAAE,GAAGrJ,CAAW,SAAEM,SAASD,CAAO,EAEhD,OADA6I,EAAoBG,GACbA,CACT,EACF,eA2LIlN,WACAiH,CACF,CACF,CACF,gBCtRO,SAASmI,EAAM,UACpB5G,CAAQ,gBACR6G,CAAc,CACdrP,cAAY,SACZsP,CAAO,aACPC,CAAW,YACX7P,EAAa,EAAI,OACjBiN,EAAQjN,CAAU,iBAClB8P,CAAe,gBACfC,CAAc,CACd,GAAGC,EACQ,EACX,IAAMC,EAAiBN,GAAkB,CAAC3P,EACpCkQ,EAAWnQ,EAAY,SAADA,GAAGC,CAAW,GAE1C,MACE,WAACmQ,SAAAA,CAAOxL,UAAWmL,YAChBhH,EACC,UAACsH,MAAAA,CAAIzL,UAAWpB,IAAW,gBAADA,kBAAoCyM,EAAKrL,SAAS,WAC1E,UAAC0L,QAAAA,CACC1P,GAAIiP,EACJU,cAAY,eACZC,IAAI,IACJC,WAAW,IACV,GAAGR,CAAI,CACRrL,UAAWpB,IAAW,gBAADA,gBAAkCwM,GACvD/N,IAAK8G,EACL2H,OAAQd,EACRO,SAAUA,EACVjD,MAAOA,EACPyD,IAAKpQ,EACLqQ,YAAY,YACZC,QAASX,EAAiB,YAASY,EACnCC,QAAS,IACPhP,CAAAA,EAAAA,EAAAA,EAAAA,CAAUA,CACR,iBACA,MAAU,iBACV,CAAC,eAAe,EAAEgH,EAAAA,CAAU,EAE9BkH,EAAKc,OAAO,GAAGC,EACjB,MAGF,KAEHlB,EAAc,UAACmB,EAAAA,CAAOA,CAAAA,CAAE,GAAGnB,CAAW,GAAO,OAGpD,CChFA,IAAMoB,EAAgBC,CAAAA,EAAAA,EAAAA,UAAAA,CAAUA,CAAwC,SAASD,CAC1E,CACLP,CAAG,EAEH,GAAM,qBAAEpN,CAAmB,UAAE6N,CAAQ,aAAEC,CAAW,kBAAEC,CAAgB,CAAE,GAAGC,EAAa,CAAGpK,EACzF,MACE,WAACqK,KAAAA,CAAG5M,UAAW0M,YACb,UAACG,SAAAA,CACE,GAAGF,CAAW,CACfZ,IAAKA,EACLlP,KAAK,SACLmD,UAAWpB,IACT,gBADmBA,+DAEnBqB,EAAW,QAADA,aAAGtB,CAAoB,GACjCgO,EAAY3M,SAAS,WAGtByM,IAEFD,IAGP,kBC7BO,SAASM,EAAY,qBAC1BnO,CAAmB,CACnB,GAAGoO,EACiF,EAGpF,MACE,UAACC,EAAAA,EAAIA,CAAAA,CACF,GAAGD,CAAS,CACb/M,UAAWpB,IACT,eACA,CAFmBA,oHALc,CAS7BE,QATKH,EAUP,6BATgC,CASFE,UAChC,EACAkO,EAAU/M,SAAS,GAI3B,CClBO,SAASiN,EACd1K,CAIG,EAEH,GAAM,qBAAE5D,CAAmB,QAAE4I,CAAM,cAAEE,CAAY,CAAEC,QAAM,UAAE8E,CAAQ,WAAExM,CAAS,CAAE,CAAGuC,EAE7E2K,EAyBR,SAA0B3K,CAA+C,EACvE,GAAM,CAAC2K,EAAWC,EAAa,CAAGpK,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAAgB,MACpD,QAAE2E,CAAM,CAAE0F,YAAU,cAAE3F,CAAY,gBAAED,CAAc,CAAE,CAAGjF,EAiB7D,MAfA4E,CAAAA,EAAAA,EAAAA,SAAAA,CAASA,CAAC,KACR,IAAMkG,EAAcD,EAAW3J,OAAO,EAAE6J,wBAClCC,EAAW9F,EAAahE,OAAO,EAAE6J,wBACjCE,EAAahG,EAAe/D,OAAO,EAAE6J,wBAE3CH,EAAa,KACX,GAAIzF,GAAU6F,GAAYF,GAAeG,EAAY,CACnD,IAAMC,EAASJ,EAAYK,MAAM,CAAGH,EAASG,MAAM,CAC7CC,EAAeH,EAAWI,MAAM,CAAG,EACzC,OAAOP,EAAYO,MAAM,CAAGH,EAASE,CACvC,CACA,OAAO,IACT,EACF,EAAG,CAACjG,EAAQF,EAAgBC,EAAc2F,EAAW,EAE9CF,CACT,EA7CqC3K,GAEnC,MACE,UAACkJ,MAAAA,CACCzP,GAAIuL,EACJwE,IAAKtE,EACLoG,MAAOX,EAAY,CAAEA,UAAW,GAAGA,EAAU,EAAE,CAAE,EAAI,CAAC,EACtDlN,UAAWpB,IACT,gBADmBA,mEAEnBqB,EAAW,QAADA,aAAGtB,CAAoB,GACjC,CACE,sCAAsCrC,CAAQ4Q,EAC9C,iBAb+B,CAabpO,QAbXH,EAcP,6BAA8B+I,EAC9B,8BAA+B,CAACA,EAChCoG,OAAQ,CAACpG,CACX,EACA1H,YAGDwM,GAGP,CClCO,SAASuB,EACdxL,CAAiG,EAEjG,GAAM,UAAEiK,CAAQ,qBAAE7N,CAAmB,CAAE,GAAGqP,EAAW,CAAGzL,EAExD,MACE,UAAC0L,KAAAA,CACE,GAAGD,CAAS,CACbE,KAAK,OACLlO,UAAWpB,IACT,gBADmBA,yDAEnBqB,EAAW,CAAEtB,OAAHsB,cAAuB,GACjC+N,EAAUhO,SAAS,WAGpBwM,GAGP,CClBO,SAAS2B,EAAY,qBAC1BxP,CAAmB,eACnByP,CAAa,CACbC,cAAY,UACZ7B,CAAQ,kBACRE,CAAgB,CAChB,GAAGC,EAOF,EACD,MACE,UAACC,KAAAA,CAAG5M,UAAWpB,IAAW,QAAS8N,QAAV9N,IACvB,WAACiO,SAAAA,CACE,GAAGF,CAAW,CACf9P,KAAK,SACLmD,UAAWpB,IACT,gBADmBA,mDAEnB+N,EAAY3M,SAAS,YAGtBoO,EACD,UAACE,OAAAA,CACCtO,UAAWpB,IACT,gBADmBA,SAEnBF,EAAoB,iBAADA,IAAGC,CAAoB,aAG3C6N,IAEF6B,MAIT,CCbO,SAASE,EAAahM,CAAwB,EACnD,GAAM,qBAAE5D,CAAmB,CAAE,CAAG4D,EAC1B,CAAE7C,GAAC,CAAE,CAAGE,CAAAA,EAAAA,EAAAA,EAAAA,CAAcA,CAAC,oBACvB4O,EAAcC,SAgKbA,CAAyC,EAChD,GAAM,CAAE/O,CAAC,CAAE,CAAGE,CAAAA,EAAAA,EAAAA,EAAAA,CAAcA,CAAC,oBACvB,CAAC8O,EAAgBC,EAAkB,CAAG5L,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAA6B,YAC3E6L,EAAiBpL,EAAQuE,WAAW,EAAEpE,eAAiB,EAAE,CACzDD,EAAckL,EAAe3N,MAAM,CAAG,EACtC6C,EAAiBN,EAAQF,YAAY,CAACrC,MAAM,CAAG,EAC/C4N,EAAoBrL,EAAQuE,WAAW,EAAElE,kBAAoB,EAAE,CAC/DD,EAAiBiL,EAAkB5N,MAAM,CAAG,EAG5CuN,EAAc,CAClB9K,GAAe,CACb7G,KAAM,eACNV,MACE,iCACGuD,EAAE,aAAa,IAAC,UAACoP,OAAAA,CAAK3O,MAAOT,EAAE,qBAAcA,EAAE,WAGpDqP,WAA+B,iBAAnBL,EACZM,YAAaxL,EAAQgH,aAAa,CAClCyE,kBAAmB,IAAMN,EAAkB,gBAC3CnL,QAAS,CACP,CACEuL,WAAY,CAACvL,EAAQhE,WAAW,CAACyC,YAAY,CAC7C9F,MAAOuD,EAAE,OACT9D,MAAO,IACT,KACGgT,EAAe/J,GAAG,CAAC,GAAY,EAChCkK,GADgC,QAE9BvL,EAAQhE,WAAW,CAACyC,YAAY,EAChCuB,EAAQhE,WAAW,CAAC0C,kBAAkB,EAAE7E,MAAQzB,EAAMyB,GAAG,CAC3DlB,MAAOP,EAAMO,KAAK,OAClBP,EACF,GACD,EAEHkI,GAAkB,CAChBjH,KAAM,aACNV,MAAOuD,EAAE,cACTqP,WAA+B,eAAnBL,EACZM,YAAaxL,EAAQmH,gBAAgB,CACrCsE,kBAAmB,IAAMN,EAAkB,cAC3CnL,QAASA,EAAQF,YAAY,CAACuB,GAAG,CAAC,GAAY,EAC5CkK,GAD4C,QAChCvL,EAAQuE,WAAW,EAAE5D,WAAavI,EAAMuI,QAAQ,CAC5DhI,MAAOP,EAAMyI,UAAU,OACvBzI,EACF,EACF,EACAgI,GAAkB,CAChB/G,KAAM,kBACNV,MAAOuD,EAAE,cACTqP,WAA+B,oBAAnBL,EACZM,YAAaxL,EAAQsF,gBAAgB,CACrCmG,kBAAmB,IAAMN,EAAkB,mBAC3CnL,QAAS,CACP,CACEuL,WAAY,CAACvL,EAAQhE,WAAW,CAAC2C,gBAAgB,CACjDhG,MAAOuD,EAAE,OACT9D,MAAO,IACT,KACGiT,EAAkBhK,GAAG,CAAC,GAAY,EACnCkK,GADmC,QACvBvL,EAAQhE,WAAW,CAAC2C,gBAAgB,EAAE9E,MAAQzB,EAAMyB,GAAG,CACnElB,MAAOP,EAAMO,KAAK,OAClBP,EACF,GACD,EAEJ,CAACS,MAAM,CAACC,SAET,MAAO,CACL,GAAGkH,EAAQ0L,SAAS,CACpBC,aA/DmB,IAAMR,EAAkB,wBAgE3CH,CACF,CACF,EA1OqCjM,GAC7B,QAAEmF,CAAM,YAAEC,CAAU,QAAEJ,CAAM,gBAAEC,CAAc,cAAEC,CAAY,CAAE,CAAG+G,EAErE,MACE,UAAClC,EAAaA,CACZ8C,UADY9C,GACA5M,EAAE,YACd2P,gBAAe9H,EACf+H,eAAa,IACbC,gBAAe7H,EACfqE,IAAKvE,EACLgI,QAAS7H,EACThJ,oBAAqBA,EACrB8N,YACE,iCACE,UAACK,EAAWA,CACVtO,KAAK,GADKsO,QAEVnO,oBAAqBA,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQpG,CAAO,KAEzC,EAFuB9I,CAEvB,OAACkO,EAAWA,CACVtO,KAAK,GADKsO,QAEVlM,QAAQ,QACRjC,oBAAqBA,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQ,CAACpG,CAAO,MAAnB9I,WAK3B,UAACqO,EAAWA,CAAE,GAAGuB,CAAW,CAAEpB,GAAlBH,QAA8B1K,EAAM5G,YAAY,UACzD+L,EACC,UAAC+H,EAAAA,CACE,GAAGlN,CAAK,CACR,GAAGiM,CAAW,CACfhH,eAAgBA,EAChBC,aAAcA,IAEd,QAIZ,CAKA,SAASgI,EAAK,aACZjB,CAAW,qBACX7P,CAAmB,WACnBmJ,CAAS,gBACTN,CAAc,cACdC,CAAY,cACZ0H,CAAY,CACK,EACjB,SAASO,IACP5H,IACAqH,GACF,EVrDK,SAASQ,CAAmD,EACjE,GAAM,EUsDWA,cVtDTnI,CAAc,cAAEC,CAAY,WAAEiI,CAAS,CAAE,CAAGlM,EAC9CoM,EAAc,IAAMpI,EAAe/D,OAAO,EAAEsG,QAElD8F,CAAAA,EAAAA,EAAAA,EAAAA,CAAiBA,CAACpI,EAAc,IACzBD,EAAe/D,OAAO,EAAEuD,SAASC,EAAMC,MAAM,GAAkB,GAGtE,GAEAE,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CACd,UACA,IAEE,OADAH,EAAM6I,eAAe,GACb7I,EAAM8I,GAAG,EACf,IAAK,MACH3R,OAAO4R,qBAAqB,CAAC,KACtBvI,EAAahE,OAAO,EAAEuD,SAASlL,SAASmU,aAAa,GAAG,CAC3DP,IACAE,IAEJ,GACA,KACF,KAAK,SACHF,IACAE,IACA,KACF,KAAK,UACL,IAAK,YACH,CACE,IAAMM,EAAazI,EAAahE,OAAO,EAAE0M,cAAc,MACjDC,EAAW3L,MAAMC,IAAI,CAACwL,GAAYG,iBAAiB,WAAa,EAAE,EAC5CC,CAAAA,EAAAA,EAAAA,EAAAA,CAAoBA,CAAC,CAAEF,UAAS,GACxCnJ,EACtB,CAIJ,CACF,EACAQ,EAEJ,EUaoB,cAChBA,iBACAD,YACAkI,CACF,GAEA,IAAMhB,EAAiBF,EAAY1Q,IAAI,CAAC,GAAYoL,EAAO6F,UAAU,EAC/DjQ,EAAiC,SAAxBH,EACTE,EAAkC,UAAxBF,SAEhB,EAEI,WAACoP,EAAWA,CAFI,QAEJA,YAAgDpP,YACzD+P,EAAelL,OAAO,CAACqB,GAAG,CAAC,GAC1B,UAACsJ,EAAWA,CAEVxP,QAFUwP,YAEWxP,EACrB6Q,QAAS,KACPd,EAAeM,WAAW,CAACuB,EAAU3U,KAAK,EAC1C8T,IACAlI,EAAe/D,OAAO,EAAEsG,OAC1B,EACAmE,KAAK,gBACLsC,eAAcD,EAAUxB,UAAU,CAClC0B,UAAWF,EAAUxB,UAAU,CAC/BX,cACE,UAACtB,EAAWA,CACV4D,KAAK,GADK5D,EAEVtO,KAAK,QACLG,oBAAqBA,EACrBqB,UAAWpB,IAAW,CAAE,eAAHA,KAAwB,CAAC2R,EAAUxB,UAAU,cAIrEwB,EAAUpU,KAAK,EAnBXoU,EAAUpU,KAAK,GAsBxB,UAACgS,EAAWA,CAEVxP,QAFUwP,YAEWxP,EACrB+N,iBAAkB9N,IAChB,CAAE,YAAa,CAACC,EADUD,CACC,CAACE,CAAO,EACnCmB,EAAW,QAADA,aAAGtB,CAAoB,IAEnC6Q,QAASL,EACTf,cACE,UAACtB,EAAWA,CACV4D,KAAK,GADK5D,EAEVtO,KAAK,iBACLG,oBAAqBA,EACrBqB,UAAU,mBAGdyQ,UAAW,CAAC/B,EAAelL,OAAO,CAAC/F,IAAI,CAAC,GAAe8S,EAAUxB,UAAU,EAC3EQ,iBAAe,WAEdb,EAAevS,KAAK,EAlBhBuS,EAAe7R,IAAI,IA1BV6R,EAAe7R,IAAI,EAmDvC,UAACkR,EAAWA,CAACpP,QAADoP,YAAsBpP,WAC/B6P,EAAY3J,GAAG,CAAC,CAACqE,EAAQyH,IACxB,UAACxC,EAAWA,CAEVxP,QAFUwP,YAEWxP,EACrB6Q,QAAStG,EAAO+F,iBAAiB,CACjCjP,UAAU,kBACVyQ,UAAqB,IAAVE,EACXpB,iBAAe,EACflB,aACE,UAACvB,EAAWA,CACV4D,KAAK,GADK5D,EAEVtO,KAAK,iBACLG,oBAAqBA,EACrBqB,UAAU,qCAIbkJ,EAAO/M,KAAK,EAfR+M,EAAOrM,IAAI,IAoB1B,CCzHO,SAAS+T,EACdrO,CAAmF,EAEnF,GAAM,WACJvC,CAAS,qBACTrB,CAAmB,CACnBgH,eAAa,CACbnG,aAAW,aACXuI,CAAW,cACXzE,CAAY,gBACZiH,CAAc,kBACdD,CAAgB,kBAChB9B,CAAgB,CAChBnB,cAAY,eACZmD,CAAa,kBACb1B,CAAgB,kBAChB6B,CAAgB,cAChBlL,CAAY,cACZoR,CAAY,UACZjO,CAAQ,cACRjH,CAAY,CACb,CAAG4G,EACE,CAAE7C,GAAC,CAAE,CAAGE,CAAAA,EAAAA,EAAAA,EAAAA,CAAcA,CAAC,oBACvBkR,EAAUtO,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAAyB,MACzCkB,EAAc,CAACqE,GAAapE,eAAiB,IAAI1C,MAAM,CAAG,EAC1D8P,EAAsB,CAAChJ,GAAapE,eAAiB,IAAI1C,MAAM,CAAG,EAClE2C,EAAiB,CAACmE,GAAalE,kBAAoB,IAAI5C,MAAM,CAAG,EAChE+P,EAAuB1N,EAAarC,MAAM,CAAG,EAE7CgQ,EAAqB5J,GAAcK,OACnCwJ,EAAiC,gBAAjBL,EAEtBzJ,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CACd,UACA,IACE,IAAMF,EAASD,EAAMC,MAAM,CAC3B,IAAkB,cAAdD,EAAM8I,GAAG,EAAkC,eAAd9I,EAAM8I,GAAG,GAAmB,CACtD7I,GAAQlL,IAAImV,SAAS,gBAAiB,CACzClK,EAAMmK,cAAc,GACpB,IAAMhB,EAAW3L,MAAMC,IAAI,CAACoM,EAAQrN,OAAO,EAAE4M,iBAAiB,WAAa,EAAE,EACjDC,CAAAA,EAAAA,EAAAA,EAAAA,CAAoBA,CAAC,UAAEF,CAAS,GACxCnJ,EACtB,CAEJ,EACA6J,GAGF,IAAMO,EAAmC3R,EAAhBwR,EAAkB,iBAAsB,GAAFxR,MACzD4R,EAAkC5R,EAAhBwR,EAAkB,gBAAqB,GAAFxR,KAC7D,MACE,UAAC+L,MAAAA,CAAIzL,UAAWA,EAAW2L,cAAY,0BACrC,WAACsC,KAAAA,CACCjO,UAAWpB,IACT,gBADmBA,uGAEnBqB,EAAW,QAADA,aAAGtB,CAAoB,GACjC,CACE,cAAegH,EAAcM,SAAS,CACtC,YAAa,CAACN,EAAcM,SAAS,GAGzC0F,cAAY,oBACZI,IAAK+E,YAEL,UAACxE,EAAaA,CACZ8C,UADY9C,GACA9M,EAAYwC,SAAS,CAAGqP,EAAmBC,EACvD3S,oBAAqBA,EACrB6Q,QAAShH,EACTiE,YACE,iCACE,UAACK,EAAWA,CACVnO,QADUmO,YACWnO,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQ,CAACtO,EAAYwC,KAAxBpD,IAAiC,GACtDJ,KAAK,UAEP,UAACsO,EAAWA,CACVnO,QADUmO,YACWnO,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQtO,EAAYwC,MAAvBpD,GAAgC,GACrDJ,KAAK,cAKZoE,EACC,UAAC0J,EAAaA,CACZ8C,UADY9C,EACZ8C,CAAkC1P,EAAtBF,EAAYM,OAAO,CAAK,SAAc,GAAFJ,KAChDf,oBAAqBA,EACrB6Q,QAASlF,EACToC,iBAAiB,iBACjBD,YACE,iCACE,UAACK,EAAWA,CACVnO,QADUmO,YACWnO,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQ,CAACtO,EAAYM,KAAxBlB,EAA+B,GACpDJ,KAAK,cAEP,UAACsO,EAAWA,CACVnO,QADUmO,YACWnO,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQtO,EAAYM,MAAvBlB,CAA8B,GACnDJ,KAAK,yBAKV,EAMG,KALF,UAACe,EAAYA,CACXZ,SADWY,WACUZ,EACrBa,YAAaA,EACbC,aAAcA,MAIlB,KACHiE,EACC,UAAC4I,EAAaA,CACZ8C,UADY9C,GACA5M,EAAE,YACd6R,gBAAcjV,CAAQkD,EAAY0C,kBAAkB,CACpDvD,oBAAqBA,EACrB6Q,QAAS,KACP,IAAMgC,EAAehS,EAAY0C,kBAAkB,CAC7CuP,EAAa1J,GAAapE,eAAe,CAAC,EAAE,CAClD6N,EAAejH,IAAmBC,EAAciH,EAClD,EACAhF,YACE,iCACE,UAACK,EAAWA,CACVnO,QADUmO,YACWnO,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQ,CAACtO,EAAYyC,KAAxBrD,OAAoC,GACzDgC,QAAQ,QACRpC,KAAK,oBAEP,UAACsO,EAAWA,CACVnO,QADUmO,YACWnO,EACrBqB,UAAWpB,IAAW,CAAEkP,OAAQtO,EAAYyC,MAAvBrD,MAAmC,GACxDJ,KAAK,yBAKX,KACHkT,GAhHoC9N,GAAkBoN,EAiHrD,UAACzC,EAAYA,CACX5P,SADW4P,WACU5P,EACrBoJ,YAAaA,EACbzE,aAAcA,EACd9D,YAAaA,EACbmL,iBAAkBA,EAClB7B,iBAAkBA,EAClB0B,cAAeA,EACf0E,UAAW7H,EACX1L,aAAcA,IAEd,SAIZ,CCzMO,SAASgW,EAAc,cAC5B1P,CAAY,oBACZC,CAAkB,CAClBvD,oBAAqBiT,CAAoB,CACzC,GAAGC,EACgB,EACnB,IAAMC,EAAa7P,EACf,MAAOyC,IAAI,CAACxC,GAAoBtG,MAAMkW,YAAc,EAAE,EAAezV,MAAM,CAACwE,GAC5E,EAAE,KADoFA,GAG1F,EAAeI,MAAM,CAEjB,CAFmB,EAEnB,OAACwK,MAAAA,CACE,GAAGoG,CAAY,CAChB7R,UAAWpB,IACT,gBADmBA,sFAEnBiT,EAAa7R,SAAS,WAGvB8R,EAAWjN,GAAG,CAAE/D,GACf,UAAC2K,MAAAA,CAECsG,wBAAyB,CACvBC,OAAQ9Q,EAAWJ,GAAKQ,IAAI,CAAVJ,EAFfJ,EAAIC,IAAI,KAUhB,IACT,gBCnBO,SAASkR,EAAgB1P,CAA2B,EACzD,OAAOA,EAAMJ,gBAAgB,CAC3B,UAAC+P,EAAAA,CAAY,GAAG3P,CAAK,CAAEJ,iBAAkBI,EAAMJ,gBAAgB,GAC7D,IACN,CAEA,SAAS+P,EAAW,kBAClB/P,CAAgB,iBAChB2H,CAAe,aACfE,CAAW,qBACXrL,CAAmB,CACnB,GAAGkT,EACa,EAChB,GAAM,GAAEnS,CAAC,CAAE,CAAGE,CAAAA,EAAAA,EAAAA,EAAAA,CAAcA,CAAC,oBAE7B,MACE,WAAC6L,MAAAA,CAAK,GAAGoG,CAAY,CAAE7R,UAAWpB,IAAW,gBAADA,KAAuBiT,EAAa7R,SAAS,YACvF,WAACyL,MAAAA,CAAIzL,UAAU,yDACb,WAACmS,KAAAA,CAAGnS,UAAU,iDACZ,UAACgN,EAAAA,EAAIA,CAAAA,CAAChN,UAAU,OAAOxB,KAAK,gBAC3BkB,EAAE,iBAEL,UAACmN,SAAAA,CAAOuC,aAAY1P,EAAE,SAAU7C,KAAK,SAAS2S,QAAS1F,EAAiB2G,SAAS,aAC/E,UAACzD,EAAAA,EAAIA,CAAAA,CAACxO,KAAK,eAGf,UAAC4T,EAAAA,CAECjQ,iBAAkBA,EAClBxD,oBAAqBA,EACrBmL,gBAAiBA,EACjBE,YAAaA,GAJR7H,EAAiBvG,KAAK,CAACI,EAAE,IAQtC,CA8BA,SAASoW,EAAe,kBACtBjQ,CAAgB,iBAChB2H,CAAe,aACfE,CAAW,qBACXrL,CAAmB,CAIpB,QACC,GAAM,GAAEe,CAAC,CAAE,CAAGE,CAAAA,EAAAA,EAAAA,EAAAA,CAAcA,CAAC,oBACvBkR,EAAUtO,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAAyB,MACzC,CAAEwD,MAAOqM,CAAS,CAAEnM,QAASoM,CAAS,CAAElM,SAAUmM,CAAQ,CAAE,CAAGjM,CAAAA,EAAAA,EAAAA,EAAAA,CAAUA,EAAC,GAC1E,CAACkM,EAAeC,EAAiB,CAAG1P,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAA2B,MACvE2P,EAAsBlQ,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAACL,GAC7B,SAAEwQ,CAAO,YAAEb,CAAU,eAAEc,CAAa,CAAEC,YAAU,CAAE,CAAGC,SA1CpDA,CAA6D,EACpE,IAAMH,EAAUpO,CAAAA,EAAAA,EAAAA,OAAAA,CAAOA,CAAC,IAAMwO,MA0LhBrO,IAAI,CA1LoBvC,EA0LFvG,KAAK,CAACoX,IAAI,EAAI,EAAE,EACjD3W,MAAM,CAACwE,GACPgE,GAAG,CAAC,GADahE,CAEhBC,EAAI9E,EAAE,CAAG8E,EAAI9E,EAAE,EZ9OZ,CAAC,CY8OeiX,KAASnS,EZ9Ob9E,CY8OYiX,CZ9OV,CAAEC,OAAOC,UAAU,GAAG,CAAC9W,MAAM,CAACC,SAASC,IAAI,CAAC,KY+OtDuE,IA9L8C,CAACqB,EAAiB,EACrE,CAAC,YAAE2P,CAAU,eAAEc,CAAa,CAAE,CAAEQ,EAAc,CAAGrQ,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAG5D,KACD,IAAM+O,EAAauB,EAAclR,GAC3ByQ,EAAgBd,CAAU,CAACA,EAAW7Q,MAAM,CAAG,EAAE,EAAK0R,CAAO,CAAC,EAAE,CACtE,MAAO,YAAEb,gBAAYc,CAAc,CACrC,GAWA,MAAO,SACLD,aACAb,gBACAc,EACAC,WAbF,SAASA,EACPO,EAAc,IACZ,IAAMtB,EAAauB,EAAclR,GAE3ByQ,EAAgBU,CADM,CAACxB,EAAW7Q,MAAM,CAAG,EAAE,EAChBsS,EAASX,aAAa,CACzD,MAAO,CAAEd,2BAAYc,CAAc,CACrC,EACF,CAOA,CACF,EAgBqEzQ,GAC7DqR,EAAkBhR,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAACsP,EAAW7Q,MAAM,CAAG,GAE7CwS,EAAsBnD,CAAAA,EAAAA,EAAAA,EAAAA,CAAoBA,CAAC,CAC/CF,QAAAA,EAAUsD,EAAc5C,EAuKnBrM,GADwD,GAClDC,IAAI,CAACoM,EAAQrN,OAAO,EAAE4M,iBAAiB,gBAAkB,EAAE,GAtKtEsD,YAAalB,EACbmB,gBAAiBnB,CACnB,GAYMoB,EAAoBpN,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,KACpC,IAAMqN,EAAiBhC,CAAU,CAAC,EAAE,CACpC,GAAIhB,EAAQrN,OAAO,EAAIqQ,GAAkBzB,EAAW,CAClD,IAAM0B,EAAeC,GAAgBlD,EAASgD,GAC9C,GAAIC,GAAgBA,EAAaE,aAAa,CAAE,CAC9C,GAAM,WAAEC,CAAS,cAAEC,CAAY,CAAE,CAAGJ,EAAaE,aAAa,CACxD,CAAEG,WAAS,CAAEC,cAAY,CAAE,CAAGjW,OAAOkW,gBAAgB,CAACP,EAAaE,aAAa,EAGhFM,EADaL,EAAYC,GADXK,SAASJ,EAAW,CACMK,GADAD,SAASH,EAAc,KAE5CvD,EAAQrN,OAAO,CAACyQ,SAAS,CAClDV,EAAgB/P,OAAO,EAAG,EAC1BqN,EAAQrN,OAAO,CAACiR,QAAQ,CAAC,KAAEH,CAAI,EACjC,CACF,CACF,EAAG,CAAClC,EAAWP,EAAW,EAuB1B,MANA3K,CAAAA,EAAAA,EAAAA,SAAAA,CAASA,CAAC0M,EAAmB,CAACA,EAAkB,EAChDzM,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,YAAayL,EAAYH,GAC1CtL,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,SA3CA,CA2CUuN,IA1CpBnB,EAAgB/P,OAAO,EAAE,GAGhC,EAuCqCqN,GACrC1J,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,YAtCG,CAsCUwN,IArC5BpB,EAAgB/P,OAAO,EAAG,CAC5B,EAoC2CqN,GAC3C1J,CAAAA,EAAAA,EAAAA,EAAAA,CAAgBA,CAAC,UAnBC,CAmBUyN,GAjB1B,OADA5N,EAAM6I,eAAe,GACb7I,EAAM8I,GAAG,EACf,IAAK,SACHjG,IACA,KACF,KAAK,UACL,IAAK,YACH2J,EAAoBxM,EAIxB,CACF,EAMuC6J,GAGrC,iCACE,UAACgE,KAAAA,CACC9U,UAAWpB,IACT,gBADmBA,8EAEnB,CACE,QAAS,CAACyT,CACZ,GAEFtG,IAAK+E,EACLnF,cAAY,wCAEXgH,EAAQ9N,GAAG,CAAC,IACX,IAAMkQ,EAAWjD,EAAWX,QAAQ,CAACrQ,GAC/BkU,EAAcxC,EAChBA,EAAc5V,OAAO,CAACZ,EAAE,GAAK8E,EAAI9E,EAAE,CACnC4W,IAAkB9R,EACtB,MACE,UAACmU,EAAAA,CACCF,SAAUA,EACVC,YAAaA,EACblU,IAAKA,EAELkJ,YAAaA,GADRlJ,EAAI9E,EAAE,CAIjB,KAED,EAaG,KAZF,UAACkZ,EAAAA,CAAWA,CAAAA,CACVlV,UAAU,2EACVwP,QAAS,KACPgE,EAAgB/P,OAAO,EAAG,EAC1B6O,IACAG,EAAiB,MACjBuB,GAAgBlD,EAAS8B,IAAgB7I,OAC3C,EACA5N,MAAOuD,EAAE,QACTf,oBAAqBA,EACrBiC,QAAQ,YAKlB,CAEA,SAASqU,EAAe,KACtBnU,CAAG,aACHkJ,CAAW,UACX+K,CAAQ,CACRC,aAAW,CAKZ,EACC,GAAM,GAAEtV,CAAC,CAAE,CAAGE,CAAAA,EAAAA,EAAAA,EAAAA,CAAcA,CAAC,oBACvB,MAAEmB,CAAI,MAAEO,CAAI,CAAE,CAAGJ,EAAWJ,GAClC,KADiCI,CAE/B,UAAC0L,KAAAA,CAAG5M,UAAU,eACZ,WAAC6M,SAAAA,CACChQ,KAAK,SACLmD,UAAWpB,IAAW,gBAADA,2CAA6D,CAChF,YAAamW,CACf,GACAvF,QAAS,IAAMxF,EAAYlJ,GAC3BqU,SAAUH,EAAc,EAAI,CAAC,EAC7BI,UAAStU,EAAI9E,EAAE,CACfqZ,iBAAcN,GAAW,OACzB3F,EADkC,WACtB1P,EAAE,OAAQ,CACpB4V,QAAS5V,EAAE,SAAU,CAAE6V,MAAOC,GAAa1U,EAAIoJ,SAAS,CAAE,GAC1DuL,QAAS/V,EAAE,SAAU,CAAE6V,MAAOG,GAAa5U,EAAIoJ,SAAS,CAAE,QAC1DnJ,CACF,aAEA,UAACuN,OAAAA,CAAKtO,UAAU,6DAsBxB,SAAS2V,CAAuB,EAC9B,IAAMC,EAASC,GAAQL,GAAaM,IAC9BC,EAASF,GAAQH,GAAaI,IACpC,MAAO,GAAGF,EAAO,CAAC,EAAEG,EAAAA,CAAQ,EAxBRjV,EAAIoJ,SAAS,IAE3B,UAACoE,OAAAA,CAAKtO,UAAU,aAAa+R,wBAAyB,CAAEC,OAAQ1Q,CAAK,QAI7E,CAEA,SAAS+R,EAAclR,CAAqD,EAC1E,OAAO,MAAOuC,IAAI,CAACvC,EAAiBvG,KAAK,CAACkW,UAAU,EAAI,EAAE,EAAezV,MAAM,CAACwE,EAClF,QAD4FA,EAkB5F,IAAM2U,GAAgBM,GAAiBzW,KAAKC,KAAK,CAACwW,EAAO,IACnDJ,GAAe,GAAkBrW,KAAKC,KAAK,CAACwW,EAAO,IACnDD,GAAU,GAAkBC,EAAKE,QAAQ,GAAGC,QAAQ,CAAC,EAAG,KAE9D,SAASjC,GACPlD,CAA0C,CAC1ChQ,CAAW,EAEX,OAAO,EAAS2C,OAAO,EAAE0M,cAAc,CAAC,UAAU,EAAErP,EAAI9E,EAAE,CAAC,EAAE,CAAC,GAA2B,IAC3F,CCxQO,SAASka,GAAsB,aAAEC,GAAc,CAAI,CAA8B,EACtF,IAAMC,EAAsB,qDAE5B,MAAO7R,CAAAA,EAAAA,EAAAA,OAAAA,CAAOA,CACZ,IAAO,EACL8R,kBAAmBzX,IACjB,gBAD2BA,uDAE3B,CACE,uBAAwBuX,CAC1B,GAEFG,mBAAoB,CAClBC,QAAS3X,IAAWwX,EAAqB,cAAtBxX,QAA6C,CAC9D,+DAAgEuX,CAClE,GACAK,OAAQ5X,IAAWwX,EAAqB,cAAtBxX,qBAClB6X,KAAM7X,IAAWwX,EAAqB,cAAtBxX,6BAChB8X,MAAO9X,IACLwX,EACA,cAFexX,wCAInB,EACA+X,qBAAsB,6BACtBC,kBAAmB,WACrB,EACA,CAACT,EAAY,CAEjB,4BChBO,IAAMU,GAAsD,CAAC,eAAEC,CAAa,CAAE,GAC5EA,GAAejS,IACpB,CAAC,MAAErG,CAAI,MAAEuY,CAAI,aAAEC,CAAW,cAAEC,CAAY,YAAEC,CAAU,UAAEC,CAAQ,UAAEC,CAAQ,CAAE,GACxE,MAACC,CAAAA,IAAIA,UACH,MAACC,SAAAA,CACC3L,cAAY,sBACZ9O,KAAK,sBACLkV,wBAAyB,CACvBC,OAAQ/O,KAAK2F,SAAS,CAAC,CACrB,WAAY,oBACZ,QAAS,mBACTpK,OACAuY,cACAC,eACAC,aACAC,WACAC,WACAC,CACF,EACF,KAhBO5Y,ICkBV,SAAS+Y,GAAY,CAC1BC,oBAAkB,oBAClBnN,CAAkB,sBAClBR,CAAoB,aACpB9F,CAAW,eACXJ,CAAa,kBACbE,CAAgB,qBAChBlF,CAAmB,YACnByF,EAAa,UAAU,YACvBC,CAAU,WACVlG,CAAS,kBACTuO,CAAgB,aAChBhM,EAAc,WAAW,CACzBoW,eAAa,UACblU,CAAQ,CACR,GAAG+G,EACc,EACjB,IAAM9D,EAAiBrD,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAA0B,MAEjDiV,EAAgBvB,GAAsB,CAAEC,YADV,KACOD,SADvBxV,CACsC,GACpDgX,EAAcpV,EAAe,CACjC,GAAGqH,CAAU,OADmBrH,GAEhCM,aACAwB,aACAC,YACAlG,iBACA0H,cACA9B,gBACAJ,mBACAE,CACF,GAEA,MACE,iCACE,WAAC4H,MAAAA,CACCzL,UAAWpB,IAAW6Y,EAAcb,cAAfhY,GAAgC,CAAE8N,GACvDX,IAAKlG,YAEL,UAACkF,EAAKA,CAAE,EAAFA,CAAKpB,CAAU,CAAG,GAAG+N,EAAY/N,UAAU,GACjD,UAACgI,EAAaA,CACX,GAAG6F,CAAkB,CACrB,GAAGE,EAFQ/F,iBAEqB,CACjChT,oBAAqBA,EACrBqB,UAAWpB,IAAW6Y,EAAcpB,cAAfzX,GAAgC,CAAE4Y,GAAoBxX,aAE7E,UAAC4Q,EAAaA,CACX,GAAGvG,CAAkB,CACrB,GAAGqN,EAFQ9G,kBAEsB,CAClCjS,oBAAqBA,EACrBqB,UAAWpB,IACT6Y,EAAcnB,cADK1X,IACa,CAAC,OAAU,CAC3CyL,GAAoBrK,gBAI1B,UAACiS,EAAeA,CACb,GAAGyF,EAAY7N,OADFoI,aACsB,CACpCtT,oBAAqBA,EACrBqB,UAAWpB,IAAW6Y,EAAcd,cAAf/X,MAAmC,CAAEiL,GAAsB7J,aAElF,UAAC6W,GAAiBA,CAACC,aAADD,CAAgBC,MAGxC,sCC/DO,SAASa,GAA8B,YAC5CC,CAAU,CACVC,YAAU,iBACVC,EAAkBF,CAAU,CAAC,EAAE,EAAEE,iBAAmB,IAAI,CAKzD,MA4CwBC,IA3CvB,GAAM,CAACC,EAAY,GAAGC,CA2C6B,CA3CZ,GAAGC,CAAgBN,EA2CLE,EA3CiBA,EA4C/D,CACLK,KAAQJ,EAAgB,GAFyD,EAE9BD,KAA5CK,UAA2D,EAAI,KAAK,CACzEC,OAAON,GACR,EAAI,IACLO,QAAQ,CAAC,CAACC,EAAGC,IAAMC,OAAOD,EAAEE,YAAY,EAAI,GAAKD,OAAOF,EAAEG,YAAY,EAAI,KA/CtEjb,EAAakb,GAA0BV,GAEvClB,EACJc,EACGvb,MAAM,CAAC,GAAgBub,EAAWZ,WAAW,EAC7CnS,GAAG,CAAC,GACH8T,CA+DR,SAASA,CAAyD,CAAEd,CAAsB,EACxF,GAAM,WAAEe,EAAY,IAAI,UAAEC,EAAW,EAAE,CAAE,CAAGhB,EACtCiB,EAAUC,CAAAA,EAAAA,GAAAA,EAAAA,CAAGA,CAAC,eAAgB,0BACpC,MAAO,CACLva,KAAMoZ,EAAWzZ,SAAS,CAC1B4Y,KAAM,IAAIiC,IAAI,CAAC,2BAA2B,EAAEJ,EAAU,IAAI,CAAC,CAAEE,GAAS9C,QAAQ,GAC9EgB,YAAaY,EAAWZ,WAAW,CACnCC,aAAcW,EAAW5M,cAAc,CACvCkM,WAAYU,EAAWqB,cAAc,CAACjD,QAAQ,GAC9CmB,SAAUS,EAAWsB,aAAa,CAClC9B,SAAU,IAAI4B,IAAIH,EAAUC,GAAS9C,QAAQ,EAC/C,EACF,EA3EuB4B,EAA8CC,IAGnE,MAAO,CACL,GAAGra,CAAU,CACbuG,YAAakU,EAAiBpT,GAAG,CAAC6T,IAClCrd,WAAY2c,EAAWmB,aAAa,CACpCrZ,QAASkY,EAAWoB,OAAO,CAC3BC,QAASrB,EAAWqB,OAAO,EAAI,GAC/B3Y,YAAasX,EAAWtX,WAAW,CACnCsK,eAAgBgN,EAAWhN,cAAc,eACzC8L,CACF,CACF,CAEA,SAAS4B,GAA0Bd,CAAsB,QACvD,MAAO,CACLzZ,UAAWyZ,EAAWzZ,SAAS,CAC/BgG,SAAUyT,EAAWzT,QAAQ,CAC7BC,WA8BKkV,CA9BOC,EAAc3B,GA6BU4B,KADK,GACG,EAAI5B,EAAW6B,wBAAwB,CACjE,WAAa,WA7B/BpV,WAAYuT,EAAW8B,eAAe,EAAI9B,EAAW+B,qBAAqB,CAE1E,GAAI/B,EAAWZ,WAAW,EAAI,CAAEqC,QAASzB,EAAWZ,WAAW,CAAE,CACjErT,cAAeiW,GAAkBhC,EAAWiC,kBAAkB,CAAE,gBAChE3O,YAAa4O,SAqDRA,CACkC,EAEzC,GAAIC,EACF,MAAO,CACLC,IAFa,IAEJD,EAAYE,SAAS,CAC9BF,YAAaA,EAAYG,OAAO,CAChCC,kBAAmBJ,EAAYK,WAAW,CAAG,cAAWlO,CAC1D,CAGJ,EAhEgC0L,EAAWmC,WAAW,EAClDlW,iBAAkB+V,GAAkBhC,EAAWiC,kBAAkB,CAAE,kBACrE,CACF,CAEA,SAASD,GACPC,CAAyC,CACzChd,CAAiC,EAEjC,OAAOgd,EAAmBxd,MAAM,CAAC,GAAcge,EAASxd,IAAI,GAAKA,EACnE,6HGnFO,SAASyd,EAAU/X,CAAgB,EACxC,MACE,UAAC+L,OAAAA,CAAKtO,UAAU,oCACd,UAACgN,EAAAA,EAAIA,CAAAA,CAAE,GAAGzK,CAAK,CAAEvC,UAAWpB,IAAW2D,EAAMvC,SAAS,KAAhBpB,CCErC,SAAS2b,EAAc,CAAE5b,oBAAqB6b,CAAK,SAAE5Z,CAAO,CAAkB,EACnF,IAAM9B,EAAmB,SAAV0b,EACT3b,EAAoB,UAAV2b,EACVC,EAAsB,YACtBC,EAAwB,YAAZ9Z,EAClB,OAAOhC,IAAW,gBAADA,mBAAqC,CACpD,kBAAmB6b,GAAW,CAAC5b,GAAW,CAACC,EAC3C,oBAAqB4b,GAAa,CAAC7b,GAAW,CAACC,EAC/C,iBAAkBA,GAAU,CAAC2b,GAAW,CAACC,EACzC,yBAA0B5b,GAAU4b,EACpC,uBAAwB5b,GAAU2b,EAClC,kBAAmB5b,GAAW,CAAC4b,GAAW,CAACC,EAC3C,0BAA2B7b,GAAW6b,EACtC,wBAAyB7b,GAAW4b,CACtC,EACF,CCAO,IAAME,EAAYpO,CAAAA,EAAAA,EAAAA,UAAAA,CAAUA,CACjC,CACE,OACEpQ,CAAK,WACL4Q,CAAS,qBACTpO,CAAmB,SACnBiC,CAAO,SACP4O,CAAO,CACPoL,gBAAc,WACdC,EAAY,QAAQ,CACpB,GAAGC,EACJ,CACD/O,IAEA,WAACgP,EAAAA,EAAIA,CAAAA,CACF,GAAGD,CAAS,CACb/O,IAAKA,EACLiP,gBAAiBC,IACfH,EAAUE,cADOC,CACQ,CACzBV,EAAc,WAADA,UAAG5b,UAAqBiC,CAAQ,IAE/CZ,UAAWib,IAAG,QAASH,EAAU9a,MAApBib,GAA6B,EAC1Cb,YAAaU,EAAUV,WAAW,GAAI,EACtChe,IAAK0e,EAAU1e,GAAG,CAClB8e,kBAAmB,EAAWA,iBAAiB,EAAIJ,EAAUV,WAAW,GAAK,EAC7Ee,WAAW,EACXxP,cAAY,iBACZ6D,QAAS,IACPA,IAAUpD,GACVwO,KACF,YAECC,cAA0B9N,EAAY,UAACuN,EAASA,CAAE,GAAGvN,CAAS,EAAduN,CAAqB,KACrEne,EACA0e,aAAyB9N,EAAY,UAACuN,EAASA,CAAE,GAAGvN,CAAS,EAAduN,CAAqB,SAGzE,EAEQc,WAAW,CAAG,YC1CjB,IAAMlG,EAAc3I,CAAAA,EAAAA,EAAAA,UAAAA,CAAUA,CACnC,CACE,OAAEpQ,CAAK,SAAEyE,CAAO,WAAEmM,CAAS,qBAAEpO,CAAmB,WAAEkc,EAAY,QAAQ,CAAE,GAAGlO,EAAa,CACxFZ,IAEA,UAACc,SAAAA,CACChQ,KAAK,SACJ,GAAG8P,CAAW,CACfZ,IAAKA,EACL/L,UAAWib,IAAGtO,EAAY3M,SAAS,CAAEua,EAAc,EAAtCU,SAAqCV,UAAG5b,EAAqBiC,SAAQ,IAClF+K,cAAY,4BAEZ,WAAC2C,OAAAA,CAAKtO,UAAU,aAAa2L,cAAY,gCACxB,WAAdkP,GAA0B9N,EAAY,UAACuN,EAASA,CAAE,GAAGvN,CAAS,EAAduN,CAAqB,KACrEne,EACc,UAAd0e,GAAyB9N,EAAY,UAACuN,EAASA,CAAE,GAAGvN,CAAS,EAAduN,CAAqB,WAI3E,EAEUc,WAAW,CAAG,kGG1BnB,IAAMC,EAAwB,CACnCC,SAAU,oBACV3a,QAAS,gBACT4a,cAAe,mBACjB,EAAW,EAE0B,CACnCD,SAAU,gBACV3a,QAAS,eACX,EAAW,EAEkB,CAC3B2a,SAAU,4BACV3a,QAAS,0BACX,EAgEA,EAxDiC,CAAC,QAChCJ,CAAM,UACNib,CAsDaC,EAtDF,CAAK,UAChBH,EAAWD,EAAsBC,EAqDF,MArDU,SACzC3a,EAAU0a,EAAsB1a,OAAO,CACvC+a,iBAAgB,CAAK,aACrBhb,EAAc,YAAY,SAC1BE,EAAU,SAAS,qBACnBjC,CAAmB,CACD,IAClB,IAAMgd,EAAYC,SAmBXA,aACPlb,CAAW,eACXgb,CAAa,CAC4C,QACzD,YAAgC,CAA5Bhb,EACK,MAELgb,EACK,OAEF,MAHY,CAIrB,EA9BiC,eAAEA,cAAehb,CAAY,GACtD,CAAEmb,GAAIC,CAAe,CAAEC,IAAKC,CAAgB,CAAE,CAAGC,SA+BhDA,qBACPtd,CAAmB,CACnBiC,SAAO,SACPD,CAAO,UACP2a,CAAQ,CAC4E,EACpF,IAAMY,EAAcvd,EAAsB,CAAC,CAAC,EAAEA,EAAAA,CAAqB,CAAG,GAChEwd,EAA8B,YAAZvb,EAAwBwb,EAAwB,CAAEzb,UAAS2a,UAAS,EAC5F,MAAO,CACLS,IAAK,CAAC,MAAM,EAAEM,EAAqBf,QAAQ,GAAGY,EAAY,QAAQ,EAAEC,EAAgBb,QAAQ,CAAC,EAAE,CAAC,CAChGO,GAAI,CAAC,MAAM,EAAEQ,EAAqB1b,OAAO,GAAGub,EAAY,QAAQ,EAAEC,EAAgBxb,OAAO,CAAC,EAAE,CAAC,CAEjG,EA3C2E,qBACvEhC,UACAiC,WACA0a,UACA3a,CACF,GACM2b,EAAwB,CAAC,MAAM,EAAEjB,EAAsBE,aAAa,CAAC,CAAC,CAAC,CACvEM,EAAK,CAAC,IAAI,EAAEL,EAAWc,EAAwBR,EAAgB,CAAC,CAAC,CACjEC,EAAM,CAAC,IAAI,EAAEP,EAAWc,EAAwBN,EAAiB,CAAC,CAAC,CACnEO,EAAUhc,EAAOic,MAAM,CAAC,CAACC,EAAMC,KAEnC,IAAMC,GAASrgB,CAAQogB,CAAG,CAAC,EAAE,CAC7B,MAAO,GAAGD,EAAK,EAAE,EAAEE,EAASd,EAAKE,EAAI,CAAC,EAAEW,CAAG,CAAC,EAAE,CAAC,GAAG,EAAEC,EAASd,EAAKE,EAAI,CAAC,EAAEW,CAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EACjF,EAAE,EAEL,MAAO,CAAEE,WADU,CAAC,mBAAmB,EAAEjB,EAAAA,EAAYY,EAAQ,CAAC,CAAC,CAEjE,EAAE,kCC9DF,IAAMM,EAAY,CAChBtI,IAAK,EACLmC,MAAO,EACPhJ,OAAQ,EACR+I,KAAM,EACNqG,MAAO,EACPlP,OAAQ,CACV,EAOamP,EAAoB,CAACC,EAAgCH,CAAS,IACzE,GAAM,CAACI,EAASC,EAAW,CAAGna,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,GAChC,CAACoa,EAAMC,EAAQ,CAAGra,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAAUia,GAEpCjR,EAAMtF,CAAAA,EAAAA,EAAAA,WAAAA,CAAWA,CAAC,IACtByW,EAAW9Q,EACb,EAAG,EAAE,EAeL,MAbAiR,CAAAA,EAAAA,EAAAA,EAAAA,CAAyBA,CAAC,KACxB,IAAMC,EAAK,IAAIC,eAAe,IAC5BH,EAAQI,CAAO,CAAC,EAAE,CAAGA,CAAO,CAAC,EAAE,CAACC,WAAW,CAAIT,EACjD,GAIA,OAHIC,GACFK,EAAGI,IADQ,GACD,CAACT,GAEN,KACLA,GAAWK,EAAGK,SAAS,CAACV,GACxBG,EAAQP,EACV,CACF,EAAG,CAACI,EAASD,EAAY,EAElB,CAACjR,EAAKoR,EAAK,EAClB,ECH8B,CAC9BS,EACAC,EACAC,EACApC,KAEA,IAAMqC,EAAaD,GAAWjZ,IAAK1I,GAAUA,EAAMmR,qBAAqB,IAClE0Q,EAAeD,GAAYlZ,IAAI,CAACsY,EAAMc,KAC1C,IAAIC,EACF,CAACN,GAAWd,QAAQqB,CAAM,CAAMN,CAAW,CAACI,EAAE,CAAcE,GAAU,EAAIhB,GAAML,MAAQ,EAM1F,OALIoB,EAAIN,GAAWnH,KACjByH,CADuB,CACnB,EACKA,EAAIf,GAAML,MAAQc,GAAWlH,OAAO,CAC7CwH,EAAIN,GAAWlH,MAAQyG,GAAML,KAAAA,EAExBpB,EAAgB,CAACwC,EAAIA,CAC9B,GAMA,OAJIxC,GACFsC,EAAaI,OAAO,GADH,CAIVJ,0BAAcD,CAAW,CACpC,EAEMM,EAAsB,CAC1BL,EACAD,EACAH,EACAlC,KAEA,IAAM4C,EAAwB7Z,MAAqBuZ,GAAc/c,QAAQsd,IAAI,CAAC,MAE9E,IAAK,IAAIN,EAAI,EAAGA,EAAID,EAAa/c,MAAM,CAAG,EAAGgd,IAAK,CAChD,IAAMO,EACJ,CAAa,CAACP,EAAE,GAChBQ,CACCV,CAAU,CAACE,EAAE,EAAcnB,MAC3BkB,CAAY,CAACC,EAAI,EAAE,CACtB,GAAIO,EAAU,EAAG,CACf,IAAME,EAAShD,EACX,CACEjF,KAAM,CAAEmH,CAAAA,EAAUlH,KAAK,CAAIqH,CAAU,CAACE,EAAE,EAAcnB,KAAAA,CAAI,CAC1DpG,MAAO,EACP9a,MAAOgiB,GAAWnH,IACpB,EACA,CACEA,KAAM,EACNC,MAAOkH,EAAUlH,KAAK,CAAIqH,CAAU,CAACE,EAAI,EAAE,EAAcnB,MACzDlhB,MAAOgiB,EAAUlH,KAAK,EAGxB,CAAa,CAACuH,EAAE,CAAcO,EAAU,EAAIE,GAAQjI,MACtDuH,CAAY,CAACC,EAAE,CAAGS,GAAQjI,KAC1BuH,CAAY,CAACC,EAAI,EAAE,CACjB,CAAa,CAACA,EAAE,CAAeF,CAAU,CAACE,EAAE,EAAcnB,QAAQ2B,EAEpE,CAAa,CAACR,EAAI,EAAE,CAAeF,CAAU,CAACE,EAAI,EAAE,EAAcnB,MAAQ0B,EAAU,EACpFE,EAAO9iB,KAAK,EACZ,CACY,CAACqiB,EAAI,EAAE,CAAGS,EAAOhI,KAAK,CAClCsH,CAAY,CAACC,EAAE,CACb,CAAa,CAACA,EAAI,EAAE,CAAeF,CAAU,CAACE,EAAE,EAAcnB,QAAQ2B,GAEvET,CAAY,CAACC,EAAE,EAAeO,EAAU,EACxCR,CAAY,CAACC,EAAI,EAAE,EAAeO,EAAU,GAE/CF,CAAqB,CAACL,EAAE,CAAGvC,EACvB,CAAa,CAACuC,EAAE,GAAcU,CAC9B,CAAa,CAACV,EAAI,EAAE,CA7EJQ,EA6EkBE,CAE1C,CAEA,IAAK,IAAIV,EAAID,GAAc/c,KAjFmB,EAiFV,EAAGgd,EAAI,EAAGA,IAAK,CACjD,IAAMO,EACJ,CAAa,CAACP,EAAI,CAnFgD,CAmF9C,CACnBF,CAAU,CAACE,EAAI,EAAE,EAAcnB,QAChC2B,CACCT,CAAY,CAACC,EAAE,CACdO,EAAU,GAAG,CACdR,CAAY,CAACC,EAAI,EAAE,EAAeO,EACnCF,CAAqB,CAACL,EAAI,EAAE,CAAGvC,EAC3B,CAAa,CAACuC,EAAI,EAAE,GAAcQ,GAClC,CAAa,CAACR,EAAE,GAAcQ,GAEtC,CAEA,GAAI/C,EAAe,CACjB,EAN8DkD,EAMxDJ,EAAUR,CAAY,CAAC,EAAE,CACzBa,CANoDD,CAM5C,CAAChB,EAAUlH,KAAK,CAAIqH,CAAU,CAACA,GAAY9c,OAAS,EAAE,EAAc6b,MAClF,GAAI0B,EAAUK,EAAO,CACnBb,CAAY,CAAC,EAAE,CAAGa,EAClB,IAAK,IAAIZ,EAAI,EAAGA,EAAID,GAAc/c,OAAS,GACR,MAAM,CAAnCqd,CAAqB,CAACL,EAAE,CADgBA,IAAK,CAE1B,CAACA,EAAE,CACtB,CAAa,CAACA,EAAE,GAAcQ,CAzGT,EA0GvBT,CAAY,CAACC,EAAI,EAAE,CACjB,CAAa,CAACA,EAAE,CAAeF,CAAU,CAACE,EAAE,EAAcnB,CAFN8B,KA1G7B,EA4G2CH,CA5GxC,KAgH7B,CACL,IAAMD,EAAU,CAAER,CAAY,CAAC,EAAE,CACjC,GAAIQ,EAAU,EAAG,CACdR,CAAY,CAAC,EAAE,EAAeQ,EAC/B,IAAK,IAAIP,EAAI,EAAGA,EAAID,GAAc/c,OAAS,GACR,MAAM,CAAnCqd,CAAqB,CAACL,EAAE,CADgBA,IAE1CK,CAAqB,CAACL,EAAE,CAAG,CAAsB,CAACA,EAAE,CAAcO,EACjER,CAAY,CAACC,EAAI,EAAE,EAAeO,CAGzC,CACF,CAEA,OAAOF,CACT,EAkBMQ,EAAQvS,CAAAA,EAAAA,EAAAA,UAAAA,CAAUA,CACtB,CAAC,CAAEwS,iBAAe,CAAE/iB,IAAE,OAAEG,CAAK,eAAE6iB,CAAa,WAAEC,CAAS,CAAE,CAAEC,IAEvD,WAAC5Q,OAAAA,CACCtS,GAAIA,EAEJ+P,IAAKmT,EACLlf,UAAyB,YAAdif,EAjJjB,eAiJ4DE,2FA9I5D,gGA+IMtR,MAAO,CAAEuR,UAAW,CAAC,WAAW,EAAEJ,EAAc,EAAE,CAAC,YAEnD,UAAC1Q,OAAAA,CAAK+Q,cAAY,gBAAQljB,IAC1B,UAACmS,OAAAA,CAAKtO,UAAU,mBAAW+e,MANtB/iB,IAYb8iB,EAAM1D,WAAW,CAAG,QAuFpB,MAhFoB,CAAwC,aAC1D/a,CAAW,UA+Eaif,EAAC,GA9EzB5D,CAAa,QACb6D,CAAM,WACNN,EAAY,MAAM,aAClBpB,CAAW,CACY,IACvB,GAAM,CAAC2B,EAAU5B,EAAU,CAAGb,IACxB,CAAC0C,EAASC,EAAW,CAAG3c,CAAAA,EAAAA,EAAAA,EADiBga,MACjBha,CAAQA,CAAW,EAAE,EAC7C+a,EAAYtb,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAAgB,EAAE,EAAEiB,OAAO,CAC7C,CAACkc,EAAmBC,EAAc,CAAG7c,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAAY,EAAE,EAC3D,CAACub,EAAuBuB,EAAyB,CAAG9c,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAAuB,EAAE,EACrF,CAAC+c,EAAgBC,EAAa,CAAGhd,CAAAA,EAAAA,EAAAA,QAAAA,CAAQA,CAAS,GAwBxD,MAtBAsa,CAAAA,EAAAA,EAAAA,EAAAA,CAAyBA,CAAC,KACxB,GAAM,cAAEW,CAAY,YAAED,CAAU,CAAE,CAAGiC,EACnCpC,EACAC,EACAC,EACApC,GAEFkE,EAAc7B,GAIdgC,EAHkBE,SAlDbA,EAqDQC,WArDcC,CAAW,CAA6B,EACrE,OAAOA,EAAcA,GAAavS,OAAS,EAAI,CACjD,EAgD0C,CACpCuS,YAAaR,CAAiB,CAAC,EACjC,IAQAE,EAN8BxB,EAC5BL,EACAD,EACAH,EACAlC,IAGFgE,EAAW1B,EACb,EAAG,CAACJ,EAAWC,EAAanC,EAAeoE,EAAgBC,EAAa,EAGtE,WAACzR,OAAAA,CACCvC,IAAKyT,EACLxf,UAAWib,IAAG,gBAADA,0BAA4C,CACvD,SAAwB,SAAdgE,EACV,OAAsB,YAAdA,CACV,GACApR,MAAqB,YAAdoR,EAA0B,CAAE1K,IAAK,CAAC,CAAC,EAAEuL,EAAe,EAAE,CAAE,EAAI,CAAC,YAEnEP,GAAQ1a,IAAI,CAAC1I,EAAkB8hB,IAE5B,MAACa,EAAAA,CAGC9iB,GAAI,CAAC,mBAAmB,EAAEiiB,EAAAA,CAAG,CAC7B9hB,MAAOA,EACP4P,IAAK,IACCA,IACF+R,CADO,CACGG,EAAE,CAAGlS,CAAAA,CAEnB,EACAiT,cAAeS,CAAO,CAACxB,EAAE,CACzBgB,UAAWA,EACXF,gBAAiB1e,CAAW,CAAC4d,EAAE,EAV1BA,IAcVK,EACEjiB,MAAM,CAAC,GAAoC,OAAV2J,GACjCnB,GAAG,CAAC,CAACmB,EAAsBiY,IAC1B,UAAC3P,OAAAA,CACCtO,UAAU,uEACVqf,cAAY,OAGZxR,MAAO,CACLuR,UAAW,CAAC,WAAW,EAAEpZ,EAAM,GAAG,CAAC,GAFhCiY,MAQjB,iBCnQO,IAAM/d,EAAS,CAAwC,UAC5Dsb,GAAW,CAAK,WAChB/a,EAAY,CAAC,cACbL,EAAe,EAAK,aACpBC,CAAW,WACX4e,EAAY,MAAM,UAClB/iB,CAAQ,KACRgD,EAAM,CAAC,UACPkhB,CAAQ,KACRnhB,EAAM,CAAC,UACPohB,CAAQ,UACR/E,EAAWD,EAAsBC,QAAQ,UACzC9a,CADgC6a,SAEhC1a,EAAU0a,EAAsB1a,OAAO,MACvCxB,EAAO,CAAC,GADuBkc,WAE/B/a,CAAY,OACZH,CAAK,QACLI,CAAM,aACNG,EAAc,YAAY,CAC1BE,UAAU,SAAS,CACnBjC,qBAAmB,CACL,IACd,IAAM+c,EAAgB4E,CAAAA,EAAAA,EAAAA,CAAAA,CAAKA,CAACpkB,GACtBqkB,EAAY3f,cACZ4f,EAAY5f,cACZ9B,EAAiC,SAAxBH,EACTE,EAAkC,UAAxBF,EACV8hB,EAA6B,aAAhB/f,EACbggB,EAA+B,eAAhBhgB,EACfigB,EAAWne,CAAAA,EAAAA,EAAAA,MAAAA,CAAMA,CAAkB,MAEnCqb,EAActd,EAAOsE,GAAG,CAAC,IAE7B,IAAI+b,EAAa,CAAClE,EAAMzd,CAAAA,CAAE,EAAMC,EAAAA,CAAMD,CAAE,CAGxC,OAFI2hB,EAAa,EAAGA,EAAa,EACxBA,EAAa,IAAGA,GAAa,EAC/BA,CACT,GAGMC,EAAQtgB,EAAOsE,GAAG,CAAC,CAACic,EAAG7C,IAAMA,EAAI,GAEjC8C,EACU,IAAdtgB,EACK,CAACA,KAAcogB,EAAM,CACrB,IAAIA,EAAOpgB,EAAU,CAWtBugB,EAAkBvF,EAAkB,CACxClb,OAViBwgB,CAUTE,CAVmBzE,MAAM,CAAC,CAACC,EAAME,EAAQsB,KACjDxB,EAAKyE,IAAI,CAAC,CACRvE,EACM,IAANsB,EAAU,EAAqC,IAAjC,CAAY,CAACA,EAAI,EAAE,CACjCA,IAAM8C,EAAU9f,MAAM,CAAG,EAAI,IAAmC,IAA7B,CAAY,CAACgd,EAAE,CACnD,EACMxB,GACN,EAAE,WAIHjB,UACA7a,WACA2a,gBACAI,cACAhb,sBACA/B,CACF,GAEMwiB,EAAc5gB,EAAOsE,GAAG,CAACvE,IADR,GAAiB,GAAGoc,EAAAA,CAAK,GACD0E,EAChC1F,EAAgByF,EAAY/C,OAAO,GAAK+C,EACjDE,EAAiB9gB,EAAOU,MAAM,CAAG,EAAI,WAAa,MAClDqgB,EAAe/gB,EAAOU,MAAM,CAAG,EAAI,SAAW,IAEpD,MACE,WAACogB,EAAAA,CACCrhB,UAAWib,IAAG,SAAU,CACtB,MADWA,eACWO,EACtB,cAAeiF,EACf,YAAaC,CACf,aAEA,UAACY,EAAAA,CACCthB,UAAWib,IAAG,eAAgB,CAC5B,OAAsB,YAAdgE,EACR,UAAW7e,CACb,YAECD,IAEH,UAACsL,MAAAA,CACCzL,UAAWib,IAAG,CACZ,eADWA,CACoB,YAAdgE,EACjB,SAAUwB,CACZ,YAEA,WAACc,EAAAA,EAAoB,EACnBvhB,UAAWib,IAAG,gBAADA,uBAAyC,CACpD,wBAAyBwF,EACzB,2BAA4BC,CAC9B,GACAc,IAAK9F,EAAgB,MAAQ,MAC7BF,SAAUA,EACVtc,IAAKA,EACLD,IAAKA,EACLwiB,sBAAuB,EACvBjjB,KAAM2B,EACNhB,KAAMA,EACNuiB,cAAelhB,EACfwF,MAAOzF,EACPG,YAAaA,YAEb,UAAC6gB,EAAAA,EAAqB,EACpBvhB,UAAWib,IAAG,eAAgB,CAAjBA,yBACewF,EAC1B,2BAA4BC,CAC9B,GACA/U,cAAY,eACZkC,MAAO,CAAE,GAAGmT,CAAe,WAE3B,UAACO,EAAAA,EAAqB,EAACvhB,UAAU,mBAElCO,EAAOsE,GAAG,CAAC,CAAC8c,EAAQ1D,IAEjB,UAACsD,EAAAA,EAAqB,EAGpBvhB,UAAWib,IAAG,gBAADA,KAAuB,CAClC,2BAA4ByF,EAC5B,yBAA0BD,EAC1B,yBAA0BjF,EAC1B,wBAAyB+E,EACzB,wBAAyBC,EACzB,qBAAsB1hB,EACtB,sBAAuBD,CACzB,GAEAL,KAAM,CAAC,aAAa,EAAEyf,EAAAA,CAAG,CAEzBjiB,GAAI,CAAC,aAAa,EAAEiiB,EAAAA,CAAG,CACvB2D,iBAAgBrC,CAAM,CAACtB,EAAE,CACzB4D,OAAO,IACN,GAAInB,GAAgB,CAAE,kBAAmB,CAAC,mBAAmB,EAAEzC,EAAAA,CAAG,CAAE,CACpE,GAAIwC,GAAc,CAAE,aAAcpgB,CAAW,CAAC4d,EAAE,CAAE,UAEnD,UAAC3P,OAAAA,CAAKvC,IAAK4U,EAAU3gB,UAAU,0BACd,YAAdif,EAEC,UAAC3Q,OAAAA,CACCtO,UAAWib,IACT,gBADWA,WAEX,YAJqE,mOAOvE,QA5BDgD,IAiCVyC,EACC,UAACpB,EAAWA,CACVC,OAAQA,EADED,YAEGjf,EACbwd,YAAaA,EACboB,UAAWA,EACXvD,cAAeA,IAEf,UAGP2E,GAAYD,EACX,WAAC3U,MAAAA,CAAIzL,UAAU,0CACb,UAACyL,MAAAA,CAAI4T,cAAY,gBAAQgB,IACzB,UAAC5U,MAAAA,CAAI4T,cAAY,gBAAQe,OAEzB,OAGV,EAAE,kFG9JK,IAAM/T,EAAkC,CAAC,SAC9C2N,CAAO,aACPD,CAAW,mBACXI,CAAiB,OACjB2H,EAAQ,KAAK,gBACblH,CAAc,CACf,IACC,IAAMmH,EACJ,kLAEG/H,GAAYD,EAKf,MALc,EAKd,EAACiI,CAL2B,YAK3BA,CAAWrW,cAAY,6BACrBoO,EACC,UAACzB,IAAAA,CACC2J,WAAS,gBACTtW,cAAY,mBACZ3L,UAAWib,IAAG8G,EAAgB,cAAjB9G,GAAmC,CAC9C,QAAmB,QAAV6G,EACT,UAAqB,UAAVA,CACb,GACAI,KAAMnI,EACNvK,QAAS,IAAMoL,MACf1T,OAAQiT,WAEPH,IAGH,UAACvO,MAAAA,CACC0W,mBAAiB,cACjBniB,UAAWib,IAAG8G,EAAgB,cAAjB9G,uBAAuD,CAClE,QAAmB,QAAV6G,EACT,UAAqB,UAAVA,CACb,YAEC9H,MA3BA,IAgCX,EAAE","sources":["webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-autoplay.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/add-track.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-track-query.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-fade-controls.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/matchers.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/metrics.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/classes.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.volume-slider.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-control-menu.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/cue.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/event-emitter.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-video-player.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.player.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-button.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-icon.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-menu.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-list.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-item.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.settings-menu.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.controls.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.captions.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.transcripts.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-video-player-classnames.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.markup.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.mapper.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/index.ts","webpack://_N_E/../../libs/osc/video-player/src/index.ts","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/brand-icon.tsx","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/util/button.ts","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/brand-link.tsx","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/brand-button.tsx","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/index.ts","webpack://_N_E/../../libs/osc/brand-buttons/src/index.ts","webpack://_N_E/../../libs/osc/slider/src/lib/use-inline-gradient.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/use-resize-observer.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/thumb-labels.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/slider.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/index.ts","webpack://_N_E/../../libs/osc/slider/src/index.ts","webpack://_N_E/../../libs/osc/caption/src/lib/caption.tsx","webpack://_N_E/../../libs/osc/caption/src/lib/index.ts","webpack://_N_E/../../libs/osc/caption/src/index.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.css"],"sourcesContent":["import { useIsClient } from 'usehooks-ts';\nimport { getIsReducedMotion } from '@dx-ui/utilities-accessibility';\n\ntype UseAutoPlayOptions = { isAutoPlay: boolean };\n\nexport function useAutoPlay({ isAutoPlay = true }: UseAutoPlayOptions = { isAutoPlay: true }) {\n  const isClient = useIsClient();\n  const isReducedMotion = getIsReducedMotion();\n  return isClient && isAutoPlay && !isReducedMotion;\n}\n","import { logWarning } from '@dx-ui/framework-logger';\nimport type { Track } from '../video-player.controls';\n\n/**\n * Asynchronously adds a track element to a video element for closed captions.\n *\n *  - This is done imperatively vs declaratively so the cues are available when the VTT is loaded.\n *  - The track element is hidden by default so the native captions do not display.\n */\nexport async function addTrackAsync(\n  videoElement: HTMLVideoElement,\n  track: Track\n): Promise<HTMLTrackElement | null> {\n  const trackElement = document.createElement('track');\n  trackElement.id = getTrackId(track);\n  trackElement.label = track.label;\n  trackElement.srclang = track.language;\n  trackElement.kind = 'metadata';\n  trackElement.track.mode = 'hidden';\n  trackElement.dataset.type = track.type;\n  videoElement.append(trackElement);\n\n  return new Promise((resolve) => {\n    trackElement.onload = () => {\n      resolve(trackElement);\n    };\n    trackElement.onerror = () => {\n      logWarning(\n        'OSCVideoPlayer',\n        new Error('track onerror'),\n        `Failed to fetch track ${track.url}`\n      );\n      videoElement.removeChild(trackElement);\n      resolve(null);\n    };\n    trackElement.src = track.url;\n  });\n}\n\nfunction getTrackId(track: Track) {\n  return [track.language, track.label, track.url].filter(Boolean).join('-').toLowerCase();\n}\n","import { useId, useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { addTrackAsync } from '../util/add-track';\nimport { logWarning } from '@dx-ui/framework-logger';\n\nimport type { VideoPlayerProps } from './use-video-player';\nimport type { VideoTrack } from '../video-player.controls';\n\ntype UseTrackQueryOptions = VideoPlayerProps & {\n  videoElement: React.RefObject<HTMLVideoElement>;\n};\n\n/**\n * Hook that asynchronously fetches and adds tracks to the video element.\n *\n * @see addTrackAsync\n */\nexport function useTrackQuery(options: UseTrackQueryOptions) {\n  const id = useId();\n  const videoElement = options.videoElement.current;\n  const hasCaptions = Boolean(options.captionTracks?.length);\n  const hasTranscripts = Boolean(options.transcriptTracks?.length);\n  const hasAudioTracks = Boolean(options.audioTracks?.length);\n  const hasTracks = hasCaptions || hasTranscripts || hasAudioTracks;\n  const { defaultVideoTrack, baseVideoTrack } = useBaseTracks(options);\n  const allTracks = useMemo(() => getFetchableTracks(options), [options]);\n\n  const { data: videoTracks = [defaultVideoTrack] } = useQuery({\n    enabled: Boolean(hasTracks && videoElement),\n    queryKey: [`video:${id}`],\n    queryFn: async () => {\n      return Promise.all(\n        allTracks.map((track) => addTrackAsync(videoElement as HTMLVideoElement, track))\n      )\n        .then((htmlTracks) => {\n          return [baseVideoTrack, ...(options?.audioTracks || [])].map((videoTrack) => ({\n            ...videoTrack,\n            captionTracks: matchTracks({\n              htmlTracks,\n              videoTrack,\n              type: 'captionTracks',\n            }),\n            transcriptTracks: matchTracks({\n              htmlTracks,\n              videoTrack,\n              type: 'transcriptTracks',\n            }),\n          }));\n        })\n        .catch((error) => {\n          logWarning('OSCVideoPlayer', error, 'Failed to fetch video tracks');\n          return [defaultVideoTrack];\n        });\n    },\n  });\n\n  return videoTracks;\n}\n\nfunction getFetchableTracks(options: UseTrackQueryOptions) {\n  const baseTracks = [...(options?.captionTracks || []), ...(options?.transcriptTracks || [])];\n  const additionalTracks =\n    options?.audioTracks?.flatMap((videoTrack) => [\n      ...(videoTrack.captionTracks || []),\n      ...(videoTrack.transcriptTracks || []),\n    ]) || [];\n  const tracksMap = new Map(\n    [...baseTracks, ...additionalTracks].map((item) => [Object.values(item).join('-'), item])\n  );\n  return Array.from(tracksMap.values());\n}\n\nfunction matchTracks({\n  htmlTracks,\n  videoTrack,\n  type,\n}: {\n  htmlTracks: Awaited<ReturnType<typeof addTrackAsync>>[];\n  videoTrack: NonNullable<VideoPlayerProps['audioTracks']>[number];\n  type: keyof Pick<VideoTrack, 'captionTracks' | 'transcriptTracks'>;\n}) {\n  return htmlTracks.filter((htmlTrack): htmlTrack is HTMLTrackElement =>\n    (videoTrack[type] ?? []).some(\n      (track) =>\n        track.type === htmlTrack?.dataset.type &&\n        track.label === htmlTrack.label &&\n        track.url === htmlTrack.src\n    )\n  );\n}\n\nfunction useBaseTracks(options: UseTrackQueryOptions) {\n  const baseVideoTrack = {\n    videoUrl: options.videoUrl,\n    videoGroup: options.videoGroup,\n    videoLabel: options.videoLabel,\n    captionTracks: options.captionTracks,\n    transcriptTracks: options.transcriptTracks,\n  };\n  const defaultVideoTrack = {\n    ...baseVideoTrack,\n    captionTracks: [],\n    transcriptTracks: [],\n  };\n  return {\n    baseVideoTrack,\n    defaultVideoTrack,\n  };\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useBoolean, useEventListener } from 'usehooks-ts';\nimport type { VideoPlayerProps, PlayerState, useVideoPlayer } from './use-video-player';\n\ntype UseFadeControlsOptions = VideoPlayerProps &\n  PlayerState & {\n    videoElement: ReturnType<typeof useVideoPlayer>['videoProps']['videoElement'];\n  };\n\nconst FADE_TIMEOUT_IN_MS = 3000;\n\n/**\n * Hook to manage the visibility of video controls.\n */\nexport function useFadeControls(props: UseFadeControlsOptions) {\n  const { isPlaying, wrapperElement, videoElement, shouldControlsRemainVisible } = props;\n  const elementRef = (wrapperElement || videoElement) as React.RefObject<HTMLElement>;\n  const { value: isVisible, setTrue: setVisible, setFalse: setHidden } = useBoolean(true);\n  const timeout = useRef(0);\n\n  const hideControls = useCallback(() => {\n    if (!shouldControlsRemainVisible) {\n      if (isPlaying) {\n        setHidden();\n      }\n      window.clearTimeout(timeout.current);\n    }\n  }, [setHidden, isPlaying, shouldControlsRemainVisible]);\n\n  const showControls = useCallback(() => {\n    setVisible();\n    window.clearTimeout(timeout.current);\n  }, [setVisible]);\n\n  const fadeControls = useCallback(() => {\n    if (isPlaying && !shouldControlsRemainVisible) {\n      timeout.current = window.setTimeout(hideControls, FADE_TIMEOUT_IN_MS);\n    }\n  }, [hideControls, isPlaying, shouldControlsRemainVisible]);\n\n  const handleKeyup = useCallback(\n    (event: KeyboardEvent) => {\n      if (!shouldControlsRemainVisible) {\n        const isInteracting = elementRef.current?.contains(event.target as HTMLElement);\n        isInteracting ? showControls() : hideControls();\n      }\n    },\n    [elementRef, hideControls, showControls, shouldControlsRemainVisible]\n  );\n\n  useEffect(() => {\n    isVisible || shouldControlsRemainVisible ? showControls() : fadeControls();\n  }, [fadeControls, isVisible, showControls, shouldControlsRemainVisible]);\n\n  useEventListener('mousemove', showControls, elementRef);\n  useEventListener('mouseleave', hideControls, elementRef);\n  useEventListener('keyup', handleKeyup);\n\n  return { isVisible };\n}\n","import type { TrackOption, VideoTrack } from '../video-player.controls';\n\ntype FindArgs = {\n  activeTrack: TrackOption;\n  selectedVideoTrack: VideoTrack;\n};\n\n/**\n * @see findTrack\n */\nexport function findCaption({ selectedVideoTrack, activeTrack }: FindArgs) {\n  return findTrack(selectedVideoTrack?.captionTracks, activeTrack);\n}\n\n/**\n * @see findTrack\n */\nexport function findTranscript({ selectedVideoTrack, activeTrack }: FindArgs) {\n  return findTrack(selectedVideoTrack?.transcriptTracks, activeTrack);\n}\n\n/**\n * Attempts to find the related track based on the active track.\n */\nfunction findTrack(tracks: TrackOption[], activeTrack: TrackOption) {\n  return tracks.find((track) => track.srclang === activeTrack.srclang) || tracks[0] || null;\n}\n","import set from 'lodash/set';\n\nexport function getMetricsTrackName(htmlTrack: HTMLTrackElement | null) {\n  return htmlTrack ? formatName(htmlTrack.label) : 'off';\n}\n\nexport function getMetricsVideoName(videoName: string) {\n  return formatName(videoName);\n}\n\nexport type Events =\n  | 'user_play'\n  | 'autoplay'\n  | 'sound'\n  | 'cc'\n  | `sub_${string}`\n  | `audiotrack_${string}`\n  | `transcript_${string}`;\n\nexport function trackEvent(eventName: Events, videoName: string) {\n  if (window._satellite && window.digitalData) {\n    set(window.digitalData, 'click.clickID', `video_${eventName}`);\n    set(window.digitalData, 'page.attributes.videoName', videoName);\n    window._satellite.track?.('global_click');\n  }\n}\n\nfunction formatName(name: string) {\n  return name\n    .replace(/[^a-zA-Z0-9 ]/g, '')\n    .replace(/\\s/g, '_')\n    .toLowerCase();\n}\n","import classnames from 'classnames';\n\ntype Args = {\n  brandComponentTheme?: CmsBrandComponentTheme;\n};\n\nexport const getTextColorClasses = ({ brandComponentTheme }: Args) => {\n  const isLight = brandComponentTheme === 'light';\n  const isDark = brandComponentTheme === 'dark';\n  return classnames({\n    'text-primary brand-ht:text-text-inverse': isLight,\n    'text-text-inverse brand-es:!text-primary brand-gu:!text-primary brand-hi-refresh:!text-primary brand-nd:!text-primary':\n      isDark,\n  });\n};\n\nexport const getBackgroundColorClasses = ({ brandComponentTheme }: Args) => {\n  const isDark = brandComponentTheme === 'dark';\n  const isLight = brandComponentTheme === 'light';\n  return classnames({\n    'bg-bg brand-ey:bg-bg-light brand-ou:bg-secondary': !isDark && !isLight,\n    'bg-bg-dark brand-es:bg-bg brand-gu:bg-bg brand-hi-refresh:bg-bg brand-nd:bg-bg': isDark,\n    'bg-bg-light brand-es:bg-bg brand-ey:bg-bg brand-gu:bg-bg brand-hi-refresh:bg-bg brand-nd:bg-bg':\n      isLight,\n  });\n};\n\nexport const getClasses = ({ brandComponentTheme }: Args) => {\n  return classnames(\n    getTextColorClasses({ brandComponentTheme }),\n    getBackgroundColorClasses({ brandComponentTheme })\n  );\n};\n","import { useIsClient } from 'usehooks-ts';\nimport { Slider } from '@dx-ui/osc-slider';\nimport classnames from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { getClasses } from './util/classes';\nimport type { VideoControlsProps } from './video-player.controls';\nimport type { PlayerState, useVideoPlayer } from './hooks/use-video-player';\n\ntype VolumeSliderProps = Pick<VideoControlsProps, 'brandComponentTheme'> &\n  Pick<ReturnType<typeof useVideoPlayer>['videoControlsProps'], 'updateVolume' | 'playerState'>;\n\nconst volumeConfig = {\n  min: 0,\n  max: 100,\n  step: 5,\n};\n\nexport const lowestVolume: PlayerState['volume'] = [volumeConfig.step];\n\nexport const initialVolume: PlayerState['volume'] = [\n  Math.max(volumeConfig.step, Math.floor(volumeConfig.max / 2)),\n];\n\nexport function VolumeSlider({\n  brandComponentTheme,\n  playerState,\n  updateVolume,\n}: VolumeSliderProps) {\n  const isClient = useIsClient();\n  const { t, i18n } = useTranslation('osc-video-player');\n  const isDark = brandComponentTheme === 'dark';\n  const volume = playerState.isMuted ? 0 : playerState.volume[0];\n\n  if (!isClient) {\n    return null;\n  }\n\n  return (\n    <form\n      className={classnames(\n        'sr-only !absolute bottom-12 shadow group-has-[:focus]:not-sr-only',\n        'group-has-[:focus]:!h-32 group-has-[:focus]:!w-full group-has-[:focus]:lg:!h-40',\n        'group-hover:not-sr-only group-hover:!h-32 group-hover:!w-full group-hover:lg:!h-40',\n        getClasses({ brandComponentTheme })\n      )}\n    >\n      <Slider\n        title={t('volume.label')}\n        hiddenLegend={true}\n        inputLabels={[t('volume.button')]}\n        thumbLabelFn={() => t('volume.ariaLabel', { volume })}\n        values={[volume]}\n        onChange={updateVolume}\n        language={i18n.language}\n        min={volumeConfig.min}\n        max={volumeConfig.max}\n        step={volumeConfig.step}\n        fillIndex={1}\n        orientation=\"vertical\"\n        onColor={isDark ? 'color-bg' : 'color-primary'}\n        variant=\"primary\"\n        brandComponentTheme={brandComponentTheme}\n      />\n    </form>\n  );\n}\n","import { useEventListener, useOnClickOutside, useToggle } from 'usehooks-ts';\nimport { useId, useRef } from 'react';\nimport { getKeyDownNavigation } from '@dx-ui/utilities-accessibility';\n\n/**\n * Hook to manage the state of a popup menu.\n */\nexport function useMenu() {\n  const menuId = useId();\n  const popupButtonRef = useRef<React.ElementRef<'button'>>(null);\n  const popupMenuRef = useRef<React.ElementRef<'div'>>(null);\n  const [isOpen, toggleMenu, setIsOpen] = useToggle();\n  const closeMenu = () => setIsOpen(false);\n\n  return {\n    menuId,\n    isOpen,\n    toggleMenu,\n    closeMenu,\n    popupButtonRef,\n    popupMenuRef,\n  };\n}\n\ntype UseEventListenersOptions = Pick<\n  ReturnType<typeof useMenu>,\n  'popupButtonRef' | 'popupMenuRef'\n> & {\n  resetMenu: VoidFunction;\n};\n\n/**\n * Hook to manage event listeners for a popup menu.\n */\nexport function useEventListeners(options: UseEventListenersOptions) {\n  const { popupButtonRef, popupMenuRef, resetMenu } = options;\n  const focusButton = () => popupButtonRef.current?.focus();\n\n  useOnClickOutside(popupMenuRef, (event) => {\n    if (!popupButtonRef.current?.contains(event.target as HTMLElement)) {\n      resetMenu();\n    }\n  });\n\n  useEventListener(\n    'keydown',\n    (event) => {\n      event.stopPropagation();\n      switch (event.key) {\n        case 'Tab':\n          window.requestAnimationFrame(() => {\n            if (!popupMenuRef.current?.contains(document.activeElement)) {\n              resetMenu();\n              focusButton();\n            }\n          });\n          break;\n        case 'Escape':\n          resetMenu();\n          focusButton();\n          break;\n        case 'ArrowUp':\n        case 'ArrowDown':\n          {\n            const activeList = popupMenuRef.current?.querySelector('ul');\n            const elements = Array.from(activeList?.querySelectorAll('button') || []);\n            const onKeyDownNavigation = getKeyDownNavigation({ elements });\n            onKeyDownNavigation(event);\n          }\n          break;\n        default:\n          break;\n      }\n    },\n    popupMenuRef\n  );\n}\n","/**\n * Ensures the cue has text content.\n */\nexport function isValidCue(cue: VTTCue) {\n  return cue.text.trim().length > 0;\n}\n\n/**\n * Generates a unique cue id.\n */\nexport function getCueId(cue: VTTCue) {\n  return ['cue', cue.id, crypto.randomUUID()].filter(Boolean).join('-');\n}\n\n/**\n * Parses the VTTCue text and returns the text content.\n */\nexport function getCueText(cue: VTTCue) {\n  try {\n    const fragment = cue.getCueAsHTML();\n    const text = fragment.textContent || '';\n    const html = new XMLSerializer().serializeToString(fragment);\n    return { text, html };\n  } catch {\n    return { text: cue.text, html: cue.text };\n  }\n}\n\n/**\n * The smallest buffer to add to the cue startTime when adjusting the\n * video currentTime due to precision mismatch related to activeCues.\n * https://stackoverflow.com/questions/55777551/how-do-i-avoid-floating-point-rounding-errors-in-webvtt\n */\nexport const CUE_BUFFER = 0.00001;\n","import type { useId } from 'react';\n\nexport type EventType = ValuesOf<typeof VIDEO_EVENTS>;\n\nexport type VideoEventDetail = {\n  type: EventType;\n  id: ReturnType<typeof useId>;\n};\n\nexport const VIDEO_EVENTS = {\n  PAUSE_OTHERS: 'pause-others',\n  PAUSE_SELF: 'pause-self',\n} as const;\n\nexport const VIDEO_UPDATE_EVENT = 'video-player-update';\n\nexport const dispatchVideoEvent = (detail: VideoEventDetail) => {\n  window.dispatchEvent(new CustomEvent<VideoEventDetail>(VIDEO_UPDATE_EVENT, { detail }));\n};\n","import { useRef, useState, useEffect, useCallback, useId } from 'react';\nimport { useEventListener } from 'usehooks-ts';\nimport { useAutoPlay } from './use-autoplay';\nimport { useTrackQuery } from '../hooks/use-track-query';\nimport { useFadeControls } from './use-fade-controls';\nimport { findCaption, findTranscript } from '../util/matchers';\nimport { getMetricsTrackName, getMetricsVideoName, trackEvent } from '../util/metrics';\n\nimport type { VideoTrack, TrackOption, BaseVideoTrack } from '../video-player.controls';\nimport { initialVolume, lowestVolume } from '../video-player.volume-slider';\nimport { useMenu } from './use-control-menu';\nimport { CUE_BUFFER } from '../util/cue';\nimport type { VideoEventDetail } from '../util/event-emitter';\nimport { dispatchVideoEvent, VIDEO_EVENTS, VIDEO_UPDATE_EVENT } from '../util/event-emitter';\nimport type { VideoProps } from '../video-player.player';\n\nexport type VideoPlayerProps = BaseVideoTrack &\n  Pick<VideoProps, 'isAutoPlay' | 'captionData'> &\n  Partial<{\n    hasAudio: boolean;\n    playerId: ReturnType<typeof useId>;\n    audioTracks: BaseVideoTrack[];\n    wrapperElement: React.RefObject<HTMLDivElement>;\n    shouldControlsRemainVisible?: boolean;\n  }>;\n\nexport type PlayerState = {\n  isMuted: boolean;\n  isPlaying: boolean;\n  showCaptions: boolean;\n  activeCaptionTrack: TrackOption | null;\n  activeTranscript: TrackOption | null;\n  activeVideoTrack: VideoTrack | null;\n  volume: Tuple<1, number>;\n};\n\nconst defaultPlayerState: PlayerState = {\n  isMuted: true,\n  isPlaying: true,\n  showCaptions: false,\n  activeCaptionTrack: null,\n  activeTranscript: null,\n  activeVideoTrack: null,\n  volume: initialVolume,\n};\n\n/**\n * Hook to manage the state and behavior of the video player.\n */\nexport function useVideoPlayer(props: VideoPlayerProps) {\n  const videoElement = useRef<HTMLVideoElement>(null);\n  const internalPlayerId = useId();\n  const playerId = props.playerId ?? internalPlayerId;\n  const hasAudio = props.hasAudio ?? true;\n  const hookProps = { ...props, videoElement };\n  const [playerState, setPlayerState] = useState<PlayerState>(() => {\n    try {\n      const videoPlayerSettings: Partial<PlayerState> = JSON.parse(\n        localStorage.getItem('videoPlayerSettings') || '{}'\n      );\n      return { ...defaultPlayerState, ...videoPlayerSettings };\n    } catch {\n      return defaultPlayerState;\n    }\n  });\n  const optionsState = useTrackQuery(hookProps);\n  const controlsState = useFadeControls({ ...hookProps, ...playerState });\n  const settingsMenu = useMenu();\n  const activeVideo = playerState.activeVideoTrack || optionsState[0];\n  const videoName = getMetricsVideoName(props.videoName ?? '');\n\n  const playVideo = useCallback(() => {\n    void videoElement.current?.play()?.catch(() => null);\n  }, []);\n\n  const pauseVideo = useCallback(() => videoElement.current?.pause(), []);\n\n  const muteVideo = useCallback(() => {\n    if (videoElement.current) {\n      videoElement.current.muted = true;\n      videoElement.current.volume = 0;\n    }\n  }, []);\n\n  const unmuteVideo = useCallback(([volume]: PlayerState['volume']) => {\n    if (videoElement.current) {\n      videoElement.current.muted = false;\n      videoElement.current.volume = volume / 100;\n    }\n  }, []);\n\n  function togglePlayButton() {\n    setPlayerState((playerState) => {\n      const isPlaying = !playerState.isPlaying;\n      if (isPlaying) {\n        playVideo();\n        if (hasAudio) {\n          dispatchVideoEvent({ type: VIDEO_EVENTS.PAUSE_OTHERS, id: playerId });\n        }\n        trackEvent('user_play', videoName);\n      } else {\n        pauseVideo();\n      }\n      return { ...playerState, isPlaying };\n    });\n  }\n\n  function persistSettings(state: Partial<PlayerState>) {\n    localStorage.setItem('videoPlayerSettings', JSON.stringify(state));\n  }\n\n  function performAudioActions({ isMuted, isPlaying, volume }: PlayerState) {\n    if (isMuted) {\n      muteVideo();\n    } else {\n      unmuteVideo(volume);\n      if (isPlaying) {\n        dispatchVideoEvent({ type: VIDEO_EVENTS.PAUSE_OTHERS, id: playerId });\n      }\n    }\n    persistSettings({ volume });\n  }\n\n  function updateVolume(volume: PlayerState['volume']) {\n    setPlayerState((playerState) => {\n      const isMuted = volume[0] <= 0;\n      const state = { ...playerState, isMuted, volume };\n      performAudioActions(state);\n      return state;\n    });\n  }\n\n  function toggleMuteButton() {\n    setPlayerState((playerState) => {\n      const isMuted = !playerState.isMuted;\n      const volume = playerState.volume[0] <= 0 ? lowestVolume : playerState.volume;\n      const state = { ...playerState, isMuted, volume };\n      trackEvent('sound', videoName);\n      performAudioActions(state);\n      return state;\n    });\n  }\n\n  function toggleCaptions() {\n    setPlayerState((playerState) => {\n      trackEvent('cc', videoName);\n      const showCaptions = !playerState.showCaptions;\n      return { ...playerState, showCaptions };\n    });\n  }\n\n  function updateCaption(selectedCaption: PlayerState['activeCaptionTrack']) {\n    setPlayerState((playerState) => {\n      const isSingleCaption = (activeVideo?.captionTracks?.length ?? 1) === 1;\n      const trackName = getMetricsTrackName(selectedCaption);\n      const eventName = isSingleCaption ? 'cc' : (`sub_${trackName}` as const);\n      trackEvent(eventName, videoName);\n      return {\n        ...playerState,\n        showCaptions: Boolean(selectedCaption),\n        activeCaptionTrack: selectedCaption || playerState.activeCaptionTrack,\n      };\n    });\n  }\n\n  function updateTranscript(selectedTranscript: PlayerState['activeTranscript']) {\n    setPlayerState((playerState) => {\n      const trackName = getMetricsTrackName(selectedTranscript);\n      const eventName = `transcript_${trackName}` as const;\n      trackEvent(eventName, videoName);\n      return { ...playerState, activeTranscript: selectedTranscript };\n    });\n  }\n\n  function updateAudioTrack(selectedVideoTrack: NonNullable<PlayerState['activeVideoTrack']>) {\n    setPlayerState((playerState) => {\n      if (playerState.activeVideoTrack?.videoUrl === selectedVideoTrack.videoUrl) {\n        return playerState;\n      }\n\n      const activeCaptionTrack = playerState.activeCaptionTrack\n        ? findCaption({ selectedVideoTrack, activeTrack: playerState.activeCaptionTrack })\n        : null;\n\n      const activeTranscript = playerState.activeTranscript\n        ? findTranscript({ selectedVideoTrack, activeTrack: playerState.activeTranscript })\n        : null;\n\n      if (videoElement.current) {\n        const isGroupMatch = activeVideo?.videoGroup === selectedVideoTrack.videoGroup;\n        const currentTime = isGroupMatch ? videoElement.current.currentTime : 0;\n        videoElement.current.src = selectedVideoTrack.videoUrl;\n        videoElement.current.currentTime = currentTime;\n      }\n\n      const videoLabel = getMetricsVideoName(selectedVideoTrack.videoLabel || '');\n      const eventName = `audiotrack_${videoLabel}` as const;\n      trackEvent(eventName, videoName);\n      playerState.isPlaying ? playVideo() : pauseVideo();\n\n      return {\n        ...playerState,\n        activeTranscript,\n        activeCaptionTrack,\n        activeVideoTrack: selectedVideoTrack,\n      };\n    });\n  }\n\n  function closeTranscript() {\n    updateTranscript(null);\n    settingsMenu.popupButtonRef.current?.focus();\n  }\n\n  function onCueSelect(cue: VTTCue) {\n    if (videoElement.current) {\n      const adjustedTime = cue.startTime + CUE_BUFFER;\n      videoElement.current.currentTime = adjustedTime;\n    }\n  }\n\n  const isAutoPlay = useAutoPlay({\n    isAutoPlay: props.isAutoPlay ?? defaultPlayerState.isPlaying,\n  });\n\n  useEffect(() => {\n    setPlayerState((playerState) => {\n      if (isAutoPlay) {\n        muteVideo();\n        playVideo();\n      } else {\n        unmuteVideo(playerState.volume);\n        pauseVideo();\n      }\n      return {\n        ...playerState,\n        isMuted: isAutoPlay,\n        isPlaying: isAutoPlay,\n      };\n    });\n  }, [isAutoPlay, muteVideo, pauseVideo, playVideo, unmuteVideo]);\n\n  useEffect(() => {\n    if (playerState.showCaptions) {\n      const inActiveCaptionTracks = (activeVideo?.captionTracks ?? []).filter(\n        (option): option is HTMLTrackElement => option.src !== playerState.activeCaptionTrack?.src\n      );\n\n      if (inActiveCaptionTracks.length) {\n        inActiveCaptionTracks.forEach((track) => {\n          track.track.oncuechange = null;\n        });\n      }\n\n      if (playerState.activeCaptionTrack) {\n        playerState.activeCaptionTrack.track.oncuechange = () => {\n          setPlayerState((playerState) => ({\n            ...playerState,\n            activeCaptionTrack: playerState.activeCaptionTrack,\n          }));\n        };\n      }\n    } else {\n      if (playerState.activeCaptionTrack) {\n        playerState.activeCaptionTrack.track.oncuechange = null;\n      }\n    }\n  }, [activeVideo?.captionTracks, playerState.activeCaptionTrack, playerState.showCaptions]);\n\n  useEventListener('metrics-ready', () => {\n    if (isAutoPlay && videoName) {\n      trackEvent('autoplay', videoName);\n    }\n  });\n\n  useEventListener(VIDEO_UPDATE_EVENT, (event: CustomEvent<VideoEventDetail>) => {\n    const isPauseOthersEvent = event.detail.type === VIDEO_EVENTS.PAUSE_OTHERS;\n    const isPauseSelfEvent = event.detail.type === VIDEO_EVENTS.PAUSE_SELF;\n    const isPauseEvent = isPauseOthersEvent || isPauseSelfEvent;\n\n    if (hasAudio && playerState.isPlaying && isPauseEvent) {\n      const isOtherVideo = event.detail.id !== playerId;\n      const isSameVideo = event.detail.id === playerId;\n      const shouldPauseAll = isPauseOthersEvent && isOtherVideo;\n      const shouldPauseSelf = isPauseSelfEvent && isSameVideo;\n      if (shouldPauseAll || shouldPauseSelf) {\n        togglePlayButton();\n      }\n    }\n  });\n\n  return {\n    videoProps: {\n      videoElement,\n    },\n    videoCaptionProps: {\n      showCaptions: playerState.showCaptions,\n      activeCaptionTrack: playerState.activeCaptionTrack,\n    },\n    videoTranscriptProps: {\n      activeTranscript: playerState.activeTranscript,\n      closeTranscript,\n      onCueSelect,\n    },\n    videoControlsProps: {\n      controlsState,\n      activeVideo,\n      playerState,\n      optionsState,\n      togglePlayButton,\n      toggleMuteButton,\n      toggleCaptions,\n      settingsMenu,\n      updateCaption,\n      updateTranscript,\n      updateAudioTrack,\n      updateVolume,\n      videoElement,\n      hasAudio,\n    },\n  };\n}\n","import classnames from 'classnames';\nimport { Caption } from '@dx-ui/osc-caption';\nimport type { CaptionProps } from '@dx-ui/osc-caption';\nimport { logWarning } from '@dx-ui/framework-logger';\nimport { useAutoPlay } from './hooks/use-autoplay';\n\ntype VideoElement = React.ComponentProps<'video'>;\n\nexport type VideoProps = Omit<VideoElement, 'src' | 'autoPlay' | 'id' | 'poster'> & {\n  /**\n   * The location (URL) of the video file\n   */\n  videoUrl: NonNullable<VideoElement['src']>;\n  /**\n   * Ref that gets added to the video element.\n   */\n  videoElement: React.RefObject<HTMLVideoElement>;\n  /**\n   * The poster for the video\n   */\n  posterImageUrl?: VideoElement['poster'];\n  videoId?: VideoElement['id'];\n  /**\n   * When present, the video will automatically start playing.\n   */\n  isAutoPlay?: VideoElement['autoPlay'];\n  /**\n   * Caption link and text\n   */\n  captionData?: CaptionProps;\n  /**\n   * Classname for the Video tag\n   */\n  videoClassName?: React.ComponentProps<'div'>['className'];\n  /**\n   * Classname for the Figure tag\n   */\n  figureClassName?: React.ComponentProps<'div'>['className'];\n};\n\n/**\n * Provides the ability to play videos on a continuous loop with optional caption.\n */\nexport function Video({\n  videoUrl,\n  posterImageUrl,\n  videoElement,\n  videoId,\n  captionData,\n  isAutoPlay = true,\n  muted = isAutoPlay,\n  figureClassName,\n  videoClassName,\n  ...rest\n}: VideoProps) {\n  const preventPreload = posterImageUrl && !isAutoPlay;\n  const autoPlay = useAutoPlay({ isAutoPlay });\n\n  return (\n    <figure className={figureClassName}>\n      {videoUrl ? (\n        <div className={classnames('relative w-full overflow-hidden', rest.className)}>\n          <video\n            id={videoId}\n            data-testid=\"video-player\"\n            loop\n            playsInline\n            {...rest}\n            className={classnames('w-full bg-bg-alt object-cover', videoClassName)}\n            src={videoUrl}\n            poster={posterImageUrl}\n            autoPlay={autoPlay}\n            muted={muted}\n            ref={videoElement}\n            crossOrigin=\"anonymous\"\n            preload={preventPreload ? 'none' : undefined}\n            onError={(e) => {\n              logWarning(\n                'OSCVideoPlayer',\n                new Error('video onError'),\n                `Failed to load ${videoUrl}`\n              );\n              rest.onError?.(e);\n            }}\n          />\n        </div>\n      ) : null}\n\n      {captionData ? <Caption {...captionData} /> : null}\n    </figure>\n  );\n}\n","import classnames from 'classnames';\nimport { forwardRef } from 'react';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getClasses } from './util/classes';\n\ntype ControlButtonProps = Omit<React.ComponentProps<'button'>, 'type'> &\n  Pick<VideoControlsProps, 'brandComponentTheme'> & {\n    iconContent: React.ReactNode;\n    wrapperClassName?: React.ComponentProps<'li'>['className'];\n  };\n\nconst ControlButton = forwardRef<HTMLButtonElement, ControlButtonProps>(function ControlButton(\n  props,\n  ref\n) {\n  const { brandComponentTheme, children, iconContent, wrapperClassName, ...buttonProps } = props;\n  return (\n    <li className={wrapperClassName}>\n      <button\n        {...buttonProps}\n        ref={ref}\n        type=\"button\"\n        className={classnames(\n          'relative z-1 inline-flex size-12 items-center justify-center bg-bg focus:z-2',\n          getClasses({ brandComponentTheme }),\n          buttonProps.className\n        )}\n      >\n        {iconContent}\n      </button>\n      {children}\n    </li>\n  );\n});\n\nexport { ControlButton };\n","import { Icon } from '@dx-ui/osc-icon';\nimport classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\n\nexport function ControlIcon({\n  brandComponentTheme,\n  ...iconProps\n}: React.ComponentProps<typeof Icon> & Pick<VideoControlsProps, 'brandComponentTheme'>) {\n  const isDark = brandComponentTheme === 'dark';\n  const isLight = brandComponentTheme === 'light';\n  return (\n    <Icon\n      {...iconProps}\n      className={classnames(\n        'fill-primary',\n        {\n          'fill-text-inverse brand-es:fill-primary brand-gu:fill-primary brand-hi-refresh:fill-primary brand-nd:fill-primary':\n            isDark,\n          'brand-ht:fill-text-inverse': isLight,\n        },\n        iconProps.className\n      )}\n    />\n  );\n}\n","import { useEffect, useState } from 'react';\nimport classnames from 'classnames';\nimport type { useMenu } from './hooks/use-control-menu';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getClasses } from './util/classes';\n\nexport function ControlMenu(\n  props: ReturnType<typeof useMenu> &\n    Pick<VideoControlsProps, 'brandComponentTheme'> &\n    Pick<React.ComponentProps<'div'>, 'children' | 'className'> & {\n      wrapperRef: React.RefObject<HTMLElement>;\n    }\n) {\n  const { brandComponentTheme, menuId, popupMenuRef, isOpen, children, className } = props;\n  const isDark = brandComponentTheme === 'dark';\n  const maxHeight = useSafeMaxHeight(props);\n\n  return (\n    <div\n      id={menuId}\n      ref={popupMenuRef}\n      style={maxHeight ? { maxHeight: `${maxHeight}px` } : {}}\n      className={classnames(\n        'absolute bottom-full start-0 w-full border-y border-border shadow-md md:min-w-60',\n        getClasses({ brandComponentTheme }),\n        {\n          'overflow-y-auto overscroll-contain': Boolean(maxHeight),\n          'border-bg-dark': isDark,\n          'motion-safe:animate-fadein': isOpen,\n          'motion-safe:animate-fadeout': !isOpen,\n          hidden: !isOpen,\n        },\n        className\n      )}\n    >\n      {children}\n    </div>\n  );\n}\n\nfunction useSafeMaxHeight(props: React.ComponentProps<typeof ControlMenu>) {\n  const [maxHeight, setMaxHeight] = useState<number | null>(null);\n  const { isOpen, wrapperRef, popupMenuRef, popupButtonRef } = props;\n\n  useEffect(() => {\n    const wrapperRect = wrapperRef.current?.getBoundingClientRect();\n    const menuRect = popupMenuRef.current?.getBoundingClientRect();\n    const buttonRect = popupButtonRef.current?.getBoundingClientRect();\n\n    setMaxHeight(() => {\n      if (isOpen && menuRect && wrapperRect && buttonRect) {\n        const offset = wrapperRect.bottom - menuRect.bottom;\n        const buttonOffset = buttonRect.height / 2;\n        return wrapperRect.height - offset - buttonOffset;\n      }\n      return null;\n    });\n  }, [isOpen, popupButtonRef, popupMenuRef, wrapperRef]);\n\n  return maxHeight;\n}\n","import classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getClasses } from './util/classes';\n\nexport function ControlList(\n  props: Omit<React.ComponentProps<'ul'>, 'role'> & Pick<VideoControlsProps, 'brandComponentTheme'>\n) {\n  const { children, brandComponentTheme, ...listProps } = props;\n\n  return (\n    <ul\n      {...listProps}\n      role=\"menu\"\n      className={classnames(\n        'flex w-full flex-col divide-y divide-border motion-safe:animate-fadein',\n        getClasses({ brandComponentTheme }),\n        listProps.className\n      )}\n    >\n      {children}\n    </ul>\n  );\n}\n","import classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getTextColorClasses } from './util/classes';\n\nexport function ControlItem({\n  brandComponentTheme,\n  beforeSection,\n  afterSection,\n  children,\n  wrapperClassName,\n  ...buttonProps\n}: {\n  beforeSection?: React.ReactNode;\n  afterSection?: React.ReactNode;\n} & Omit<React.ComponentProps<'button'>, 'type'> &\n  Pick<VideoControlsProps, 'brandComponentTheme'> & {\n    wrapperClassName?: React.ComponentProps<'li'>['className'];\n  }) {\n  return (\n    <li className={classnames('p-1.5', wrapperClassName)}>\n      <button\n        {...buttonProps}\n        type=\"button\"\n        className={classnames(\n          'relative flex w-full items-center gap-1 p-1 text-start focus:z-2',\n          buttonProps.className\n        )}\n      >\n        {beforeSection}\n        <span\n          className={classnames(\n            'text-primary underline',\n            getTextColorClasses({ brandComponentTheme })\n          )}\n        >\n          {children}\n        </span>\n        {afterSection}\n      </button>\n    </li>\n  );\n}\n","import classnames from 'classnames';\nimport { useState } from 'react';\nimport { useTranslation } from 'next-i18next';\nimport type { useMenu } from './hooks/use-control-menu';\nimport { useEventListeners } from './hooks/use-control-menu';\nimport { ControlIcon } from './video-player.control-icon';\nimport { ControlButton } from './video-player.control-button';\nimport { ControlMenu } from './video-player.control-menu';\nimport { ControlList } from './video-player.control-list';\nimport { ControlItem } from './video-player.control-item';\nimport { getClasses } from './util/classes';\nimport type { Track, TrackOption, VideoControlsProps } from './video-player.controls';\nimport type { useVideoPlayer } from './hooks/use-video-player';\n\ntype SettingsMenuProps = Pick<VideoControlsProps, 'brandComponentTheme'> &\n  Pick<\n    ReturnType<typeof useVideoPlayer>['videoControlsProps'],\n    | 'activeVideo'\n    | 'updateAudioTrack'\n    | 'updateCaption'\n    | 'updateTranscript'\n    | 'optionsState'\n    | 'playerState'\n    | 'videoElement'\n  > & {\n    menuProps: ReturnType<typeof useMenu>;\n  };\n\nexport function SettingsMenu(props: SettingsMenuProps) {\n  const { brandComponentTheme } = props;\n  const { t } = useTranslation('osc-video-player');\n  const menuOptions = useMenuOptions(props);\n  const { isOpen, toggleMenu, menuId, popupButtonRef, popupMenuRef } = menuOptions;\n\n  return (\n    <ControlButton\n      aria-label={t('settings')}\n      aria-controls={menuId}\n      aria-haspopup\n      aria-expanded={isOpen}\n      ref={popupButtonRef}\n      onClick={toggleMenu}\n      brandComponentTheme={brandComponentTheme}\n      iconContent={\n        <>\n          <ControlIcon\n            name=\"settings\"\n            brandComponentTheme={brandComponentTheme}\n            className={classnames({ hidden: isOpen })}\n          />\n          <ControlIcon\n            name=\"settings\"\n            variant=\"solid\"\n            brandComponentTheme={brandComponentTheme}\n            className={classnames({ hidden: !isOpen })}\n          />\n        </>\n      }\n    >\n      <ControlMenu {...menuOptions} wrapperRef={props.videoElement}>\n        {isOpen ? (\n          <Menu\n            {...props}\n            {...menuOptions}\n            popupButtonRef={popupButtonRef}\n            popupMenuRef={popupMenuRef}\n          />\n        ) : null}\n      </ControlMenu>\n    </ControlButton>\n  );\n}\n\ntype MenuProps = ReturnType<typeof useMenuOptions>;\ntype ControlMenuProps = SettingsMenuProps & MenuProps;\n\nfunction Menu({\n  menuOptions,\n  brandComponentTheme,\n  closeMenu,\n  popupButtonRef,\n  popupMenuRef,\n  goToMainMenu,\n}: ControlMenuProps) {\n  function resetMenu() {\n    closeMenu();\n    goToMainMenu();\n  }\n\n  useEventListeners({\n    popupMenuRef,\n    popupButtonRef,\n    resetMenu,\n  });\n\n  const selectedOption = menuOptions.find((option) => option.isSelected);\n  const isDark = brandComponentTheme === 'dark';\n  const isLight = brandComponentTheme === 'light';\n\n  if (selectedOption) {\n    return (\n      <ControlList key={selectedOption.type} brandComponentTheme={brandComponentTheme}>\n        {selectedOption.options.map((subOption) => (\n          <ControlItem\n            key={subOption.label}\n            brandComponentTheme={brandComponentTheme}\n            onClick={() => {\n              selectedOption.onSelection(subOption.track);\n              resetMenu();\n              popupButtonRef.current?.focus();\n            }}\n            role=\"menuitemradio\"\n            aria-checked={subOption.isSelected}\n            autoFocus={subOption.isSelected}\n            beforeSection={\n              <ControlIcon\n                size=\"sm\"\n                name=\"check\"\n                brandComponentTheme={brandComponentTheme}\n                className={classnames({ '!fill-transparent': !subOption.isSelected })}\n              />\n            }\n          >\n            {subOption.label}\n          </ControlItem>\n        ))}\n        <ControlItem\n          key={selectedOption.type}\n          brandComponentTheme={brandComponentTheme}\n          wrapperClassName={classnames(\n            { 'bg-bg-alt': !isLight && !isDark },\n            getClasses({ brandComponentTheme })\n          )}\n          onClick={goToMainMenu}\n          beforeSection={\n            <ControlIcon\n              size=\"sm\"\n              name=\"arrowhead-left\"\n              brandComponentTheme={brandComponentTheme}\n              className=\"rtl:rotate-180\"\n            />\n          }\n          autoFocus={!selectedOption.options.some((subOption) => subOption.isSelected)}\n          aria-expanded={true}\n        >\n          {selectedOption.label}\n        </ControlItem>\n      </ControlList>\n    );\n  }\n\n  return (\n    <ControlList brandComponentTheme={brandComponentTheme}>\n      {menuOptions.map((option, index) => (\n        <ControlItem\n          key={option.type}\n          brandComponentTheme={brandComponentTheme}\n          onClick={option.onMenuOptionClick}\n          className=\"justify-between\"\n          autoFocus={index === 0}\n          aria-expanded={false}\n          afterSection={\n            <ControlIcon\n              size=\"sm\"\n              name=\"arrowhead-left\"\n              brandComponentTheme={brandComponentTheme}\n              className=\"rotate-180 rtl:rotate-0\"\n            />\n          }\n        >\n          {option.label}\n        </ControlItem>\n      ))}\n    </ControlList>\n  );\n}\n\ntype Option = {\n  isSelected: boolean;\n  label: TrackOption['label'];\n  track: TrackOption | null;\n};\n\ntype SelectOption = Pick<Option, 'isSelected'> & {\n  label: React.ReactNode;\n  type: Track['type'];\n  options: Option[];\n  onSelection: (option: TrackOption | null) => void;\n  onMenuOptionClick: () => void;\n};\n\nfunction useMenuOptions(options: SettingsMenuProps) {\n  const { t } = useTranslation('osc-video-player');\n  const [selectedOption, setSelectedOption] = useState<Track['type'] | 'mainMenu'>('mainMenu');\n  const captionOptions = options.activeVideo?.captionTracks || [];\n  const hasCaptions = captionOptions.length > 1;\n  const hasAudioTracks = options.optionsState.length > 1;\n  const transcriptOptions = options.activeVideo?.transcriptTracks || [];\n  const hasTranscripts = transcriptOptions.length > 0;\n  const goToMainMenu = () => setSelectedOption('mainMenu');\n\n  const menuOptions = [\n    hasCaptions && {\n      type: 'captionTrack',\n      label: (\n        <>\n          {t('subtitles')}/<abbr title={t('captions')}>{t('cc')}</abbr>\n        </>\n      ),\n      isSelected: selectedOption === 'captionTrack',\n      onSelection: options.updateCaption,\n      onMenuOptionClick: () => setSelectedOption('captionTrack'),\n      options: [\n        {\n          isSelected: !options.playerState.showCaptions,\n          label: t('off'),\n          track: null,\n        },\n        ...captionOptions.map((track) => ({\n          isSelected:\n            options.playerState.showCaptions &&\n            options.playerState.activeCaptionTrack?.src === track.src,\n          label: track.label,\n          track,\n        })),\n      ],\n    },\n    hasAudioTracks && {\n      type: 'audioTrack',\n      label: t('audioTrack'),\n      isSelected: selectedOption === 'audioTrack',\n      onSelection: options.updateAudioTrack,\n      onMenuOptionClick: () => setSelectedOption('audioTrack'),\n      options: options.optionsState.map((track) => ({\n        isSelected: options.activeVideo?.videoUrl === track.videoUrl,\n        label: track.videoLabel,\n        track,\n      })),\n    },\n    hasTranscripts && {\n      type: 'transcriptTrack',\n      label: t('transcript'),\n      isSelected: selectedOption === 'transcriptTrack',\n      onSelection: options.updateTranscript,\n      onMenuOptionClick: () => setSelectedOption('transcriptTrack'),\n      options: [\n        {\n          isSelected: !options.playerState.activeTranscript,\n          label: t('off'),\n          track: null,\n        },\n        ...transcriptOptions.map((track) => ({\n          isSelected: options.playerState.activeTranscript?.src === track.src,\n          label: track.label,\n          track,\n        })),\n      ],\n    },\n  ].filter(Boolean) as SelectOption[];\n\n  return {\n    ...options.menuProps,\n    goToMainMenu,\n    menuOptions,\n  };\n}\n","import { useRef } from 'react';\nimport { useTranslation } from 'next-i18next';\nimport { useEventListener } from 'usehooks-ts';\nimport classnames from 'classnames';\nimport { ControlButton } from './video-player.control-button';\nimport { ControlIcon } from './video-player.control-icon';\nimport { SettingsMenu } from './video-player.settings-menu';\nimport { VolumeSlider } from './video-player.volume-slider';\nimport type { useVideoPlayer } from './hooks/use-video-player';\nimport { getKeyDownNavigation } from '@dx-ui/utilities-accessibility';\nimport { getClasses } from './util/classes';\n\nexport type Track = {\n  type: StringWithAutocompleteOptions<'captionTrack' | 'transcriptTrack' | 'audioTrack'>;\n  url: string;\n  label: string;\n  language: string;\n};\n\nexport type BaseVideoTrack = {\n  videoGroup?: 'standard' | 'extended';\n  videoLabel?: string;\n  videoName?: string;\n  videoUrl: string;\n  isMuted?: boolean;\n  altText?: string;\n  captionTracks?: Track[];\n  transcriptTracks?: Track[];\n};\n\nexport type TrackOption = HTMLTrackElement;\n\nexport type VideoTrack = Omit<BaseVideoTrack, 'captionTracks' | 'transcriptTracks'> & {\n  captionTracks: TrackOption[];\n  transcriptTracks: TrackOption[];\n};\n\nexport type VideoControlsProps = {\n  /** Used to help with positioning of the controls */\n  className?: string;\n  /** For color theming */\n  brandComponentTheme?: CmsBrandComponentTheme;\n  videoVariant?: 'cinemagraph';\n};\n\n/**\n * A set of video controls for internal video sources that includes pause/play, mute/unmute, and closed captions.\n *\n * This should generally be used with the `useVideoPlayer` hook from `@dx-ui/osc-video-player`.\n * The hook provides the necessary state and functions to control the video player.\n * Consumers can spread the props from the videoControlsProps returned from the hook.\n *\n * Accepts className to add your own placement and styles to the component.\n */\nexport function VideoControls(\n  props: ReturnType<typeof useVideoPlayer>['videoControlsProps'] & VideoControlsProps\n) {\n  const {\n    className,\n    brandComponentTheme,\n    controlsState,\n    playerState,\n    activeVideo,\n    optionsState,\n    toggleCaptions,\n    toggleMuteButton,\n    togglePlayButton,\n    settingsMenu,\n    updateCaption,\n    updateTranscript,\n    updateAudioTrack,\n    updateVolume,\n    videoVariant,\n    hasAudio,\n    videoElement,\n  } = props;\n  const { t } = useTranslation('osc-video-player');\n  const listRef = useRef<React.ElementRef<'ul'>>(null);\n  const hasCaptions = (activeVideo?.captionTracks || []).length > 0;\n  const hasMultipleCaptions = (activeVideo?.captionTracks || []).length > 1;\n  const hasTranscripts = (activeVideo?.transcriptTracks || []).length > 0;\n  const hasAudioDescriptions = optionsState.length > 1;\n  const hasSettings = hasMultipleCaptions || hasTranscripts || hasAudioDescriptions;\n  const isSettingsMenuOpen = settingsMenu?.isOpen;\n  const isCinemagraph = videoVariant === 'cinemagraph';\n\n  useEventListener(\n    'keydown',\n    (event) => {\n      const target = event.target as HTMLButtonElement;\n      if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n        if (!target?.id?.includes('slider-thumb')) {\n          event.preventDefault();\n          const elements = Array.from(listRef.current?.querySelectorAll('button') || []);\n          const onKeyDownNavigation = getKeyDownNavigation({ elements });\n          onKeyDownNavigation(event);\n        }\n      }\n    },\n    listRef\n  );\n\n  const pauseButtonLabel = isCinemagraph ? t('pauseAnimation') : t('pause');\n  const playButtonLabel = isCinemagraph ? t('playAnimation') : t('play');\n  return (\n    <div className={className} data-testid=\"video-controls\">\n      <ul\n        className={classnames(\n          'relative z-10 inline-flex divide-x divide-border bg-bg shadow-md motion-safe:transition-opacity rtl:divide-x-reverse',\n          getClasses({ brandComponentTheme }),\n          {\n            'opacity-100': controlsState.isVisible,\n            'opacity-0': !controlsState.isVisible,\n          }\n        )}\n        data-testid=\"testBackgroundCss\"\n        ref={listRef}\n      >\n        <ControlButton\n          aria-label={playerState.isPlaying ? pauseButtonLabel : playButtonLabel}\n          brandComponentTheme={brandComponentTheme}\n          onClick={togglePlayButton}\n          iconContent={\n            <>\n              <ControlIcon\n                brandComponentTheme={brandComponentTheme}\n                className={classnames({ hidden: !playerState.isPlaying })}\n                name=\"pause\"\n              />\n              <ControlIcon\n                brandComponentTheme={brandComponentTheme}\n                className={classnames({ hidden: playerState.isPlaying })}\n                name=\"play\"\n              />\n            </>\n          }\n        />\n        {hasAudio ? (\n          <ControlButton\n            aria-label={playerState.isMuted ? t('unmute') : t('mute')}\n            brandComponentTheme={brandComponentTheme}\n            onClick={toggleMuteButton}\n            wrapperClassName=\"group relative\"\n            iconContent={\n              <>\n                <ControlIcon\n                  brandComponentTheme={brandComponentTheme}\n                  className={classnames({ hidden: !playerState.isMuted })}\n                  name=\"sound-off\"\n                />\n                <ControlIcon\n                  brandComponentTheme={brandComponentTheme}\n                  className={classnames({ hidden: playerState.isMuted })}\n                  name=\"sound-on\"\n                />\n              </>\n            }\n          >\n            {!isSettingsMenuOpen ? (\n              <VolumeSlider\n                brandComponentTheme={brandComponentTheme}\n                playerState={playerState}\n                updateVolume={updateVolume}\n              />\n            ) : null}\n          </ControlButton>\n        ) : null}\n        {hasCaptions ? (\n          <ControlButton\n            aria-label={t('captions')}\n            aria-pressed={Boolean(playerState.activeCaptionTrack)}\n            brandComponentTheme={brandComponentTheme}\n            onClick={() => {\n              const currentTrack = playerState.activeCaptionTrack;\n              const firstTrack = activeVideo?.captionTracks?.[0] as HTMLTrackElement;\n              currentTrack ? toggleCaptions() : updateCaption(firstTrack);\n            }}\n            iconContent={\n              <>\n                <ControlIcon\n                  brandComponentTheme={brandComponentTheme}\n                  className={classnames({ hidden: !playerState.showCaptions })}\n                  variant=\"solid\"\n                  name=\"closed-captions\"\n                />\n                <ControlIcon\n                  brandComponentTheme={brandComponentTheme}\n                  className={classnames({ hidden: playerState.showCaptions })}\n                  name=\"closed-captions\"\n                />\n              </>\n            }\n          />\n        ) : null}\n        {hasSettings ? (\n          <SettingsMenu\n            brandComponentTheme={brandComponentTheme}\n            activeVideo={activeVideo}\n            optionsState={optionsState}\n            playerState={playerState}\n            updateAudioTrack={updateAudioTrack}\n            updateTranscript={updateTranscript}\n            updateCaption={updateCaption}\n            menuProps={settingsMenu}\n            videoElement={videoElement}\n          />\n        ) : null}\n      </ul>\n    </div>\n  );\n}\n","import classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\nimport type { useVideoPlayer } from './hooks/use-video-player';\nimport { isValidCue, getCueText } from './util/cue';\n\ntype VideoCaptionsProps = ReturnType<typeof useVideoPlayer>['videoCaptionProps'] &\n  Pick<VideoControlsProps, 'brandComponentTheme'> &\n  React.ComponentProps<'div'>;\n\nexport function VideoCaptions({\n  showCaptions,\n  activeCaptionTrack,\n  brandComponentTheme: _brandComponentTheme,\n  ...elementProps\n}: VideoCaptionsProps) {\n  const activeCues = showCaptions\n    ? (Array.from(activeCaptionTrack?.track.activeCues ?? []) as VTTCue[]).filter(isValidCue)\n    : [];\n\n  if (activeCues.length) {\n    return (\n      <div\n        {...elementProps}\n        className={classnames(\n          'flex flex-col items-center justify-center overflow-auto bg-text/75 p-2 text-text-inverse lg:text-lg',\n          elementProps.className\n        )}\n      >\n        {activeCues.map((cue) => (\n          <div\n            key={cue.text}\n            dangerouslySetInnerHTML={{\n              __html: getCueText(cue).html,\n            }}\n          />\n        ))}\n      </div>\n    );\n  }\n\n  return null;\n}\n","import type { VideoControlsProps } from './video-player.controls';\nimport type { useVideoPlayer } from './hooks/use-video-player';\nimport { useTranslation } from 'next-i18next';\nimport { Icon } from '@dx-ui/osc-icon';\nimport classnames from 'classnames';\nimport { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { useEventListener, useBoolean } from 'usehooks-ts';\nimport { getKeyDownNavigation } from '@dx-ui/utilities-accessibility';\nimport { BrandButton } from '@dx-ui/osc-brand-buttons';\nimport { isValidCue, getCueText, getCueId } from './util/cue';\nimport './video-player.css';\n\ntype PlayerTranscriptProps = ReturnType<typeof useVideoPlayer>['videoTranscriptProps'];\n\ntype VideoTranscriptProps = PlayerTranscriptProps &\n  Pick<VideoControlsProps, 'brandComponentTheme'> &\n  React.ComponentProps<'div'>;\n\ntype TranscriptProps = VideoTranscriptProps & {\n  activeTranscript: NonNullable<VideoTranscriptProps['activeTranscript']>;\n};\n\nexport function VideoTranscript(props: VideoTranscriptProps) {\n  return props.activeTranscript ? (\n    <Transcript {...props} activeTranscript={props.activeTranscript} />\n  ) : null;\n}\n\nfunction Transcript({\n  activeTranscript,\n  closeTranscript,\n  onCueSelect,\n  brandComponentTheme,\n  ...elementProps\n}: TranscriptProps) {\n  const { t } = useTranslation('osc-video-player');\n\n  return (\n    <div {...elementProps} className={classnames('relative bg-bg p-4', elementProps.className)}>\n      <div className=\"flex w-full items-center justify-between p-1\">\n        <h3 className=\"flex items-center pb-2 font-semibold\">\n          <Icon className=\"me-2\" name=\"transcripts\" />\n          {t('transcript')}\n        </h3>\n        <button aria-label={t('close')} type=\"button\" onClick={closeTranscript} autoFocus>\n          <Icon name=\"close\" />\n        </button>\n      </div>\n      <TranscriptList\n        key={activeTranscript.track.id}\n        activeTranscript={activeTranscript}\n        brandComponentTheme={brandComponentTheme}\n        closeTranscript={closeTranscript}\n        onCueSelect={onCueSelect}\n      />\n    </div>\n  );\n}\n\nfunction useCues(activeTranscript: TranscriptProps['activeTranscript']) {\n  const allCues = useMemo(() => getCues(activeTranscript), [activeTranscript]);\n  const [{ activeCues, lastActiveCue }, setActiveCues] = useState<{\n    activeCues: VTTCue[];\n    lastActiveCue: VTTCue;\n  }>(() => {\n    const activeCues = getActiveCues(activeTranscript);\n    const lastActiveCue = activeCues[activeCues.length - 1] || (allCues[0] as VTTCue);\n    return { activeCues, lastActiveCue };\n  });\n\n  function updateCues() {\n    setActiveCues((cueState) => {\n      const activeCues = getActiveCues(activeTranscript);\n      const activeCue = activeCues[activeCues.length - 1];\n      const lastActiveCue = activeCue || cueState.lastActiveCue;\n      return { activeCues, lastActiveCue };\n    });\n  }\n\n  return {\n    allCues,\n    activeCues,\n    lastActiveCue,\n    updateCues,\n  };\n}\n\nfunction TranscriptList({\n  activeTranscript,\n  closeTranscript,\n  onCueSelect,\n  brandComponentTheme,\n}: Pick<\n  TranscriptProps,\n  'activeTranscript' | 'closeTranscript' | 'onCueSelect' | 'brandComponentTheme'\n>) {\n  const { t } = useTranslation('osc-video-player');\n  const listRef = useRef<React.ElementRef<'ol'>>(null);\n  const { value: isSyncing, setTrue: startSync, setFalse: stopSync } = useBoolean(true);\n  const [focusedButton, setFocusedButton] = useState<HTMLButtonElement | null>(null);\n  const activeTranscriptRef = useRef(activeTranscript);\n  const { allCues, activeCues, lastActiveCue, updateCues } = useCues(activeTranscript);\n  const isAutoScrolling = useRef(activeCues.length > 0);\n\n  const onKeyDownNavigation = getKeyDownNavigation({\n    elements: getAllButtons(listRef),\n    onNextFocus: setFocusedButton,\n    onPreviousFocus: setFocusedButton,\n  });\n\n  const onScroll = () => {\n    if (!isAutoScrolling.current) {\n      stopSync();\n    }\n  };\n\n  const onScrollEnd = () => {\n    isAutoScrolling.current = false;\n  };\n\n  const scrollToActiveCue = useCallback(() => {\n    const firstActiveCue = activeCues[0];\n    if (listRef.current && firstActiveCue && isSyncing) {\n      const activeButton = getActiveButton(listRef, firstActiveCue);\n      if (activeButton && activeButton.parentElement) {\n        const { offsetTop, offsetHeight } = activeButton.parentElement;\n        const { marginTop, marginBottom } = window.getComputedStyle(activeButton.parentElement);\n        const itemMargins = parseInt(marginTop, 10) + parseInt(marginBottom, 10);\n        const itemOffset = offsetTop - offsetHeight - itemMargins;\n        const top = itemOffset - listRef.current.offsetTop;\n        isAutoScrolling.current = true;\n        listRef.current.scrollTo({ top });\n      }\n    }\n  }, [isSyncing, activeCues]);\n\n  const onKeyDown = (event: KeyboardEvent) => {\n    event.stopPropagation();\n    switch (event.key) {\n      case 'Escape':\n        closeTranscript();\n        break;\n      case 'ArrowUp':\n      case 'ArrowDown':\n        onKeyDownNavigation(event);\n        break;\n      default:\n        break;\n    }\n  };\n\n  useEffect(scrollToActiveCue, [scrollToActiveCue]);\n  useEventListener('cuechange', updateCues, activeTranscriptRef);\n  useEventListener('scroll', onScroll, listRef);\n  useEventListener('scrollend', onScrollEnd, listRef);\n  useEventListener('keydown', onKeyDown, listRef);\n\n  return (\n    <>\n      <ol\n        className={classnames(\n          'max-h-64 space-y-1 overflow-y-auto overscroll-contain motion-safe:scroll-smooth sm:max-h-80',\n          {\n            'pb-10': !isSyncing,\n          }\n        )}\n        ref={listRef}\n        data-testid=\"video-player-transcript-list\"\n      >\n        {allCues.map((cue) => {\n          const isActive = activeCues.includes(cue);\n          const isFocusable = focusedButton\n            ? focusedButton.dataset.id === cue.id\n            : lastActiveCue === cue;\n          return (\n            <TranscriptLine\n              isActive={isActive}\n              isFocusable={isFocusable}\n              cue={cue}\n              key={cue.id}\n              onCueSelect={onCueSelect}\n            />\n          );\n        })}\n      </ol>\n      {!isSyncing ? (\n        <BrandButton\n          className=\"absolute bottom-2 start-1/2 -translate-x-1/2 text-sm rtl:translate-x-1/2\"\n          onClick={() => {\n            isAutoScrolling.current = true;\n            startSync();\n            setFocusedButton(null);\n            getActiveButton(listRef, lastActiveCue)?.focus();\n          }}\n          label={t('sync')}\n          brandComponentTheme={brandComponentTheme}\n          variant=\"solid\"\n        />\n      ) : null}\n    </>\n  );\n}\n\nfunction TranscriptLine({\n  cue,\n  onCueSelect,\n  isActive,\n  isFocusable,\n}: Pick<TranscriptProps, 'onCueSelect'> & {\n  cue: VTTCue;\n  isActive: boolean;\n  isFocusable: boolean;\n}) {\n  const { t } = useTranslation('osc-video-player');\n  const { text, html } = getCueText(cue);\n  return (\n    <li className=\"p-1\">\n      <button\n        type=\"button\"\n        className={classnames('flex items-baseline gap-3 rounded-sm p-1 hover:bg-bg-alt', {\n          'bg-bg-alt': isActive,\n        })}\n        onClick={() => onCueSelect(cue)}\n        tabIndex={isFocusable ? 0 : -1}\n        data-id={cue.id}\n        aria-current={isActive ? 'time' : false}\n        aria-label={t('time', {\n          minutes: t('minute', { count: floorMinutes(cue.startTime) }),\n          seconds: t('second', { count: floorSeconds(cue.startTime) }),\n          text,\n        })}\n      >\n        <span className=\"font-semibold tabular-nums text-primary underline\">\n          {formatTime(cue.startTime)}\n        </span>\n        <span className=\"text-start\" dangerouslySetInnerHTML={{ __html: html }} />\n      </button>\n    </li>\n  );\n}\n\nfunction getActiveCues(activeTranscript: TranscriptProps['activeTranscript']) {\n  return (Array.from(activeTranscript.track.activeCues || []) as VTTCue[]).filter(isValidCue);\n}\n\nfunction getCues(activeTranscript: TranscriptProps['activeTranscript']) {\n  return (Array.from(activeTranscript.track.cues || []) as VTTCue[])\n    .filter(isValidCue)\n    .map((cue) => {\n      cue.id = cue.id || getCueId(cue);\n      return cue;\n    });\n}\n\nfunction formatTime(time: number) {\n  const minFmt = padTime(floorMinutes(time));\n  const secFmt = padTime(floorSeconds(time));\n  return `${minFmt}:${secFmt}`;\n}\n\nconst floorMinutes = (time: number) => Math.floor(time / 60);\nconst floorSeconds = (time: number) => Math.floor(time % 60);\nconst padTime = (time: number) => time.toString().padStart(2, '0');\n\nfunction getActiveButton(\n  listRef: React.RefObject<HTMLUListElement>,\n  cue: VTTCue\n): HTMLButtonElement | null {\n  return (listRef.current?.querySelector(`[data-id=\"${cue.id}\"]`) as HTMLButtonElement) || null;\n}\n\nfunction getAllButtons(listRef: React.RefObject<HTMLUListElement>): HTMLButtonElement[] {\n  return Array.from(listRef.current?.querySelectorAll('li > button') || []);\n}\n","import classnames from 'classnames';\nimport { useMemo } from 'react';\n\ntype UseVideoPlayerClassesProps = Partial<{ isLandscape: boolean }>;\n\nexport function useVideoPlayerClasses({ isLandscape = true }: UseVideoPlayerClassesProps) {\n  const baseControlsClasses = 'absolute -bottom-6 start-1/2 z-10 -translate-x-1/2';\n\n  return useMemo(\n    () => ({\n      captionClassNames: classnames(\n        'absolute inset-x-0 bottom-8 mx-auto w-[calc(100%-2rem)] sm:max-w-fit',\n        {\n          'sm:bottom-16 sm:mb-2': isLandscape,\n        }\n      ),\n      controlsClassNames: {\n        default: classnames(baseControlsClasses, 'rtl:translate-x-1/2', {\n          'sm:bottom-4 sm:start-4 sm:translate-x-0 sm:rtl:translate-x-0': isLandscape,\n        }),\n        center: classnames(baseControlsClasses, 'lg:bottom-4 rtl:translate-x-1/2'),\n        left: classnames(baseControlsClasses, 'lg:bottom-4 lg:start-4 lg:translate-x-0'),\n        right: classnames(\n          baseControlsClasses,\n          'lg:bottom-4 lg:end-4 lg:start-auto lg:translate-x-0'\n        ),\n      },\n      transcriptClassNames: 'container p-4 pt-8 sm:pt-4',\n      wrapperClassNames: 'relative',\n    }),\n    [isLandscape]\n  );\n}\n","import Head from 'next/head';\n\ntype Schema = {\n  name: string;\n  logo: string;\n  description: string;\n  thumbnailUrl: string;\n  uploadDate: string;\n  duration: string;\n  embedUrl: string;\n};\n\nexport type VideoPlayerMarkupProps = {\n  markupSchemas?: Schema[] | null;\n};\n\nexport const VideoPlayerMarkup: React.FC<VideoPlayerMarkupProps> = ({ markupSchemas }) => {\n  return markupSchemas?.map(\n    ({ name, logo, description, thumbnailUrl, uploadDate, duration, embedUrl }) => (\n      <Head key={name}>\n        <script\n          data-testid=\"video-markup-schema\"\n          type=\"application/ld+json\"\n          dangerouslySetInnerHTML={{\n            __html: JSON.stringify({\n              '@context': 'http://schema.org',\n              '@type': 'VideoObject',\n              name,\n              logo,\n              description,\n              thumbnailUrl,\n              uploadDate,\n              duration,\n              embedUrl,\n            }),\n          }}\n        />\n      </Head>\n    )\n  );\n};\n","import { useRef } from 'react';\nimport classnames from 'classnames';\nimport { useVideoPlayer } from './hooks/use-video-player';\nimport { Video } from './video-player.player';\nimport { VideoControls } from './video-player.controls';\nimport { VideoCaptions } from './video-player.captions';\nimport { VideoTranscript } from './video-player.transcripts';\nimport { useVideoPlayerClasses } from './hooks/use-video-player-classnames';\nimport { VideoPlayerMarkup } from './video-player.markup';\n\ntype HookProps = Parameters<typeof useVideoPlayer>[0];\ntype VideoProps = Omit<React.ComponentProps<typeof Video>, 'videoElement' | 'isAutoPlay'>;\ntype CaptionProps = Pick<React.ComponentProps<typeof VideoCaptions>, 'className'>;\ntype TranscriptProps = Pick<React.ComponentProps<typeof VideoTranscript>, 'className'>;\ntype ControlsProps = Pick<React.ComponentProps<typeof VideoControls>, 'className' | 'videoVariant'>;\ntype Orientation = 'portrait' | 'landscape';\n\ntype VideoPlayerProps = HookProps &\n  VideoProps &\n  Partial<{\n    brandComponentTheme: CmsBrandComponentTheme;\n    videoCaptionsProps: CaptionProps;\n    videoControlsProps: ControlsProps;\n    videoTranscriptProps: TranscriptProps;\n    wrapperClassName: React.ComponentProps<'div'>['className'];\n    orientation: Orientation;\n    altText: string | undefined;\n  }> & {\n    markupSchemas?: React.ComponentProps<typeof VideoPlayerMarkup>['markupSchemas'];\n  };\n\n/**\n * Native video player that composes a number of components to render a video with\n * support for closed captions, audio descriptions, and transcripts.\n *\n * @note Does not support ABS (Adaptive bitrate streaming).\n */\nexport function VideoPlayer({\n  videoCaptionsProps,\n  videoControlsProps,\n  videoTranscriptProps,\n  audioTracks,\n  captionTracks,\n  transcriptTracks,\n  brandComponentTheme,\n  videoGroup = 'standard',\n  videoLabel,\n  videoName,\n  wrapperClassName,\n  orientation = 'landscape',\n  markupSchemas,\n  hasAudio,\n  ...videoProps\n}: VideoPlayerProps) {\n  const wrapperElement = useRef<React.ElementRef<'div'>>(null);\n  const isLandscape = orientation === 'landscape';\n  const playerClasses = useVideoPlayerClasses({ isLandscape });\n  const playerProps = useVideoPlayer({\n    ...videoProps,\n    hasAudio,\n    videoGroup,\n    videoLabel,\n    videoName,\n    wrapperElement,\n    audioTracks,\n    captionTracks,\n    transcriptTracks,\n  });\n\n  return (\n    <>\n      <div\n        className={classnames(playerClasses.wrapperClassNames, wrapperClassName)}\n        ref={wrapperElement}\n      >\n        <Video {...videoProps} {...playerProps.videoProps} />\n        <VideoCaptions\n          {...videoCaptionsProps}\n          {...playerProps.videoCaptionProps}\n          brandComponentTheme={brandComponentTheme}\n          className={classnames(playerClasses.captionClassNames, videoCaptionsProps?.className)}\n        />\n        <VideoControls\n          {...videoControlsProps}\n          {...playerProps.videoControlsProps}\n          brandComponentTheme={brandComponentTheme}\n          className={classnames(\n            playerClasses.controlsClassNames['default'],\n            videoControlsProps?.className\n          )}\n        />\n      </div>\n      <VideoTranscript\n        {...playerProps.videoTranscriptProps}\n        brandComponentTheme={brandComponentTheme}\n        className={classnames(playerClasses.transcriptClassNames, videoTranscriptProps?.className)}\n      />\n      <VideoPlayerMarkup markupSchemas={markupSchemas} />\n    </>\n  );\n}\n","import type { Multimedia as AwardMultimedia } from 'dx-shared-schema/dist/types/couchbase/award';\nimport type { Multimedia as BrandMultimedia } from 'dx-shared-schema/dist/types/couchbase/brand';\nimport type { Multimedia as EventMultimedia } from 'dx-shared-schema/dist/types/couchbase/event';\nimport type { Multimedia as PartnerMultimedia } from 'dx-shared-schema/dist/types/couchbase/partner';\nimport type { Multimedia as LocationMultimedia } from 'dx-shared-schema/dist/types/couchbase/location';\nimport type { Multimedia as PlaceMultimedia } from 'dx-shared-schema/dist/types/couchbase/place';\nimport type { Multimedia as StoryMultimedia } from 'dx-shared-schema/dist/types/couchbase/story';\nimport type { VideoPlayer } from './video-player';\nimport type { VideoPlayerMarkup } from './video-player.markup';\nimport type { VideoPlayerProps } from './hooks/use-video-player';\nimport { env } from '@dx-ui/framework-env';\nimport groupBy from 'lodash/groupBy';\n\ntype AllMultimedia =\n  | AwardMultimedia\n  | BrandMultimedia\n  | EventMultimedia\n  | PartnerMultimedia\n  | LocationMultimedia\n  | PlaceMultimedia\n  | StoryMultimedia;\n\ntype Metadata = AllMultimedia['multimediaMetadata'][number];\n\n// NOTE: Re-construct these types to resolve the incompatible types between dx-shared-schema and Core+ types\nexport type Multimedia = Omit<AllMultimedia, 'multimediaMetadata' | 'orientation'> & {\n  multimediaMetadata: MultimediaMetadatum[];\n  orientation: AllMultimedia['orientation'];\n};\n\nexport type MultimediaMetadatum = Omit<Metadata, 'language' | 'type'> & {\n  language: string;\n  type: Metadata['type'];\n};\n\ntype MappedPage = { brandCode?: string; pathname?: string };\n\nexport function mapMultimediaListToVideoProps({\n  multimedia,\n  mappedPage,\n  groupIdentifier = multimedia[0]?.groupIdentifier || null,\n}: {\n  multimedia: Multimedia[];\n  mappedPage: MappedPage;\n  groupIdentifier?: string | null;\n}): React.ComponentProps<typeof VideoPlayer> {\n  const [firstVideo, ...additionalVideos] = groupMultimedia(multimedia, groupIdentifier);\n  const videoTrack = mapMultimediaToVideoTrack(firstVideo);\n\n  const markupSchemas: Required<React.ComponentProps<typeof VideoPlayerMarkup>['markupSchemas']> =\n    multimedia\n      .filter((multimedia) => multimedia.description)\n      .map((multimedia) =>\n        mapVideoMarkup(multimedia as ValidatedVideoMarkupMultimedia, mappedPage)\n      );\n\n  return {\n    ...videoTrack,\n    audioTracks: additionalVideos.map(mapMultimediaToVideoTrack),\n    isAutoPlay: firstVideo.videoAutoPlay,\n    isMuted: firstVideo.noAudio,\n    altText: firstVideo.altText ?? '',\n    orientation: firstVideo.orientation,\n    posterImageUrl: firstVideo.posterImageUrl,\n    markupSchemas,\n  };\n}\n\nfunction mapMultimediaToVideoTrack(multimedia: Multimedia): Omit<VideoPlayerProps, 'audioTracks'> {\n  return {\n    videoName: multimedia.videoName,\n    videoUrl: multimedia.videoUrl,\n    videoGroup: getVideoGroup(multimedia),\n    videoLabel: multimedia.audioTrackLabel || multimedia.alternativeVideoLabel,\n    //description field is an interim measure. Here is long term solution https://jira.hilton.com/browse/NHCBP-5914\n    ...(multimedia.description && { altText: multimedia.description }),\n    captionTracks: filterByTrackType(multimedia.multimediaMetadata, 'captionTrack'),\n    captionData: mapCaptionData(multimedia.captionLink),\n    transcriptTracks: filterByTrackType(multimedia.multimediaMetadata, 'transcriptTrack'),\n  };\n}\n\nfunction filterByTrackType(\n  multimediaMetadata: MultimediaMetadatum[],\n  type: MultimediaMetadatum['type']\n) {\n  return multimediaMetadata.filter((metadata) => metadata.type === type);\n}\n\nfunction groupMultimedia(multimediaList: Multimedia[], groupIdentifier: string | null) {\n  return (\n    groupBy(multimediaList, (multimedia) => multimedia.groupIdentifier || null)[\n      String(groupIdentifier)\n    ] || []\n  ).toSorted((a, b) => Number(b.primaryVideo ?? 0) - Number(a.primaryVideo ?? 0)) as [\n    Multimedia,\n    ...Multimedia[]\n  ];\n}\n\nfunction getVideoGroup(multimedia: Multimedia): NonNullable<VideoPlayerProps['videoGroup']> {\n  const isExtended = Boolean(multimedia.extended || multimedia.extendedAudioDescription);\n  return isExtended ? 'extended' : 'standard';\n}\n\ntype NoUndefinedField<T> = { [P in keyof T]: Exclude<T[P], null | undefined> };\n\ntype ValidatedVideoMarkupMultimedia = NoUndefinedField<\n  Required<\n    Pick<\n      Multimedia,\n      'videoName' | 'description' | 'posterImageUrl' | 'uploadDatetime' | 'videoDuration'\n    >\n  >\n>;\n\nfunction mapVideoMarkup(multimedia: ValidatedVideoMarkupMultimedia, mappedPage: MappedPage) {\n  const { brandCode = 'WW', pathname = '' } = mappedPage;\n  const baseUrl = env('OHW_BASE_URL', 'https://www.hilton.com');\n  return {\n    name: multimedia.videoName,\n    logo: new URL(`/modules/assets/svgs/logos/${brandCode}.svg`, baseUrl).toString(),\n    description: multimedia.description,\n    thumbnailUrl: multimedia.posterImageUrl,\n    uploadDate: multimedia.uploadDatetime.toString(),\n    duration: multimedia.videoDuration,\n    embedUrl: new URL(pathname, baseUrl).toString(),\n  };\n}\n\nfunction mapCaptionData(\n  captionLink: AllMultimedia['captionLink']\n): VideoPlayerProps['captionData'] {\n  if (captionLink) {\n    return {\n      caption: captionLink.linkLabel,\n      captionLink: captionLink.linkUrl,\n      captionLinkTarget: captionLink.isNewWindow ? '_blank' : undefined,\n    };\n  }\n  return undefined;\n}\n","export * from './video-player';\nexport * from './video-player.player';\nexport * from './video-player.captions';\nexport * from './video-player.controls';\nexport * from './video-player.transcripts';\nexport * from './hooks/use-video-player';\nexport * from './hooks/use-video-player-classnames';\nexport * from './video-player.markup';\nexport * from './video-player.mapper';\nexport * from './util/event-emitter';\n","export * from './lib';\n","import classnames from 'classnames';\nimport { Icon } from '@dx-ui/osc-icon';\nimport type { IconProps } from '@dx-ui/osc-icon';\n\nexport function BrandIcon(props: IconProps) {\n  return (\n    <span className=\"inline-block self-center\">\n      <Icon {...props} className={classnames(props.className)} />\n    </span>\n  );\n}\n","import classnames from 'classnames';\n\nexport type Variant = 'solid' | 'outline';\n\nexport type ClassNamesArgs = Partial<{\n  brandComponentTheme: CmsBrandComponentTheme;\n  variant: Variant;\n}>;\n\nexport function getClassnames({ brandComponentTheme: theme, variant }: ClassNamesArgs) {\n  const isDark = theme === 'dark';\n  const isLight = theme === 'light';\n  const isSolid = variant === 'solid';\n  const isOutline = variant === 'outline';\n  return classnames('btn-brand motion-safe:transition', {\n    'btn-brand-solid': isSolid && !isLight && !isDark,\n    'btn-brand-outline': isOutline && !isLight && !isDark,\n    'btn-brand-dark': isDark && !isSolid && !isOutline,\n    'btn-brand-dark-outline': isDark && isOutline,\n    'btn-brand-dark-solid': isDark && isSolid,\n    'btn-brand-light': isLight && !isSolid && !isOutline,\n    'btn-brand-light-outline': isLight && isOutline,\n    'btn-brand-light-solid': isLight && isSolid,\n  });\n}\n","import type { Icon } from '@dx-ui/osc-icon';\nimport { Link } from '@dx-ui/osc-link';\nimport cx from 'classnames';\nimport type { MouseEvent } from 'react';\nimport { forwardRef } from 'react';\nimport { BrandIcon } from './brand-icon';\nimport type { Variant } from './util/button';\nimport { getClassnames } from './util/button';\n\nexport interface BrandLinkProps extends Omit<Link, 'label'> {\n  label: React.ReactNode;\n  /** Add Icon props to buttons with Icons */\n  iconProps?: React.ComponentProps<typeof Icon>;\n  /** Brand color themes, \"light\" | \"dark\" */\n  brandComponentTheme?: CmsBrandComponentTheme;\n  /** Button variant */\n  variant?: Variant;\n  /** OnClick callback */\n  onClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\n  metricsOnClick?: () => void;\n  /** Icon alignment, \"before\" | \"after\" */\n  iconAlign?: 'before' | 'after';\n}\n\nexport const BrandLink = forwardRef<HTMLAnchorElement, BrandLinkProps>(\n  (\n    {\n      label,\n      iconProps,\n      brandComponentTheme,\n      variant,\n      onClick,\n      metricsOnClick,\n      iconAlign = 'before',\n      ...linkProps\n    },\n    ref\n  ) => (\n    <Link\n      {...linkProps}\n      ref={ref}\n      anchorClassName={cx(\n        linkProps.anchorClassName,\n        getClassnames({ brandComponentTheme, variant })\n      )}\n      className={cx('gap-2', linkProps.className)}\n      isNewWindow={linkProps.isNewWindow || false}\n      url={linkProps.url}\n      showNewWindowIcon={(linkProps.showNewWindowIcon && linkProps.isNewWindow) || false}\n      underline={false}\n      data-testid=\"CTALinkE2ETest\"\n      onClick={(e) => {\n        onClick?.(e);\n        metricsOnClick?.();\n      }}\n    >\n      {iconAlign === 'before' && iconProps ? <BrandIcon {...iconProps} /> : null}\n      {label}\n      {iconAlign === 'after' && iconProps ? <BrandIcon {...iconProps} /> : null}\n    </Link>\n  )\n);\n\nBrandLink.displayName = 'BrandLink';\n\nexport default BrandLink;\n","import type { Icon } from '@dx-ui/osc-icon';\nimport cx from 'classnames';\nimport { forwardRef } from 'react';\nimport { BrandIcon } from './brand-icon';\nimport type { Variant } from './util/button';\nimport { getClassnames } from './util/button';\n\nexport interface BrandButtonProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'type'> {\n  /** Button label */\n  label?: React.ReactNode;\n  /** Add Icon props to buttons with Icons */\n  iconProps?: React.ComponentProps<typeof Icon>;\n  /** Brand color themes, \"light\" | \"dark\" */\n  brandComponentTheme?: CmsBrandComponentTheme;\n  /** Button variant */\n  variant?: Variant;\n  /** Icon alignment, \"before\" | \"after\" */\n  iconAlign?: 'before' | 'after';\n}\n\n/** This is a one stop shop for all brand button needs, to add style exceptions so all buttons stay up to day. Check out some of the exceptions on Curio and Waldorf. */\nexport const BrandButton = forwardRef<HTMLButtonElement, BrandButtonProps>(\n  (\n    { label, variant, iconProps, brandComponentTheme, iconAlign = 'before', ...buttonProps },\n    ref\n  ) => (\n    <button\n      type=\"button\"\n      {...buttonProps}\n      ref={ref}\n      className={cx(buttonProps.className, getClassnames({ brandComponentTheme, variant }))}\n      data-testid=\"CTAButtonE2ETest\"\n    >\n      <span className=\"flex gap-2\" data-testid=\"buttonContentParent\">\n        {iconAlign === 'before' && iconProps ? <BrandIcon {...iconProps} /> : null}\n        {label}\n        {iconAlign === 'after' && iconProps ? <BrandIcon {...iconProps} /> : null}\n      </span>\n    </button>\n  )\n);\n\nBrandButton.displayName = 'BrandButton';\n\nexport default BrandButton;\n","export * from './brand-link';\nexport * from './brand-button';\n","export * from './lib';\nexport type { Variant } from './lib/util/button';\n","import type { CSSProperties } from 'react';\nimport type { PossibleThumbs, TSlider } from './slider.types';\n\ntype UseInlineGradient = Pick<\n  TSlider<PossibleThumbs, PossibleThumbs>,\n  'disabled' | 'offColor' | 'onColor' | 'orientation' | 'brandComponentTheme' | 'variant'\n> & {\n  /**\n   * Array of 3-tuples. First value determines \"on\" or \"off\", 0 or 1, respectively.\n   * The remainder specify the `on` percentages in the gradient [0,10], [40,50].\n   */\n  values: Tuple<3, number>[];\n  /** Whether the language displayed on the page is right to left */\n  isRtlLanguage?: boolean;\n};\n\nexport const defaultColorVariables = {\n  offColor: 'color-border-form',\n  onColor: 'color-primary',\n  disabledColor: 'color-bg-disabled',\n} as const;\n\nexport const primaryColorVariables = {\n  offColor: 'color-primary',\n  onColor: 'color-primary',\n} as const;\n\nconst customColorVariables = {\n  offColor: 'slider-gradient-off-color',\n  onColor: 'slider-gradient-on-color',\n};\n\n/**\n * This hook is used specifically to return css for the horizontal gradient in the `Slider` component\n * using the colors from the [style guide](/?path=/docs/library-styles-colors--colors)\n *\n * > Ideally this inline styling could eventually be replaced with css vars via TW plugin.\n */\nexport const useInlineGradient = ({\n  values,\n  disabled = false,\n  offColor = defaultColorVariables.offColor,\n  onColor = defaultColorVariables.onColor,\n  isRtlLanguage = false,\n  orientation = 'horizontal',\n  variant = 'default',\n  brandComponentTheme,\n}: UseInlineGradient): CSSProperties => {\n  const direction = getDirection({ isRtlLanguage, orientation });\n  const { on: gradientOnColor, off: gradientOffColor } = getGradientColors({\n    brandComponentTheme,\n    variant,\n    offColor,\n    onColor,\n  });\n  const gradientDisabledColor = `var(--${defaultColorVariables.disabledColor})`;\n  const on = `rgb(${disabled ? gradientDisabledColor : gradientOnColor})`;\n  const off = `rgb(${disabled ? gradientDisabledColor : gradientOffColor})`;\n  const collect = values.reduce((prev, val) => {\n    /** first value determines if section is filled or not */\n    const filled = Boolean(val[0]);\n    return `${prev}, ${filled ? on : off} ${val[1]}%, ${filled ? on : off} ${val[2]}%`;\n  }, ``);\n  const background = `linear-gradient(to ${direction}${collect})`;\n  return { background };\n};\n\nfunction getDirection({\n  orientation,\n  isRtlLanguage,\n}: Pick<UseInlineGradient, 'orientation' | 'isRtlLanguage'>) {\n  if (orientation === 'vertical') {\n    return 'top';\n  }\n  if (isRtlLanguage) {\n    return 'left';\n  }\n  return 'right';\n}\n\nfunction getGradientColors({\n  brandComponentTheme,\n  variant,\n  onColor,\n  offColor,\n}: Pick<UseInlineGradient, 'brandComponentTheme' | 'variant' | 'offColor' | 'onColor'>) {\n  const themeSuffix = brandComponentTheme ? `-${brandComponentTheme}` : '';\n  const presetVariables = variant === 'primary' ? primaryColorVariables : { onColor, offColor };\n  return {\n    off: `var(--${customColorVariables.offColor}${themeSuffix}, var(--${presetVariables.offColor}))`,\n    on: `var(--${customColorVariables.onColor}${themeSuffix}, var(--${presetVariables.onColor}))`,\n  };\n}\n\nexport default useInlineGradient;\n","import { useIsomorphicLayoutEffect } from 'usehooks-ts';\nimport { useState, useCallback } from 'react';\n\nconst emptyRect = {\n  top: 0,\n  right: 0,\n  bottom: 0,\n  left: 0,\n  width: 0,\n  height: 0,\n} as DOMRect;\n\n/**\n * This custom useResizeObserver hook fixes an issue with label alignment for the slider in Safari.\n * @param initialRect partial DOMRect to be used before measure. defaults to empty rect\n * @todo add debounce or raf throttle\n */\nexport const useResizeObserver = (initialRect: Partial<DOMRect> = emptyRect) => {\n  const [element, setElement] = useState<HTMLElement | null>();\n  const [rect, setRect] = useState<DOMRect>(initialRect as Readonly<DOMRect>);\n\n  const ref = useCallback((e: HTMLElement | null) => {\n    setElement(e);\n  }, []);\n\n  useIsomorphicLayoutEffect(() => {\n    const ro = new ResizeObserver((entries) => {\n      setRect(entries[0] ? entries[0].contentRect : (initialRect as Readonly<DOMRect>));\n    });\n    if (element) {\n      ro.observe(element);\n    }\n    return () => {\n      element && ro.unobserve(element);\n      setRect(emptyRect);\n    };\n  }, [element, initialRect]);\n\n  return [ref, rect] as const;\n};\n","import { forwardRef, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useIsomorphicLayoutEffect } from 'usehooks-ts';\n// Using a custom useResizeObserver hook due to a label alignment issue with the slider in Safari when the useResizeObserver hook from usehooks-ts is used.\n// This is likely happening because of how on initial mount the bounding box size is not recorded.\nimport { useResizeObserver } from './use-resize-observer';\nimport cx from 'classnames';\nimport type { PossibleThumbs } from './slider.types';\n\ntype TThumbLabelProps<T extends PossibleThumbs, U extends T> = {\n  /** Whether the language is written right to left */\n  isRtlLanguage: boolean;\n  /** A tuple of labels corresponding to each input value, they are screen reader only labels and add additional context to the visible labels shown */\n  inputLabels: Tuple<U, string>;\n  /** array of labels */\n  labels: string[] | ReactNode[];\n  /** Whether the thumb label is displayed as text or a tooltip */\n  labelType: 'text' | 'tooltip';\n  /** array of normalized positions of label thumbs along the track */\n  valueRatios: number[];\n};\n\n// the thumb diameter\nexport const THUMB_W = 28;\n// the distance at which labels are joined with a LabelJoin\nexport const LABEL_JOIN_DISTANCE = 20;\nexport const JOIN_LABEL_LENGTH = 6;\n\nconst LABEL_JOIN_CENTER = LABEL_JOIN_DISTANCE / 2 + JOIN_LABEL_LENGTH / 2;\n\nconst tooltipClasses =\n  'relative h-max bg-bg text-text-alt text-left text-xs font-normal px-4 py-2.5 w-max border border-border';\n\nconst textClasses =\n  'absolute inline-block w-20 max-w-max -translate-x-2/4 whitespace-nowrap text-center font-bold';\n\nconst calculateLabelPositions = (\n  trackRect: DOMRect,\n  valueRatios: number[],\n  labelRefs: HTMLElement[],\n  isRtlLanguage: boolean\n) => {\n  const labelRects = labelRefs?.map((label) => label.getBoundingClientRect());\n  const xCoordinates = labelRects?.map((rect, i) => {\n    let x =\n      (trackRect?.width - THUMB_W) * (valueRatios[i] as number) + THUMB_W / 2 - rect?.width / 2;\n    if (x < trackRect?.left) {\n      x = 0;\n    } else if (x + rect?.width > trackRect?.right) {\n      x = trackRect?.right - rect?.width;\n    }\n    return isRtlLanguage ? -x : x;\n  });\n\n  if (isRtlLanguage) {\n    xCoordinates.reverse();\n  }\n\n  return { xCoordinates, labelRects };\n};\n\nconst adjustLabelOverlaps = (\n  xCoordinates: number[],\n  labelRects: DOMRect[],\n  trackRect: DOMRect,\n  isRtlLanguage: boolean\n) => {\n  const joinLabelXCoordinates = Array<number | null>(xCoordinates?.length).fill(null);\n\n  for (let i = 0; i < xCoordinates.length - 1; i++) {\n    const overlap =\n      (xCoordinates[i] as number) +\n      LABEL_JOIN_DISTANCE +\n      (labelRects[i] as DOMRect)?.width -\n      (xCoordinates[i + 1] as number);\n    if (overlap > 0) {\n      const limits = isRtlLanguage\n        ? {\n            left: -(trackRect.right - (labelRects[i] as DOMRect)?.width),\n            right: 0,\n            track: trackRect?.left,\n          }\n        : {\n            left: 0,\n            right: trackRect.right - (labelRects[i + 1] as DOMRect)?.width,\n            track: trackRect.right,\n          };\n\n      if ((xCoordinates[i] as number) - overlap / 2 < limits?.left) {\n        xCoordinates[i] = limits?.left;\n        xCoordinates[i + 1] =\n          (xCoordinates[i] as number) + (labelRects[i] as DOMRect)?.width + LABEL_JOIN_DISTANCE;\n      } else if (\n        (xCoordinates[i + 1] as number) + (labelRects[i + 1] as DOMRect)?.width + overlap / 2 >\n        limits.track\n      ) {\n        xCoordinates[i + 1] = limits.right;\n        xCoordinates[i] =\n          (xCoordinates[i + 1] as number) - (labelRects[i] as DOMRect)?.width - LABEL_JOIN_DISTANCE;\n      } else {\n        (xCoordinates[i] as number) -= overlap / 2;\n        (xCoordinates[i + 1] as number) += overlap / 2;\n      }\n      joinLabelXCoordinates[i] = isRtlLanguage\n        ? (xCoordinates[i] as number) + LABEL_JOIN_CENTER\n        : (xCoordinates[i + 1] as number) - LABEL_JOIN_CENTER;\n    }\n  }\n\n  for (let i = xCoordinates?.length - 1; i > 0; i--) {\n    const overlap =\n      (xCoordinates[i - 1] as number) +\n      (labelRects[i - 1] as DOMRect)?.width +\n      LABEL_JOIN_DISTANCE -\n      (xCoordinates[i] as number);\n    if (overlap > 0) {\n      (xCoordinates[i - 1] as number) -= overlap;\n      joinLabelXCoordinates[i - 1] = isRtlLanguage\n        ? (xCoordinates[i - 1] as number) + LABEL_JOIN_DISTANCE - JOIN_LABEL_LENGTH\n        : (xCoordinates[i] as number) - LABEL_JOIN_DISTANCE + JOIN_LABEL_LENGTH;\n    }\n  }\n\n  if (isRtlLanguage) {\n    const overlap = xCoordinates[0] as number;\n    const limit = -trackRect.right + (labelRects[labelRects?.length - 1] as DOMRect)?.width;\n    if (overlap < limit) {\n      xCoordinates[0] = limit;\n      for (let i = 0; i < xCoordinates?.length - 1; i++) {\n        if (joinLabelXCoordinates[i] !== null) {\n          joinLabelXCoordinates[i] =\n            (xCoordinates[i] as number) + LABEL_JOIN_DISTANCE - JOIN_LABEL_LENGTH;\n          xCoordinates[i + 1] =\n            (xCoordinates[i] as number) + (labelRects[i] as DOMRect)?.width + LABEL_JOIN_DISTANCE;\n        } else break;\n      }\n    }\n  } else {\n    const overlap = -(xCoordinates[0] as number);\n    if (overlap > 0) {\n      (xCoordinates[0] as number) += overlap;\n      for (let i = 0; i < xCoordinates?.length - 1; i++) {\n        if (joinLabelXCoordinates[i] !== null) {\n          joinLabelXCoordinates[i] = (joinLabelXCoordinates[i] as number) + overlap;\n          (xCoordinates[i + 1] as number) += overlap;\n        } else break;\n      }\n    }\n  }\n\n  return joinLabelXCoordinates;\n};\n\ntype LabelProps = {\n  /** Screenreader only label to give additional context to the visible labels */\n  additionalLabel?: string;\n  id: string;\n  /** Label content */\n  label: string | ReactNode;\n  /** The horizontal position for the label center correctly over the thumb */\n  labelPosition?: number;\n  /** Whether the label is shown as text or in a tooltip */\n  labelType: string;\n};\n\nfunction getTooltipTopOffset({ tooltipRect }: { tooltipRect?: DOMRect }) {\n  return tooltipRect ? tooltipRect?.height + 2 : 0;\n}\n\nconst Label = forwardRef<HTMLSpanElement, LabelProps>(\n  ({ additionalLabel, id, label, labelPosition, labelType }, forwardedRef) => {\n    return (\n      <span\n        id={id}\n        key={id}\n        ref={forwardedRef}\n        className={labelType === 'tooltip' ? tooltipClasses : textClasses}\n        style={{ transform: `translateX(${labelPosition}px` }}\n      >\n        <span aria-hidden=\"true\">{label}</span>\n        <span className=\"sr-only\">{additionalLabel}</span>\n      </span>\n    );\n  }\n);\n\nLabel.displayName = 'Label';\n\n/**\n * smart positioned text labels that position themselves as close to centered over their corresponding thumb positions\n * as possible. valueRatios[] are normalized thumb positions from 0 to 1. A layout effect and resize observer hook is used to prevent overlaps\n * @todo the layout effect is O(n) and could possibly be improved, and definitely cleaned up a bit\n */\nconst ThumbLabels = <T extends PossibleThumbs, U extends T>({\n  inputLabels,\n  isRtlLanguage,\n  labels,\n  labelType = 'text',\n  valueRatios,\n}: TThumbLabelProps<T, U>) => {\n  const [trackRef, trackRect] = useResizeObserver();\n  const [labelsX, setLabelsX] = useState<number[]>([]);\n  const labelRefs = useRef<HTMLElement[]>([]).current;\n  const [labelElementRects, setLabelRects] = useState<DOMRect[]>([]);\n  const [joinLabelXCoordinates, setJoinLabelXCoordinates] = useState<Array<number | null>>([]);\n  const [topOffsetState, setTopOffset] = useState<number>(0);\n\n  useIsomorphicLayoutEffect(() => {\n    const { xCoordinates, labelRects } = calculateLabelPositions(\n      trackRect,\n      valueRatios,\n      labelRefs,\n      isRtlLanguage\n    );\n    setLabelRects(labelRects);\n    const topOffset = getTooltipTopOffset({\n      tooltipRect: labelElementRects[0],\n    });\n    setTopOffset(topOffset);\n    const joinLabelXCoordinates = adjustLabelOverlaps(\n      xCoordinates,\n      labelRects,\n      trackRect,\n      isRtlLanguage\n    );\n    setJoinLabelXCoordinates(joinLabelXCoordinates);\n    setLabelsX(xCoordinates);\n  }, [trackRect, valueRatios, isRtlLanguage, topOffsetState, setTopOffset]);\n\n  return (\n    <span\n      ref={trackRef}\n      className={cx('absolute flex size-full justify-between', {\n        '-top-5': labelType === 'text',\n        '-z-1': labelType === 'tooltip',\n      })}\n      style={labelType === 'tooltip' ? { top: `-${topOffsetState}px` } : {}}\n    >\n      {labels?.map((label: ReactNode, i: number) => {\n        return (\n          <Label\n            // eslint-disable-next-line react/no-array-index-key\n            key={i}\n            id={`slider-thumb-label-${i}`}\n            label={label}\n            ref={(ref) => {\n              if (ref) {\n                labelRefs[i] = ref;\n              }\n            }}\n            labelPosition={labelsX[i]}\n            labelType={labelType}\n            additionalLabel={inputLabels[i]}\n          />\n        );\n      })}\n      {joinLabelXCoordinates\n        .filter((value: number | null) => value !== null)\n        .map((value: number | null, i: number) => (\n          <span\n            className=\"absolute inline-block text-center text-text-alt before:content-['-']\"\n            aria-hidden=\"true\"\n            // eslint-disable-next-line react/no-array-index-key\n            key={i}\n            style={{\n              transform: `translateX(${value}px)`,\n            }}\n          />\n        ))}\n    </span>\n  );\n};\n\nexport default ThumbLabels;\n","import { useRef } from 'react';\nimport * as SliderPrimitive from '@radix-ui/react-slider';\nimport type { PossibleThumbs, TSlider } from './slider.types';\nimport useInlineGradient, { defaultColorVariables } from './use-inline-gradient';\nimport cx from 'classnames';\nimport ThumbLabels from './thumb-labels';\nimport { isRtl } from '@dx-ui/utilities-get-language-direction';\n\n/**\n * A slider component that can have multiple thumbs. Each thumb can have a label and a value.\n * @see [Radix UI React Slider](https://www.radix-ui.com/primitives/docs/components/slider)\n */\nexport const Slider = <T extends PossibleThumbs, U extends T>({\n  disabled = false,\n  fillIndex = 0,\n  hiddenLegend = false,\n  inputLabels,\n  labelType = 'text',\n  language,\n  max = 1,\n  maxLabel,\n  min = 0,\n  minLabel,\n  offColor = defaultColorVariables.offColor,\n  onChange,\n  onColor = defaultColorVariables.onColor,\n  step = 1,\n  thumbLabelFn,\n  title,\n  values,\n  orientation = 'horizontal',\n  variant = 'default',\n  brandComponentTheme,\n}: TSlider<T, U>) => {\n  const isRtlLanguage = isRtl(language);\n  const isDefault = variant === 'default';\n  const isPrimary = variant === 'primary';\n  const isDark = brandComponentTheme === 'dark';\n  const isLight = brandComponentTheme === 'light';\n  const isVertical = orientation === 'vertical';\n  const isHorizontal = orientation === 'horizontal';\n  const thumbRef = useRef<HTMLSpanElement>(null);\n\n  const valueRatios = values.map((val) => {\n    /** set each input's ratio between min and max. always clamped between 0 and 1 */\n    let valueRatio = (val - min) / (max - min);\n    if (valueRatio < 0) valueRatio = 0;\n    else if (valueRatio > 1) valueRatio = 1;\n    return valueRatio;\n  });\n\n  /** collect fill areas for thumb track. alternates 'on', 'off' */\n  const areas = values.map((_, i) => i % 2);\n  /** add starting fill index. do we start with 'on' or 'off' */\n  const fillAreas: OneLonger<Tuple<U, number>> =\n    fillIndex === 1\n      ? ([fillIndex, ...areas] as OneLonger<Tuple<U, number>>)\n      : ([...areas, fillIndex] as OneLonger<Tuple<U, number>>);\n  /** list of gradient values for thu */\n  const gradValues = fillAreas.reduce((prev, filled, i) => {\n    prev.push([\n      filled,\n      i === 0 ? 0 : (valueRatios[i - 1] as number) * 100,\n      i === fillAreas.length - 1 ? 100 : (valueRatios[i] as number) * 100,\n    ]);\n    return prev;\n  }, [] as Array<Tuple<3, number>>);\n\n  const inlineGradProps = useInlineGradient({\n    values: gradValues,\n    disabled,\n    onColor,\n    offColor,\n    isRtlLanguage,\n    orientation,\n    brandComponentTheme,\n  });\n  const defaultLabelFn = (val: number) => `${val}`;\n  const thumbLabels = values.map(thumbLabelFn || defaultLabelFn) as Tuple<U, string>;\n  const labels = isRtlLanguage ? thumbLabels.reverse() : thumbLabels;\n  const WrapperElement = values.length > 1 ? 'fieldset' : 'div';\n  const TitleElement = values.length > 1 ? 'legend' : 'p';\n\n  return (\n    <WrapperElement\n      className={cx('px-0.5', {\n        'text-text-disabled': disabled,\n        'h-full py-4': isVertical,\n        'mb-8 pt-8': isHorizontal,\n      })}\n    >\n      <TitleElement\n        className={cx('label w-full', {\n          'mb-4': labelType === 'tooltip',\n          'sr-only': hiddenLegend,\n        })}\n      >\n        {title}\n      </TitleElement>\n      <div\n        className={cx({\n          'relative z-10': labelType === 'tooltip',\n          'h-full': isVertical,\n        })}\n      >\n        <SliderPrimitive.Root\n          className={cx('relative flex touch-none select-none', {\n            'h-full justify-center': isVertical,\n            'h-10 w-full items-center': isHorizontal,\n          })}\n          dir={isRtlLanguage ? 'rtl' : 'ltr'}\n          disabled={disabled}\n          max={max}\n          min={min}\n          minStepsBetweenThumbs={1}\n          name={title}\n          step={step}\n          onValueChange={onChange}\n          value={values}\n          orientation={orientation}\n        >\n          <SliderPrimitive.Track\n            className={cx('slider-track', {\n              'slider-track--vertical': isVertical,\n              'slider-track--horizontal': isHorizontal,\n            })}\n            data-testid=\"slider-track\"\n            style={{ ...inlineGradProps }}\n          >\n            <SliderPrimitive.Range className=\"slider-range\" />\n          </SliderPrimitive.Track>\n          {values.map((_value, i) => {\n            return (\n              <SliderPrimitive.Thumb\n                // eslint-disable-next-line react/no-array-index-key\n                key={i}\n                className={cx('group slider-thumb', {\n                  'slider-thumb--horizontal': isHorizontal,\n                  'slider-thumb--vertical': isVertical,\n                  'slider-thumb--disabled': disabled,\n                  'slider-thumb--default': isDefault,\n                  'slider-thumb--primary': isPrimary,\n                  'slider-thumb--dark': isDark,\n                  'slider-thumb--light': isLight,\n                })}\n                // radix applies this name attribute to the generated input field rendered\n                name={`slider-input-${i}`}\n                // this id is applied to the span radix renders as the thumb\n                id={`slider-thumb-${i}`}\n                aria-valuetext={labels[i]}\n                asChild\n                {...(isHorizontal && { 'aria-labelledby': `slider-thumb-label-${i}` })}\n                {...(isVertical && { 'aria-label': inputLabels[i] })}\n              >\n                <span ref={thumbRef} className=\"relative block\">\n                  {labelType === 'tooltip' ? (\n                    // Tooltip arrow styles to ensure the arrow follows the tooltip correctly\n                    <span\n                      className={cx(\n                        'relative block size-full',\n                        'after:absolute after:-top-4 after:left-[calc(50%_-_6px)] after:inline-block after:size-3 after:rotate-[-135deg] after:border-l after:border-t after:border-border after:bg-bg group-hover:after:top-[-19px] group-focus:after:top-[-19px]'\n                      )}\n                    />\n                  ) : null}\n                </span>\n              </SliderPrimitive.Thumb>\n            );\n          })}\n          {isHorizontal ? (\n            <ThumbLabels\n              labels={labels}\n              inputLabels={inputLabels}\n              valueRatios={valueRatios}\n              labelType={labelType}\n              isRtlLanguage={isRtlLanguage}\n            />\n          ) : null}\n        </SliderPrimitive.Root>\n      </div>\n      {minLabel && maxLabel ? (\n        <div className=\"relative flex justify-between\">\n          <div aria-hidden=\"true\">{minLabel}</div>\n          <div aria-hidden=\"true\">{maxLabel}</div>\n        </div>\n      ) : null}\n    </WrapperElement>\n  );\n};\n\nexport default Slider;\n","export * from './slider';\nexport * from './slider.types';\n","export * from './lib';\n","import type * as React from 'react';\nimport cx from 'classnames';\n\nexport type CaptionProps = {\n  /**\n   * Optional, provides the text content for the caption\n   */\n  caption?: string;\n  /**\n   * Optional link url\n   */\n  captionLink?: string;\n  /**\n   * Optional link target\n   */\n  captionLinkTarget?: string;\n  /**\n   * Optional metrics data\n   */\n  metricsOnClick?: () => void;\n  /*\n   * Optional alignment, default is end\n   */\n  align?: 'start' | 'end';\n};\n\n/**\n * Image caption is an optional prop that is consumed by other components, this cheese does not stand alone. Can be text only or a clickable link.\n */\nexport const Caption: React.FC<CaptionProps> = ({\n  caption,\n  captionLink,\n  captionLinkTarget,\n  align = 'end',\n  metricsOnClick,\n}) => {\n  const captionClasses =\n    'flex absolute top-0 items-center justify-center flex-auto text-xs mx-4 mt-4 mb-0 py-2 px-4 bg-bg-inverse text-text-overlay opacity-80 p-2 no-underline caption-main-text';\n\n  if (!caption && !captionLink) {\n    return null;\n  }\n\n  return (\n    <figcaption data-testid=\"caption-container\">\n      {captionLink ? (\n        <a\n          data-e2e=\"linkedCaption\"\n          data-testid=\"img-caption-link\"\n          className={cx(captionClasses, 'cursor-pointer', {\n            'end-0': align === 'end',\n            'start-0': align === 'start',\n          })}\n          href={captionLink}\n          onClick={() => metricsOnClick?.()}\n          target={captionLinkTarget}\n        >\n          {caption}\n        </a>\n      ) : (\n        <div\n          data-osc-product=\"osc-caption\"\n          className={cx(captionClasses, 'pointer-events-none cursor-default', {\n            'end-0': align === 'end',\n            'start-0': align === 'start',\n          })}\n        >\n          {caption}\n        </div>\n      )}\n    </figcaption>\n  );\n};\n","export * from './caption';\n","export * from './lib';\n","// extracted by mini-css-extract-plugin"],"names":["useAutoPlay","isAutoPlay","isClient","useIsClient","isReducedMotion","getIsReducedMotion","addTrackAsync","videoElement","track","trackElement","document","createElement","id","getTrackId","language","label","url","filter","Boolean","join","toLowerCase","srclang","kind","mode","dataset","type","append","Promise","onload","resolve","onerror","logWarning","removeChild","src","matchTracks","htmlTracks","videoTrack","some","htmlTrack","findTrack","tracks","activeTrack","find","getMetricsTrackName","formatName","trackEvent","eventName","videoName","window","_satellite","digitalData","set","name","replace","getTextColorClasses","brandComponentTheme","classnames","isLight","isDark","getBackgroundColorClasses","volumeConfig","min","max","step","lowestVolume","Math","floor","VolumeSlider","playerState","updateVolume","t","i18n","useTranslation","volume","isMuted","form","className","getClasses","Slider","title","hiddenLegend","inputLabels","thumbLabelFn","values","onChange","fillIndex","orientation","onColor","variant","isValidCue","cue","text","trim","length","getCueText","fragment","getCueAsHTML","textContent","html","XMLSerializer","serializeToString","VIDEO_EVENTS","PAUSE_OTHERS","PAUSE_SELF","VIDEO_UPDATE_EVENT","dispatchEvent","CustomEvent","detail","isPlaying","showCaptions","activeCaptionTrack","activeTranscript","activeVideoTrack","initialVolume","useVideoPlayer","props","useRef","internalPlayerId","useId","playerId","hasAudio","hookProps","setPlayerState","useState","videoPlayerSettings","JSON","parse","localStorage","getItem","defaultPlayerState","optionsState","useTrackQuery","options","current","hasCaptions","captionTracks","hasTranscripts","transcriptTracks","hasAudioTracks","audioTracks","defaultVideoTrack","baseVideoTrack","useBaseTracks","videoUrl","videoGroup","videoLabel","allTracks","useMemo","getFetchableTracks","Array","from","Map","flatMap","map","Object","item","data","videoTracks","useQuery","enabled","hasTracks","queryKey","queryFn","all","then","catch","error","controlsState","useFadeControls","wrapperElement","shouldControlsRemainVisible","elementRef","value","isVisible","setTrue","setVisible","setFalse","setHidden","useBoolean","timeout","hideControls","useCallback","clearTimeout","showControls","fadeControls","setTimeout","FADE_TIMEOUT_IN_MS","handleKeyup","contains","event","target","useEffect","useEventListener","settingsMenu","useMenu","menuId","popupButtonRef","popupMenuRef","isOpen","toggleMenu","setIsOpen","useToggle","closeMenu","activeVideo","getMetricsVideoName","playVideo","play","pauseVideo","pause","muteVideo","muted","unmuteVideo","togglePlayButton","dispatchVideoEvent","performAudioActions","setItem","stringify","state","updateTranscript","selectedTranscript","trackName","inActiveCaptionTracks","option","forEach","oncuechange","isPauseOthersEvent","isPauseSelfEvent","isPauseEvent","isOtherVideo","isSameVideo","shouldPauseSelf","videoProps","videoCaptionProps","videoTranscriptProps","closeTranscript","focus","onCueSelect","adjustedTime","startTime","CUE_BUFFER","currentTime","videoControlsProps","toggleMuteButton","toggleCaptions","updateCaption","isSingleCaption","selectedCaption","updateAudioTrack","selectedVideoTrack","findCaption","findTranscript","Video","posterImageUrl","videoId","captionData","figureClassName","videoClassName","rest","preventPreload","autoPlay","figure","div","video","data-testid","loop","playsInline","poster","ref","crossOrigin","preload","undefined","onError","e","Caption","ControlButton","forwardRef","children","iconContent","wrapperClassName","buttonProps","li","button","ControlIcon","iconProps","Icon","ControlMenu","maxHeight","setMaxHeight","wrapperRef","wrapperRect","getBoundingClientRect","menuRect","buttonRect","offset","bottom","buttonOffset","height","style","hidden","ControlList","listProps","ul","role","ControlItem","beforeSection","afterSection","span","SettingsMenu","menuOptions","useMenuOptions","selectedOption","setSelectedOption","captionOptions","transcriptOptions","abbr","isSelected","onSelection","onMenuOptionClick","menuProps","goToMainMenu","aria-label","aria-controls","aria-haspopup","aria-expanded","onClick","Menu","resetMenu","useEventListeners","focusButton","useOnClickOutside","stopPropagation","key","requestAnimationFrame","activeElement","activeList","querySelector","elements","querySelectorAll","getKeyDownNavigation","subOption","aria-checked","autoFocus","size","index","VideoControls","videoVariant","listRef","hasMultipleCaptions","hasAudioDescriptions","isSettingsMenuOpen","isCinemagraph","includes","preventDefault","pauseButtonLabel","playButtonLabel","aria-pressed","currentTrack","firstTrack","hasSettings","VideoCaptions","_brandComponentTheme","elementProps","activeCues","dangerouslySetInnerHTML","__html","VideoTranscript","Transcript","h3","TranscriptList","isSyncing","startSync","stopSync","focusedButton","setFocusedButton","activeTranscriptRef","allCues","lastActiveCue","updateCues","useCues","getCues","cues","getCueId","crypto","randomUUID","setActiveCues","getActiveCues","activeCue","cueState","isAutoScrolling","onKeyDownNavigation","getAllButtons","onNextFocus","onPreviousFocus","scrollToActiveCue","firstActiveCue","activeButton","getActiveButton","parentElement","offsetTop","offsetHeight","marginTop","marginBottom","getComputedStyle","top","parseInt","itemMargins","scrollTo","onScroll","onScrollEnd","onKeyDown","ol","isActive","isFocusable","TranscriptLine","BrandButton","tabIndex","data-id","aria-current","minutes","count","floorMinutes","seconds","floorSeconds","formatTime","minFmt","padTime","time","secFmt","toString","padStart","useVideoPlayerClasses","isLandscape","baseControlsClasses","captionClassNames","controlsClassNames","default","center","left","right","transcriptClassNames","wrapperClassNames","VideoPlayerMarkup","markupSchemas","logo","description","thumbnailUrl","uploadDate","duration","embedUrl","Head","script","VideoPlayer","videoCaptionsProps","playerClasses","playerProps","mapMultimediaListToVideoProps","multimedia","mappedPage","groupIdentifier","multimediaList","firstVideo","additionalVideos","groupMultimedia","groupBy","String","toSorted","a","b","Number","primaryVideo","mapMultimediaToVideoTrack","mapVideoMarkup","brandCode","pathname","baseUrl","env","URL","uploadDatetime","videoDuration","videoAutoPlay","noAudio","altText","isExtended","getVideoGroup","extended","extendedAudioDescription","audioTrackLabel","alternativeVideoLabel","filterByTrackType","multimediaMetadata","mapCaptionData","captionLink","caption","linkLabel","linkUrl","captionLinkTarget","isNewWindow","metadata","BrandIcon","getClassnames","theme","isSolid","isOutline","BrandLink","metricsOnClick","iconAlign","linkProps","Link","anchorClassName","cx","showNewWindowIcon","underline","displayName","defaultColorVariables","offColor","disabledColor","disabled","useInlineGradient","isRtlLanguage","direction","getDirection","on","gradientOnColor","off","gradientOffColor","getGradientColors","themeSuffix","presetVariables","primaryColorVariables","customColorVariables","gradientDisabledColor","collect","reduce","prev","val","filled","background","emptyRect","width","useResizeObserver","initialRect","element","setElement","rect","setRect","useIsomorphicLayoutEffect","ro","ResizeObserver","entries","contentRect","observe","unobserve","trackRect","valueRatios","labelRefs","labelRects","xCoordinates","i","x","THUMB_W","reverse","adjustLabelOverlaps","joinLabelXCoordinates","fill","overlap","LABEL_JOIN_DISTANCE","limits","LABEL_JOIN_CENTER","JOIN_LABEL_LENGTH","limit","Label","additionalLabel","labelPosition","labelType","forwardedRef","textClasses","transform","aria-hidden","ThumbLabels","labels","trackRef","labelsX","setLabelsX","labelElementRects","setLabelRects","setJoinLabelXCoordinates","topOffsetState","setTopOffset","calculateLabelPositions","getTooltipTopOffset","topOffset","tooltipRect","maxLabel","minLabel","isRtl","isDefault","isPrimary","isVertical","isHorizontal","thumbRef","valueRatio","areas","_","fillAreas","inlineGradProps","gradValues","push","thumbLabels","defaultLabelFn","WrapperElement","TitleElement","SliderPrimitive","dir","minStepsBetweenThumbs","onValueChange","_value","aria-valuetext","asChild","align","captionClasses","figcaption","data-e2e","href","data-osc-product"],"sourceRoot":"","ignoreList":[]}